Frank-Rainer Grahl 6 years ago
parent
commit
2552f9f86a
100 changed files with 24926 additions and 0 deletions
  1. 1 0
      comm-esr52/patches/series
  2. 631 0
      mozilla-esr52/patches/1295937-1.patch
  3. 858 0
      mozilla-esr52/patches/1295937-2.patch
  4. 41 0
      mozilla-esr52/patches/1310067.patch
  5. 156 0
      mozilla-esr52/patches/1316844-1.patch
  6. 184 0
      mozilla-esr52/patches/1316844-2.patch
  7. 262 0
      mozilla-esr52/patches/1316844-3.patch
  8. 80 0
      mozilla-esr52/patches/1316956.patch
  9. 261 0
      mozilla-esr52/patches/1316957.patch
  10. 109 0
      mozilla-esr52/patches/1317504-1.patch
  11. 103 0
      mozilla-esr52/patches/1317504-2.patch
  12. 87 0
      mozilla-esr52/patches/1317504-3.patch
  13. 288 0
      mozilla-esr52/patches/1317504-4.patch
  14. 121 0
      mozilla-esr52/patches/1317504-5.patch
  15. 4145 0
      mozilla-esr52/patches/1318143-1.patch
  16. 71 0
      mozilla-esr52/patches/1318143-2.patch
  17. 51 0
      mozilla-esr52/patches/1318189.patch
  18. 37 0
      mozilla-esr52/patches/1318798.patch
  19. 104 0
      mozilla-esr52/patches/1319959.patch
  20. 54 0
      mozilla-esr52/patches/1319971.patch
  21. 173 0
      mozilla-esr52/patches/1322025-1.patch
  22. 78 0
      mozilla-esr52/patches/1322025-2.patch
  23. 208 0
      mozilla-esr52/patches/1322025-3.patch
  24. 125 0
      mozilla-esr52/patches/1322025-4.patch
  25. 53 0
      mozilla-esr52/patches/1322025-5.patch
  26. 156 0
      mozilla-esr52/patches/1322025-6.patch
  27. 132 0
      mozilla-esr52/patches/1322025-7.patch
  28. 83 0
      mozilla-esr52/patches/1323901-1.patch
  29. 31 0
      mozilla-esr52/patches/1323901-2.patch
  30. 195 0
      mozilla-esr52/patches/1335666.patch
  31. 119 0
      mozilla-esr52/patches/1343781.patch
  32. 121 0
      mozilla-esr52/patches/1354510.patch
  33. 57 0
      mozilla-esr52/patches/1356493.patch
  34. 54 0
      mozilla-esr52/patches/1358215.patch
  35. 32 0
      mozilla-esr52/patches/1360631.patch
  36. 56 0
      mozilla-esr52/patches/1362303.patch
  37. 44 0
      mozilla-esr52/patches/1362872.patch
  38. 161 0
      mozilla-esr52/patches/1363585.patch
  39. 81 0
      mozilla-esr52/patches/1363811-1.patch
  40. 42 0
      mozilla-esr52/patches/1363811-2.patch
  41. 148 0
      mozilla-esr52/patches/1363811-3.patch
  42. 191 0
      mozilla-esr52/patches/1363811-4.patch
  43. 264 0
      mozilla-esr52/patches/1363811-5.patch
  44. 56 0
      mozilla-esr52/patches/1363811-6.patch
  45. 185 0
      mozilla-esr52/patches/1364137.patch
  46. 37 0
      mozilla-esr52/patches/1370865.patch
  47. 206 0
      mozilla-esr52/patches/1376057.patch
  48. 27 0
      mozilla-esr52/patches/1391547-DIASDK.patch
  49. 136 0
      mozilla-esr52/patches/1403945.patch
  50. 95 0
      mozilla-esr52/patches/1406380-385080.patch
  51. 35 0
      mozilla-esr52/patches/1407017-244f2649c736.patch
  52. 283 0
      mozilla-esr52/patches/1407678-vs2017toolchain-249.patch
  53. 30 0
      mozilla-esr52/patches/1408695-VS2017constexpr.patch
  54. 24 0
      mozilla-esr52/patches/1415470-part1-VS2017-a11y.patch
  55. 151 0
      mozilla-esr52/patches/1415470-part2-VS2017-version.patch
  56. 194 0
      mozilla-esr52/patches/1415470-part3-VS2017-C5038.patch
  57. 35 0
      mozilla-esr52/patches/1423694-VS2017-155.patch
  58. 86 0
      mozilla-esr52/patches/1484184.patch
  59. 48 0
      mozilla-esr52/patches/1484190.patch
  60. 86 0
      mozilla-esr52/patches/1485224-1.patch
  61. 47 0
      mozilla-esr52/patches/1485224-2.patch
  62. 124 0
      mozilla-esr52/patches/9999999-clang-osx.patch.patch
  63. 39 0
      mozilla-esr52/patches/9999999-psutil.patch
  64. 46 0
      mozilla-esr52/patches/9999999-search.patch
  65. 42 0
      mozilla-esr52/patches/9999999-vs2017-x86.patch
  66. 130 0
      mozilla-esr52/patches/9999999-xpsp3.patch
  67. 7541 0
      mozilla-esr52/patches/mozilla-esr52-push_355262.patch
  68. 32 0
      mozilla-esr52/patches/mozilla-esr52-push_355263.patch
  69. 92 0
      mozilla-esr52/patches/mozilla-esr52-push_355264.patch
  70. 31 0
      mozilla-esr52/patches/mozilla-esr52-push_355265.patch
  71. 103 0
      mozilla-esr52/patches/mozilla-esr52-push_355266.patch
  72. 131 0
      mozilla-esr52/patches/mozilla-esr52-push_355267.patch
  73. 616 0
      mozilla-esr52/patches/mozilla-esr52-push_355268.patch
  74. 848 0
      mozilla-esr52/patches/mozilla-esr52-push_355269.patch
  75. 247 0
      mozilla-esr52/patches/mozilla-esr52-push_355270.patch
  76. 212 0
      mozilla-esr52/patches/mozilla-esr52-push_355271.patch
  77. 690 0
      mozilla-esr52/patches/mozilla-esr52-push_355272.patch
  78. 168 0
      mozilla-esr52/patches/mozilla-esr52-push_355273.patch
  79. 36 0
      mozilla-esr52/patches/mozilla-esr52-push_356225.patch
  80. 85 0
      mozilla-esr52/patches/mozilla-esr52-push_356226.patch
  81. 32 0
      mozilla-esr52/patches/mozilla-esr52-push_356227.patch
  82. 93 0
      mozilla-esr52/patches/mozilla-esr52-push_356228.patch
  83. 127 0
      mozilla-esr52/patches/mozilla-esr52-push_356229.patch
  84. 71 0
      mozilla-esr52/patches/mozilla-esr52-push_356230.patch
  85. 31 0
      mozilla-esr52/patches/mozilla-esr52-push_356259.patch
  86. 106 0
      mozilla-esr52/patches/mozilla-esr52-push_356384.patch
  87. 31 0
      mozilla-esr52/patches/mozilla-esr52-push_356385.patch
  88. 51 0
      mozilla-esr52/patches/mozilla-esr52-push_356391.patch
  89. 37 0
      mozilla-esr52/patches/mozilla-esr52-push_356425.patch
  90. 32 0
      mozilla-esr52/patches/mozilla-esr52-push_356660.patch
  91. 94 0
      mozilla-esr52/patches/mozilla-esr52-push_356661.patch
  92. 67 0
      mozilla-esr52/patches/mozilla-esr60_449884.patch
  93. 50 0
      mozilla-esr52/patches/mozilla-esr60_449892.patch
  94. 188 0
      mozilla-esr52/patches/mozilla-esr60_449898.patch
  95. 174 0
      mozilla-esr52/patches/mozilla-esr60_449901.patch
  96. 32 0
      mozilla-esr52/patches/mozilla-esr60_449913.patch
  97. 113 0
      mozilla-esr52/patches/mozilla-esr60_449915.patch
  98. 112 0
      mozilla-esr52/patches/mozilla-esr60_449917.patch
  99. 49 0
      mozilla-esr52/patches/mozilla-esr60_449918.patch
  100. 214 0
      mozilla-esr52/patches/mozilla-esr60_449919.patch

+ 1 - 0
comm-esr52/patches/series

@@ -0,0 +1 @@
+ 

+ 631 - 0
mozilla-esr52/patches/1295937-1.patch

@@ -0,0 +1,631 @@
+
+# HG changeset patch
+# User Ted Mielczarek <ted@mielczarek.org>
+# Date 1479231429 18000
+# Node ID 165a160a0f689ab1e0143376d7ee8ce07c300fb6
+# Parent  95e32667262020fd3da24ad0450e7cda74cc6559
+bug 1295937 - Improvements to gyp_reader to handle NSS gyp files. r=glandium
+
+This patch contains a number of changes to the gyp_reader code:
+* Add three new flags to GYP_DIRS:
+** no_chromium, to skip forcing the includes/etc needed for chromium gyp files
+** no_unified, to force building all sources without unification
+** action_overrides, to pass scripts used when mapping gyp actions to moz.build GENERATED_FILES
+* Handle the flags mentioned above in read_from_gyp
+* Handle actions in gyp targets by mapping them to GENERATED_FILES, using scripts specified in the action_overrides flag. We don't try to handle the generic action case, we require special-casing for each action.
+* Handle a subset of copies in gyp targets by mapping them to EXPORTS, just enough to handle the use of them for NSS exports.
+* Handle shared_library and executable gyp targets
+* Handle gyp target dependencies/libraries as USE_LIBS/OS_LIBS
+* Handle generated source files
+* Handle .def files in sources by mapping them to SYMBOLS_FILE
+* Special-case some include_dirs:
+** Map `<(PRODUCT_DIR)/dist/` to $DIST/include (to handle include paths for NSS exports)
+** Map include_dirs starting with topobjdir to objdir-relative paths, to handle passing the NSPR include path to NSS
+* split /build/gyp.mozbuild into two parts, with gyp_base.mozbuild containing generic bits, and gyp.mozbuild containing chromium-specific bits
+
+
+MozReview-Commit-ID: FbDmlqDjRp4
+
+diff --git a/build/gyp.mozbuild b/build/gyp.mozbuild
+--- a/build/gyp.mozbuild
++++ b/build/gyp.mozbuild
+@@ -1,15 +1,17 @@
+ # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+ # vim: set filetype=python:
+ # This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+-gyp_vars = {
++include('gyp_base.mozbuild')
++
++gyp_vars.update({
+     'lsan': 0,
+     'asan': 0,
+     'build_with_mozilla': 1,
+     'build_with_chromium': 0,
+     'use_official_google_api_keys': 0,
+     'have_clock_monotonic': 1 if CONFIG['HAVE_CLOCK_MONOTONIC'] else 0,
+     'have_ethtool_cmd_speed_hi': 1 if CONFIG['MOZ_WEBRTC_HAVE_ETHTOOL_SPEED_HI'] else 0,
+     'include_alsa_audio': 1 if CONFIG['MOZ_ALSA'] else 0,
+@@ -64,61 +66,32 @@ gyp_vars = {
+     'include_g711': 1,
+     'include_opus': 1,
+     'include_g722': 1,
+     'include_ilbc': 0,
+     # We turn on ISAC because the AGC uses parts of it, and depend on the
+     # linker to throw away uneeded bits.
+     'include_isac': 1,
+     'include_pcm16b': 1,
+-}
+-
+-os = CONFIG['OS_TARGET']
++})
+ 
+-if os == 'WINNT':
+-    gyp_vars.update(
+-        MSVS_VERSION=CONFIG['_MSVS_VERSION'],
+-        MSVS_OS_BITS=64 if CONFIG['HAVE_64BIT_BUILD'] else 32,
+-    )
+-elif os == 'Android':
++if os == 'Android':
+     if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
+         gyp_vars['build_with_gonk'] = 1
+         gyp_vars['moz_widget_toolkit_gonk'] = 1
+         gyp_vars['opus_complexity'] = 1
+         if int(CONFIG['ANDROID_VERSION']) >= 18:
+           gyp_vars['moz_webrtc_omx'] = 1
+     else:
+         gyp_vars.update(
+             gtest_target_type='executable',
+             moz_webrtc_mediacodec=1,
+             android_toolchain=CONFIG.get('ANDROID_TOOLCHAIN', ''),
+         )
+ 
+-flavors = {
+-    'WINNT': 'win',
+-    'Android': 'linux' if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk' else 'android',
+-    'Linux': 'linux',
+-    'Darwin': 'mac' if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa' else 'ios',
+-    'SunOS': 'solaris',
+-    'GNU/kFreeBSD': 'freebsd',
+-    'DragonFly': 'dragonfly',
+-    'FreeBSD': 'freebsd',
+-    'NetBSD': 'netbsd',
+-    'OpenBSD': 'openbsd',
+-}
+-gyp_vars['OS'] = flavors.get(os)
+-
+-arches = {
+-    'x86_64': 'x64',
+-    'x86': 'ia32',
+-    'aarch64': 'arm64',
+-}
+-
+-gyp_vars['target_arch'] = arches.get(CONFIG['CPU_ARCH'], CONFIG['CPU_ARCH'])
+-
+ if CONFIG['ARM_ARCH']:
+     if int(CONFIG['ARM_ARCH']) < 7:
+         gyp_vars['armv7'] = 0
+         gyp_vars['arm_neon_optional'] = 0
+     elif os == 'Android':
+         gyp_vars['armv7'] = 1
+     else:
+         # CPU detection for ARM works on Android only.  armv7 always uses CPU
+diff --git a/build/gyp_base.mozbuild b/build/gyp_base.mozbuild
+new file mode 100644
+--- /dev/null
++++ b/build/gyp_base.mozbuild
+@@ -0,0 +1,38 @@
++# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
++# vim: set filetype=python:
++# This Source Code Form is subject to the terms of the Mozilla Public
++# License, v. 2.0. If a copy of the MPL was not distributed with this
++# file, You can obtain one at http://mozilla.org/MPL/2.0/.
++
++gyp_vars = {}
++
++os = CONFIG['OS_TARGET']
++
++if os == 'WINNT':
++    gyp_vars.update(
++        MSVS_VERSION=CONFIG['_MSVS_VERSION'],
++        MSVS_OS_BITS=64 if CONFIG['HAVE_64BIT_BUILD'] else 32,
++    )
++
++flavors = {
++    'WINNT': 'win',
++    'Android': 'linux' if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk' else 'android',
++    'Linux': 'linux',
++    'Darwin': 'mac' if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa' else 'ios',
++    'SunOS': 'solaris',
++    'GNU/kFreeBSD': 'freebsd',
++    'DragonFly': 'dragonfly',
++    'FreeBSD': 'freebsd',
++    'NetBSD': 'netbsd',
++    'OpenBSD': 'openbsd',
++}
++gyp_vars['OS'] = flavors.get(os)
++
++arches = {
++    'x86_64': 'x64',
++    'x86': 'ia32',
++    'aarch64': 'arm64',
++}
++
++gyp_vars['host_arch'] = arches.get(CONFIG['HOST_CPU_ARCH'], CONFIG['HOST_CPU_ARCH'])
++gyp_vars['target_arch'] = arches.get(CONFIG['CPU_ARCH'], CONFIG['CPU_ARCH'])
+diff --git a/build/moz.configure/init.configure b/build/moz.configure/init.configure
+--- a/build/moz.configure/init.configure
++++ b/build/moz.configure/init.configure
+@@ -515,16 +515,17 @@ def host_variables(host):
+     if host.kernel == 'kFreeBSD':
+         os_arch = 'GNU_kFreeBSD'
+     else:
+         os_arch = host.kernel
+     return namespace(
+         HOST_OS_ARCH=os_arch,
+     )
+ 
++set_config('HOST_CPU_ARCH', delayed_getattr(host, 'cpu'))
+ set_config('HOST_OS_ARCH', delayed_getattr(host_variables, 'HOST_OS_ARCH'))
+ add_old_configure_assignment('HOST_OS_ARCH',
+                              delayed_getattr(host_variables, 'HOST_OS_ARCH'))
+ 
+ @depends(target)
+ def target_is_windows(target):
+     if target.kernel == 'WINNT':
+         return True
+diff --git a/python/mozbuild/mozbuild/frontend/context.py b/python/mozbuild/mozbuild/frontend/context.py
+--- a/python/mozbuild/mozbuild/frontend/context.py
++++ b/python/mozbuild/mozbuild/frontend/context.py
+@@ -1619,34 +1619,43 @@ VARIABLES = {
+         files are elsehwere (jar.mn, for instance) and this state of affairs
+         is OK.
+         """),
+ 
+     'GYP_DIRS': (StrictOrderingOnAppendListWithFlagsFactory({
+             'variables': dict,
+             'input': unicode,
+             'sandbox_vars': dict,
++            'no_chromium': bool,
++            'no_unified': bool,
+             'non_unified_sources': StrictOrderingOnAppendList,
++            'action_overrides': dict,
+         }), list,
+         """Defines a list of object directories handled by gyp configurations.
+ 
+         Elements of this list give the relative object directory. For each
+         element of the list, GYP_DIRS may be accessed as a dictionary
+         (GYP_DIRS[foo]). The object this returns has attributes that need to be
+         set to further specify gyp processing:
+             - input, gives the path to the root gyp configuration file for that
+               object directory.
+             - variables, a dictionary containing variables and values to pass
+               to the gyp processor.
+             - sandbox_vars, a dictionary containing variables and values to
+               pass to the mozbuild processor on top of those derived from gyp
+               configuration.
++            - no_chromium, a boolean which if set to True disables some
++              special handling that emulates gyp_chromium.
++            - no_unified, a boolean which if set to True disables source
++              file unification entirely.
+             - non_unified_sources, a list containing sources files, relative to
+               the current moz.build, that should be excluded from source file
+               unification.
++            - action_overrides, a dict of action_name to values of the `script`
++              attribute to use for GENERATED_FILES for the specified action.
+ 
+         Typical use looks like:
+             GYP_DIRS += ['foo', 'bar']
+             GYP_DIRS['foo'].input = 'foo/foo.gyp'
+             GYP_DIRS['foo'].variables = {
+                 'foo': 'bar',
+                 (...)
+             }
+diff --git a/python/mozbuild/mozbuild/frontend/gyp_reader.py b/python/mozbuild/mozbuild/frontend/gyp_reader.py
+--- a/python/mozbuild/mozbuild/frontend/gyp_reader.py
++++ b/python/mozbuild/mozbuild/frontend/gyp_reader.py
+@@ -1,22 +1,24 @@
+ # This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import, unicode_literals
+ 
+ import gyp
++import gyp.msvs_emulation
+ import sys
+ import os
+ import types
+ import mozpack.path as mozpath
+ from mozpack.files import FileFinder
+ from .sandbox import alphabetical_sorted
+ from .context import (
++    ObjDirPath,
+     SourcePath,
+     TemplateContext,
+     VARIABLES,
+ )
+ from mozbuild.util import (
+     expand_variables,
+     List,
+     memoize,
+@@ -33,23 +35,30 @@ sys.modules['gyp.generator.mozbuild'] = 
+ #   sys.path.insert(0, os.path.join(chrome_src, 'tools', 'gyp', 'pylib'))
+ # We're not importing gyp_chromium, but we want both script_dir and
+ # chrome_src for the default includes, so go backwards from the pylib
+ # directory, which is the parent directory of gyp module.
+ chrome_src = mozpath.abspath(mozpath.join(mozpath.dirname(gyp.__file__),
+     '../../../..'))
+ script_dir = mozpath.join(chrome_src, 'build')
+ 
++
++def encode(value):
++    if isinstance(value, unicode):
++        return value.encode('utf-8')
++    return value
++
++
+ # Default variables gyp uses when evaluating gyp files.
+ generator_default_variables = {
+ }
+-for dirname in ['INTERMEDIATE_DIR', 'SHARED_INTERMEDIATE_DIR', 'PRODUCT_DIR',
+-                'LIB_DIR', 'SHARED_LIB_DIR']:
++for dirname in [b'INTERMEDIATE_DIR', b'SHARED_INTERMEDIATE_DIR', b'PRODUCT_DIR',
++                b'LIB_DIR', b'SHARED_LIB_DIR']:
+   # Some gyp steps fail if these are empty(!).
+-  generator_default_variables[dirname] = b'dir'
++  generator_default_variables[dirname] = b'$' + dirname
+ 
+ for unused in ['RULE_INPUT_PATH', 'RULE_INPUT_ROOT', 'RULE_INPUT_NAME',
+                'RULE_INPUT_DIRNAME', 'RULE_INPUT_EXT',
+                'EXECUTABLE_PREFIX', 'EXECUTABLE_SUFFIX',
+                'STATIC_LIB_PREFIX', 'STATIC_LIB_SUFFIX',
+                'SHARED_LIB_PREFIX', 'SHARED_LIB_SUFFIX',
+                'LINKER_SUPPORTS_ICF']:
+   generator_default_variables[unused] = b''
+@@ -63,56 +72,92 @@ class GypContext(TemplateContext):
+     relative to the topobjdir defined in the ConfigEnvironment.
+     """
+     def __init__(self, config, relobjdir):
+         self._relobjdir = relobjdir
+         TemplateContext.__init__(self, template='Gyp',
+             allowed_variables=VARIABLES, config=config)
+ 
+ 
+-def encode(value):
+-    if isinstance(value, unicode):
+-        return value.encode('utf-8')
+-    return value
++def handle_actions(actions, context, action_overrides):
++  idir = '$INTERMEDIATE_DIR/'
++  for action in actions:
++    name = action['action_name']
++    if name not in action_overrides:
++      raise RuntimeError('GYP action %s not listed in action_overrides' % name)
++    outputs = action['outputs']
++    if len(outputs) > 1:
++      raise NotImplementedError('GYP actions with more than one output not supported: %s' % name)
++    output = outputs[0]
++    if not output.startswith(idir):
++      raise NotImplementedError('GYP actions outputting to somewhere other than <(INTERMEDIATE_DIR) not supported: %s' % output)
++    output = output[len(idir):]
++    context['GENERATED_FILES'] += [output]
++    g = context['GENERATED_FILES'][output]
++    g.script = action_overrides[name]
++    g.inputs = action['inputs']
+ 
++def handle_copies(copies, context):
++  dist = '$PRODUCT_DIR/dist/'
++  for copy in copies:
++    dest = copy['destination']
++    if not dest.startswith(dist):
++      raise NotImplementedError('GYP copies to somewhere other than <(PRODUCT_DIR)/dist not supported: %s' % dest)
++    dest_paths = dest[len(dist):].split('/')
++    exports = context['EXPORTS']
++    while dest_paths:
++      exports = getattr(exports, dest_paths.pop(0))
++    exports += sorted(copy['files'], key=lambda x: x.lower())
+ 
+-def read_from_gyp(config, path, output, vars, non_unified_sources = set()):
++def read_from_gyp(config, path, output, vars, no_chromium, no_unified, action_overrides, non_unified_sources = set()):
+     """Read a gyp configuration and emits GypContexts for the backend to
+     process.
+ 
+     config is a ConfigEnvironment, path is the path to a root gyp configuration
+     file, output is the base path under which the objdir for the various gyp
+     dependencies will be, and vars a dict of variables to pass to the gyp
+     processor.
+     """
+ 
++    is_win = config.substs['OS_TARGET'] == 'WINNT'
++    is_msvc = bool(config.substs['_MSC_VER'])
+     # gyp expects plain str instead of unicode. The frontend code gives us
+     # unicode strings, so convert them.
+     path = encode(path)
+     str_vars = dict((name, encode(value)) for name, value in vars.items())
++    if is_msvc:
++        # This isn't actually used anywhere in this generator, but it's needed
++        # to override the registry detection of VC++ in gyp.
++        os.environ['GYP_MSVS_OVERRIDE_PATH'] = 'fake_path'
++        os.environ['GYP_MSVS_VERSION'] = config.substs['MSVS_VERSION']
+ 
+     params = {
+         b'parallel': False,
+         b'generator_flags': {},
+         b'build_files': [path],
+         b'root_targets': None,
+     }
+ 
+-    # Files that gyp_chromium always includes
+-    includes = [encode(mozpath.join(script_dir, 'common.gypi'))]
+-    finder = FileFinder(chrome_src, find_executables=False)
+-    includes.extend(encode(mozpath.join(chrome_src, name))
+-        for name, _ in finder.find('*/supplement.gypi'))
++    if no_chromium:
++      includes = []
++      depth = mozpath.dirname(path)
++    else:
++      depth = chrome_src
++      # Files that gyp_chromium always includes
++      includes = [encode(mozpath.join(script_dir, 'common.gypi'))]
++      finder = FileFinder(chrome_src, find_executables=False)
++      includes.extend(encode(mozpath.join(chrome_src, name))
++          for name, _ in finder.find('*/supplement.gypi'))
+ 
+     # Read the given gyp file and its dependencies.
+     generator, flat_list, targets, data = \
+         gyp.Load([path], format=b'mozbuild',
+             default_variables=str_vars,
+             includes=includes,
+-            depth=encode(chrome_src),
++            depth=encode(depth),
+             params=params)
+ 
+     # Process all targets from the given gyp files and its dependencies.
+     # The path given to AllTargets needs to use os.sep, while the frontend code
+     # gives us paths normalized with forward slash separator.
+     for target in gyp.common.AllTargets(flat_list, targets, path.replace(b'/', os.sep)):
+         build_file, target_name, toolset = gyp.common.ParseQualifiedTarget(target)
+ 
+@@ -141,70 +186,144 @@ def read_from_gyp(config, path, output, 
+ 
+         # Derive which gyp configuration to use based on MOZ_DEBUG.
+         c = 'Debug' if config.substs['MOZ_DEBUG'] else 'Release'
+         if c not in spec['configurations']:
+             raise RuntimeError('Missing %s gyp configuration for target %s '
+                                'in %s' % (c, target_name, build_file))
+         target_conf = spec['configurations'][c]
+ 
++        if 'actions' in spec:
++          handle_actions(spec['actions'], context, action_overrides)
++        if 'copies' in spec:
++          handle_copies(spec['copies'], context)
++
++        use_libs = []
++        libs = []
++        def add_deps(s):
++            for t in s.get('dependencies', []) + s.get('dependencies_original', []):
++                ty = targets[t]['type']
++                if ty in ('static_library', 'shared_library'):
++                    use_libs.append(targets[t]['target_name'])
++                # Manually expand out transitive dependencies--
++                # gyp won't do this for static libs or none targets.
++                if ty in ('static_library', 'none'):
++                    add_deps(targets[t])
++            libs.extend(spec.get('libraries', []))
++        #XXX: this sucks, but webrtc breaks with this right now because
++        # it builds a library called 'gtest' and we just get lucky
++        # that it isn't in USE_LIBS by that name anywhere.
++        if no_chromium:
++            add_deps(spec)
++
++        os_libs = []
++        for l in libs:
++          if l.startswith('-'):
++              os_libs.append(l)
++          elif l.endswith('.lib'):
++              os_libs.append(l[:-4])
++          elif l:
++            # For library names passed in from moz.build.
++            use_libs.append(os.path.basename(l))
++
+         if spec['type'] == 'none':
++          if not ('actions' in spec or 'copies' in spec):
+             continue
+-        elif spec['type'] == 'static_library':
++        elif spec['type'] in ('static_library', 'shared_library', 'executable'):
+             # Remove leading 'lib' from the target_name if any, and use as
+             # library name.
+             name = spec['target_name']
+-            if name.startswith('lib'):
+-                name = name[3:]
+-            # The context expects an unicode string.
+-            context['LIBRARY_NAME'] = name.decode('utf-8')
++            if spec['type'] in ('static_library', 'shared_library'):
++                if name.startswith('lib'):
++                    name = name[3:]
++                # The context expects an unicode string.
++                context['LIBRARY_NAME'] = name.decode('utf-8')
++            else:
++                context['PROGRAM'] = name.decode('utf-8')
++            if spec['type'] == 'shared_library':
++                context['FORCE_SHARED_LIB'] = True
++            elif spec['type'] == 'static_library' and spec.get('variables', {}).get('no_expand_libs', '0') == '1':
++                # PSM links a NSS static library, but our folded libnss
++                # doesn't actually export everything that all of the
++                # objects within would need, so that one library
++                # should be built as a real static library.
++                context['NO_EXPAND_LIBS'] = True
++            if use_libs:
++                context['USE_LIBS'] = sorted(use_libs, key=lambda s: s.lower())
++            if os_libs:
++                context['OS_LIBS'] = os_libs
+             # gyp files contain headers and asm sources in sources lists.
+             sources = []
+             unified_sources = []
+             extensions = set()
++            use_defines_in_asflags = False
+             for f in spec.get('sources', []):
+                 ext = mozpath.splitext(f)[-1]
+                 extensions.add(ext)
+-                s = SourcePath(context, f)
++                if f.startswith('$INTERMEDIATE_DIR/'):
++                  s = ObjDirPath(context, f.replace('$INTERMEDIATE_DIR/', '!'))
++                else:
++                  s = SourcePath(context, f)
+                 if ext == '.h':
+                     continue
+-                if ext != '.S' and s not in non_unified_sources:
++                if ext == '.def':
++                    context['SYMBOLS_FILE'] = s
++                elif ext != '.S' and not no_unified and s not in non_unified_sources:
+                     unified_sources.append(s)
+                 else:
+                     sources.append(s)
++                # The Mozilla build system doesn't use DEFINES for building
++                # ASFILES.
++                if ext == '.s':
++                    use_defines_in_asflags = True
+ 
+             # The context expects alphabetical order when adding sources
+             context['SOURCES'] = alphabetical_sorted(sources)
+             context['UNIFIED_SOURCES'] = alphabetical_sorted(unified_sources)
+ 
+-            for define in target_conf.get('defines', []):
++            defines = target_conf.get('defines', [])
++            if is_msvc and no_chromium:
++                msvs_settings = gyp.msvs_emulation.MsvsSettings(spec, {})
++                defines.extend(msvs_settings.GetComputedDefines(c))
++            for define in defines:
+                 if '=' in define:
+                     name, value = define.split('=', 1)
+                     context['DEFINES'][name] = value
+                 else:
+                     context['DEFINES'][define] = True
+ 
++            product_dir_dist = '$PRODUCT_DIR/dist/'
+             for include in target_conf.get('include_dirs', []):
+-                # moz.build expects all LOCAL_INCLUDES to exist, so ensure they do.
+-                #
+-                # NB: gyp files sometimes have actual absolute paths (e.g.
+-                # /usr/include32) and sometimes paths that moz.build considers
+-                # absolute, i.e. starting from topsrcdir. There's no good way
+-                # to tell them apart here, and the actual absolute paths are
+-                # likely bogus. In any event, actual absolute paths will be
+-                # filtered out by trying to find them in topsrcdir.
+-                if include.startswith('/'):
+-                    resolved = mozpath.abspath(mozpath.join(config.topsrcdir, include[1:]))
++                if include.startswith(product_dir_dist):
++                    # special-case includes of <(PRODUCT_DIR)/dist/ to match
++                    # handle_copies above. This is used for NSS' exports.
++                    include = '!/dist/include/' + include[len(product_dir_dist):]
++                elif include.startswith(config.topobjdir):
++                    # NSPR_INCLUDE_DIR gets passed into the NSS build this way.
++                    include = '!/' + mozpath.relpath(include, config.topobjdir)
+                 else:
+-                    resolved = mozpath.abspath(mozpath.join(mozpath.dirname(build_file), include))
+-                if not os.path.exists(resolved):
+-                    continue
++                  # moz.build expects all LOCAL_INCLUDES to exist, so ensure they do.
++                  #
++                  # NB: gyp files sometimes have actual absolute paths (e.g.
++                  # /usr/include32) and sometimes paths that moz.build considers
++                  # absolute, i.e. starting from topsrcdir. There's no good way
++                  # to tell them apart here, and the actual absolute paths are
++                  # likely bogus. In any event, actual absolute paths will be
++                  # filtered out by trying to find them in topsrcdir.
++                  if include.startswith('/'):
++                      resolved = mozpath.abspath(mozpath.join(config.topsrcdir, include[1:]))
++                  else:
++                      resolved = mozpath.abspath(mozpath.join(mozpath.dirname(build_file), include))
++                  if not os.path.exists(resolved):
++                      continue
+                 context['LOCAL_INCLUDES'] += [include]
+ 
+             context['ASFLAGS'] = target_conf.get('asflags_mozilla', [])
++            if use_defines_in_asflags and defines:
++                context['ASFLAGS'] += ['-D' + d for d in defines]
+             flags = target_conf.get('cflags_mozilla', [])
+             if flags:
+                 suffix_map = {
+                     '.c': 'CFLAGS',
+                     '.cpp': 'CXXFLAGS',
+                     '.cc': 'CXXFLAGS',
+                     '.m': 'CMFLAGS',
+                     '.mm': 'CMMFLAGS',
+@@ -222,27 +341,28 @@ def read_from_gyp(config, path, output, 
+                         if not f:
+                             continue
+                         # the result may be a string or a list.
+                         if isinstance(f, types.StringTypes):
+                             context[var].append(f)
+                         else:
+                             context[var].extend(f)
+         else:
+-            # Ignore other types than static_library because we don't have
++            # Ignore other types because we don't have
+             # anything using them, and we're not testing them. They can be
+             # added when that becomes necessary.
+             raise NotImplementedError('Unsupported gyp target type: %s' % spec['type'])
+ 
+-        # Add some features to all contexts. Put here in case LOCAL_INCLUDES
+-        # order matters.
+-        context['LOCAL_INCLUDES'] += [
+-            '!/ipc/ipdl/_ipdlheaders',
+-            '/ipc/chromium/src',
+-            '/ipc/glue',
+-        ]
+-        # These get set via VC project file settings for normal GYP builds.
+-        if config.substs['OS_TARGET'] == 'WINNT':
+-            context['DEFINES']['UNICODE'] = True
+-            context['DEFINES']['_UNICODE'] = True
++        if not no_chromium:
++          # Add some features to all contexts. Put here in case LOCAL_INCLUDES
++          # order matters.
++          context['LOCAL_INCLUDES'] += [
++              '!/ipc/ipdl/_ipdlheaders',
++              '/ipc/chromium/src',
++              '/ipc/glue',
++          ]
++          # These get set via VC project file settings for normal GYP builds.
++          if is_win:
++              context['DEFINES']['UNICODE'] = True
++              context['DEFINES']['_UNICODE'] = True
+         context['DISABLE_STL_WRAPPING'] = True
+ 
+         yield context
+diff --git a/python/mozbuild/mozbuild/frontend/reader.py b/python/mozbuild/mozbuild/frontend/reader.py
+--- a/python/mozbuild/mozbuild/frontend/reader.py
++++ b/python/mozbuild/mozbuild/frontend/reader.py
+@@ -1152,22 +1152,28 @@ class BuildReader(object):
+             from .gyp_reader import read_from_gyp
+             non_unified_sources = set()
+             for s in gyp_dir.non_unified_sources:
+                 source = SourcePath(context, s)
+                 if not self._finder.get(source.full_path):
+                     raise SandboxValidationError('Cannot find %s.' % source,
+                         context)
+                 non_unified_sources.add(source)
++            action_overrides = {}
++            for action, script in gyp_dir.action_overrides.iteritems():
++                action_overrides[action] = SourcePath(context, script)
+             time_start = time.time()
+             for gyp_context in read_from_gyp(context.config,
+                                              mozpath.join(curdir, gyp_dir.input),
+                                              mozpath.join(context.objdir,
+                                                           target_dir),
+                                              gyp_dir.variables,
++                                             gyp_dir.no_chromium,
++                                             gyp_dir.no_unified,
++                                             action_overrides,
+                                              non_unified_sources = non_unified_sources):
+                 gyp_context.update(gyp_dir.sandbox_vars)
+                 gyp_contexts.append(gyp_context)
+                 self._file_count += len(gyp_context.all_paths)
+             self._execution_time += time.time() - time_start
+ 
+         for gyp_context in gyp_contexts:
+             context['DIRS'].append(mozpath.relpath(gyp_context.objdir, context.objdir))
+

+ 858 - 0
mozilla-esr52/patches/1295937-2.patch

@@ -0,0 +1,858 @@
+
+# HG changeset patch
+# User Ted Mielczarek <ted@mielczarek.org>
+# Date 1478713029 18000
+# Node ID ee70776759bf296c951a9805d5b79169291be4d3
+# Parent  9297cbb433eb868d9672acce62026fb727e64565
+bug 1295937 - build NSS using gyp files. r=glandium
+
+MozReview-Commit-ID: Gm1PLWSJwbD
+
+diff --git a/build/autoconf/nspr-build.m4 b/build/autoconf/nspr-build.m4
+--- a/build/autoconf/nspr-build.m4
++++ b/build/autoconf/nspr-build.m4
+@@ -156,6 +156,8 @@
+                 ,
+                 AC_MSG_ERROR([system NSPR does not support PR_UINT64 or including prtypes.h does not provide it]))
+     CFLAGS=$_SAVE_CFLAGS
++    NSPR_INCLUDE_DIR=`echo ${NSPR_CFLAGS} | sed -e 's/.*-I\([^ ]*\).*/\1/'`
++    NSPR_LIB_DIR=`echo ${NSPR_LIBS} | sed -e 's/.*-L\([^ ]*\).*/\1/'`
+ elif test -z "$JS_POSIX_NSPR"; then
+     NSPR_INCLUDE_DIR="${DIST}/include/nspr"
+     NSPR_CFLAGS="-I${NSPR_INCLUDE_DIR}"
+diff --git a/config/external/nss/Makefile.in b/config/external/nss/Makefile.in
+deleted file mode 100644
+--- a/config/external/nss/Makefile.in
++++ /dev/null
+@@ -1,488 +0,0 @@
+-#
+-# This Source Code Form is subject to the terms of the Mozilla Public
+-# License, v. 2.0. If a copy of the MPL was not distributed with this
+-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+-
+-ifndef MOZ_SYSTEM_NSS
+-
+-CC_WRAPPER =
+-CXX_WRAPPER =
+-
+-default::
+-
+-include $(topsrcdir)/config/makefiles/functions.mk
+-
+-NSS_LIBS = \
+-  nss3 \
+-  nssutil3 \
+-  smime3 \
+-  ssl3 \
+-  $(NULL)
+-
+-ifdef MOZ_FOLD_LIBS
+-NSS_DLLS = $(LIBRARY_NAME)
+-else
+-NSS_DLLS = $(NSS_LIBS)
+-endif
+-
+-NSS_EXTRA_DLLS = \
+-  nssckbi \
+-  softokn3 \
+-  $(NULL)
+-
+-ifndef NSS_DISABLE_DBM
+-NSS_EXTRA_DLLS += nssdbm3
+-endif
+-
+-SDK_LIBS = crmf
+-
+-ifneq (,$(filter WINNT,$(OS_ARCH)))
+-SDK_LIBS += $(NSS_DLLS)
+-endif
+-
+-# Default
+-HAVE_FREEBL_LIBS = 1
+-
+-# 32-bit HP-UX PA-RISC
+-ifeq ($(OS_ARCH), HP-UX)
+-ifneq ($(OS_TEST), ia64)
+-ifndef HAVE_64BIT_BUILD
+-HAVE_FREEBL_LIBS =
+-HAVE_FREEBL_LIBS_32INT32 = 1
+-HAVE_FREEBL_LIBS_32FPU = 1
+-endif
+-endif
+-endif
+-
+-# SunOS SPARC
+-ifeq ($(OS_ARCH), SunOS)
+-ifneq (86,$(findstring 86,$(OS_TEST)))
+-ifdef HAVE_64BIT_BUILD
+-HAVE_FREEBL_LIBS =
+-HAVE_FREEBL_LIBS_64 = 1
+-else
+-HAVE_FREEBL_LIBS =
+-HAVE_FREEBL_LIBS_32FPU = 1
+-HAVE_FREEBL_LIBS_32INT64 = 1
+-endif
+-endif
+-endif
+-
+-ifeq ($(OS_TARGET),Linux)
+-HAVE_FREEBL_LIBS = 
+-HAVE_FREEBL_LIBS_PRIV = 1
+-FREEBL_LOWHASH_FLAG = FREEBL_LOWHASH=1
+-endif
+-
+-ifdef HAVE_FREEBL_LIBS
+-NSS_EXTRA_DLLS += freebl3
+-endif
+-ifdef HAVE_FREEBL_LIBS_PRIV
+-NSS_EXTRA_DLLS += freeblpriv3
+-endif
+-ifdef HAVE_FREEBL_LIBS_32INT32
+-NSS_EXTRA_DLLS += freebl_32int_3
+-endif
+-ifdef HAVE_FREEBL_LIBS_32FPU
+-NSS_EXTRA_DLLS += freebl_32fpu_3
+-endif
+-ifdef HAVE_FREEBL_LIBS_32INT64
+-NSS_EXTRA_DLLS += freebl_32int64_3
+-endif
+-ifdef HAVE_FREEBL_LIBS_64
+-NSS_EXTRA_DLLS += freebl_64int_3
+-NSS_EXTRA_DLLS += freebl_64fpu_3
+-endif
+-
+-# For all variables such as DLLFLAGS, that may contain $(DIST)
+-DIST := $(ABS_DIST)
+-# TODO: move this all to configure, but in Python
+-ifndef MOZ_BUILD_NSPR
+-NSPR_INCLUDE_DIR = $(firstword $(filter -I%,$(NSPR_CFLAGS)))
+-ifneq (,$(strip $(NSPR_INCLUDE_DIR)))
+-NSPR_INCLUDE_DIR := $(subst -I,,$(subst -I$(DIST),-I$(ABS_DIST),$(NSPR_INCLUDE_DIR)))
+-else
+-$(error Your NSPR CFLAGS are broken!)
+-endif
+-NSPR_LIB_DIR = $(firstword $(filter -L%,$(NSPR_LIBS)))
+-ifneq (,$(strip $(NSPR_LIB_DIR)))
+-NSPR_LIB_DIR := $(subst -L,,$(subst -L$(DIST),-L$(ABS_DIST),$(NSPR_LIB_DIR)))
+-else
+-$(error Your NSPR LDFLAGS are broken!)
+-endif
+-endif
+-
+-# To get debug symbols from NSS
+-export MOZ_DEBUG_SYMBOLS
+-
+-DEFAULT_GMAKE_FLAGS =
+-DEFAULT_GMAKE_FLAGS += CC='$(CC)'
+-DEFAULT_GMAKE_FLAGS += MT='$(MT)'
+-DEFAULT_GMAKE_FLAGS += LD='$(LD)'
+-DEFAULT_GMAKE_FLAGS += SOURCE_MD_DIR=$(ABS_DIST)
+-DEFAULT_GMAKE_FLAGS += SOURCE_MDHEADERS_DIR=$(NSPR_INCLUDE_DIR)
+-DEFAULT_GMAKE_FLAGS += DIST=$(ABS_DIST)
+-DEFAULT_GMAKE_FLAGS += NSPR_INCLUDE_DIR=$(NSPR_INCLUDE_DIR)
+-DEFAULT_GMAKE_FLAGS += NSPR_LIB_DIR=$(NSPR_LIB_DIR)
+-DEFAULT_GMAKE_FLAGS += MOZILLA_CLIENT=1
+-DEFAULT_GMAKE_FLAGS += NO_MDUPDATE=1
+-DEFAULT_GMAKE_FLAGS += NSS_ENABLE_ECC=1
+-DEFAULT_GMAKE_FLAGS += NSS_ENABLE_TLS_1_3=1
+-ifeq ($(OS_ARCH)_$(GNU_CC),WINNT_1)
+-DEFAULT_GMAKE_FLAGS += OS_DLLFLAGS='-static-libgcc' NSPR31_LIB_PREFIX=lib
+-endif
+-ifndef MOZ_SYSTEM_SQLITE
+-ifdef MOZ_FOLD_LIBS
+-DEFAULT_GMAKE_FLAGS += SQLITE_LIB_NAME=nss3
+-else
+-DEFAULT_GMAKE_FLAGS += SQLITE_LIB_NAME=mozsqlite3
+-DEFAULT_GMAKE_FLAGS += SQLITE_LIB_DIR=$(ABS_DIST)/../config/external/sqlite
+-endif # MOZ_FOLD_LIBS
+-DEFAULT_GMAKE_FLAGS += SQLITE_INCLUDE_DIR=$(ABS_DIST)/include
+-endif
+-ifdef NSS_DISABLE_DBM 
+-DEFAULT_GMAKE_FLAGS += NSS_DISABLE_DBM=1
+-endif
+-# Hack to force NSS build system to use "normal" object directories
+-DEFAULT_GMAKE_FLAGS += topsrcdir='$(topsrcdir)'
+-# topsrcdir can't be expanded here because msys path mangling likes to break
+-# paths in that case.
+-DEFAULT_GMAKE_FLAGS += BUILD='$(MOZ_BUILD_ROOT)/security/$$(subst $$(topsrcdir)/security/,,$$(CURDIR))'
+-DEFAULT_GMAKE_FLAGS += BUILD_TREE='$$(BUILD)' OBJDIR='$$(BUILD)' DEPENDENCIES='$$(BUILD)/.deps' SINGLE_SHLIB_DIR='$$(BUILD)'
+-DEFAULT_GMAKE_FLAGS += SOURCE_XP_DIR=$(ABS_DIST)
+-ifndef MOZ_DEBUG
+-DEFAULT_GMAKE_FLAGS += BUILD_OPT=1 OPT_CODE_SIZE=1
+-endif
+-ifdef GNU_CC
+-DEFAULT_GMAKE_FLAGS += NS_USE_GCC=1
+-else
+-DEFAULT_GMAKE_FLAGS += NS_USE_GCC=
+-endif
+-ifdef USE_N32
+-# It is not really necessary to specify USE_PTHREADS=1.  USE_PTHREADS
+-# merely adds _PTH to coreconf's OBJDIR name.
+-DEFAULT_GMAKE_FLAGS += USE_N32=1 USE_PTHREADS=1
+-endif
+-ifdef HAVE_64BIT_BUILD
+-DEFAULT_GMAKE_FLAGS += USE_64=1
+-endif
+-ifeq ($(OS_ARCH),WINNT)
+-DEFAULT_GMAKE_FLAGS += OS_TARGET=WIN95
+-ifdef MOZ_DEBUG
+-ifndef MOZ_NO_DEBUG_RTL
+-DEFAULT_GMAKE_FLAGS += USE_DEBUG_RTL=1
+-endif
+-endif
+-endif # WINNT
+-ifeq ($(OS_ARCH),Darwin)
+-# Make nsinstall use absolute symlinks by default when building NSS
+-# for Mozilla on Mac OS X. (Bugzilla bug 193164)
+-ifndef NSDISTMODE
+-DEFAULT_GMAKE_FLAGS += NSDISTMODE=absolute_symlink
+-endif
+-ifdef MACOS_SDK_DIR
+-DEFAULT_GMAKE_FLAGS += MACOS_SDK_DIR=$(MACOS_SDK_DIR)
+-endif
+-endif
+-
+-# Turn off TLS compression support because it requires system zlib.
+-# See bug 580679 comment 18.
+-DEFAULT_GMAKE_FLAGS += NSS_SSL_ENABLE_ZLIB=
+-
+-# Disable building of the test programs in security/nss/lib/zlib
+-DEFAULT_GMAKE_FLAGS += PROGRAMS=
+-
+-# Disable creating .chk files. They will be generated from packager.mk
+-# When bug 681624 lands, we can replace CHECKLOC= with SKIP_SHLIBSIGN=1
+-DEFAULT_GMAKE_FLAGS += CHECKLOC=
+-
+-ifdef CROSS_COMPILE
+-
+-DEFAULT_GMAKE_FLAGS += \
+-	NATIVE_CC='$(HOST_CC)' \
+-	CC='$(CC)' \
+-	CCC='$(CXX)' \
+-	AS='$(AS)' \
+-	AR='$(AR) $(AR_FLAGS:$@=$$@)' \
+-	RANLIB='$(RANLIB)' \
+-	RC='$(RC) $(RCFLAGS)' \
+-	OS_ARCH='$(OS_ARCH)' \
+-	OS_TEST='$(OS_TEST)' \
+-	CPU_ARCH='$(TARGET_CPU)' \
+-	$(NULL)
+-
+-# Android has pthreads integrated into -lc, so OS_PTHREAD is set to nothing
+-ifeq ($(OS_TARGET), Android)
+-DEFAULT_GMAKE_FLAGS += \
+-	OS_RELEASE='2.6' \
+-	OS_PTHREAD= \
+-	$(NULL)
+-
+-DEFAULT_GMAKE_FLAGS += ARCHFLAG='$(filter-out -W%,$(CFLAGS)) -DCHECK_FORK_GETPID $(addprefix -DANDROID_VERSION=,$(ANDROID_VERSION)) -include $(topsrcdir)/security/manager/android_stub.h'
+-endif
+-endif
+-
+-ifdef WRAP_LDFLAGS
+-NSS_EXTRA_LDFLAGS += $(WRAP_LDFLAGS)
+-endif
+-
+-# The SHARED_LIBS part is needed unconditionally on Android.  It's not
+-# clear why this is the case, but see bug 1133073 (starting around
+-# comment #8) for context.
+-ifneq (,$(or $(MOZ_GLUE_WRAP_LDFLAGS), $(filter Android, $(OS_TARGET))))
+-NSS_EXTRA_LDFLAGS += $(SHARED_LIBS:$(DEPTH)%=$(MOZ_BUILD_ROOT)%) $(MOZ_GLUE_WRAP_LDFLAGS)
+-endif
+-
+-ifneq (,$(NSS_EXTRA_LDFLAGS))
+-DEFAULT_GMAKE_FLAGS += \
+-	LDFLAGS='$(LDFLAGS) $(NSS_EXTRA_LDFLAGS)' \
+-	DSO_LDOPTS='$(DSO_LDOPTS) $(LDFLAGS) $(NSS_EXTRA_LDFLAGS)' \
+-	$(NULL)
+-endif
+-
+-DEFAULT_GMAKE_FLAGS += FREEBL_NO_DEPEND=0 $(FREEBL_LOWHASH_FLAG)
+-DEFAULT_GMAKE_FLAGS += NSS_ALLOW_SSLKEYLOGFILE=1
+-
+-ifdef MOZ_NO_WLZDEFS
+-DEFAULT_GMAKE_FLAGS += ZDEFS_FLAG=
+-endif
+-ifdef MOZ_CFLAGS_NSS
+-NSS_XCFLAGS += $(filter-out -W%,$(CFLAGS))
+-DEFAULT_GMAKE_FLAGS += DARWIN_DYLIB_VERSIONS='-compatibility_version 1 -current_version 1 $(LDFLAGS)'
+-endif
+-ifeq (1_1,$(CLANG_CL)_$(MOZ_ASAN))
+-XLDFLAGS := $(OS_LDFLAGS)
+-DEFAULT_GMAKE_FLAGS += XLDFLAGS='$(XLDFLAGS)'
+-endif
+-
+-DEFAULT_GMAKE_FLAGS += NSS_NO_PKCS11_BYPASS=1
+-
+-# Put NSS headers directly under $(DIST)/include
+-DEFAULT_GMAKE_FLAGS += PUBLIC_EXPORT_DIR='$(ABS_DIST)/include/$$(MODULE)'
+-DEFAULT_GMAKE_FLAGS += SOURCE_XPHEADERS_DIR='$$(SOURCE_XP_DIR)/include/$$(MODULE)'
+-DEFAULT_GMAKE_FLAGS += MODULE_INCLUDES='$$(addprefix -I$$(SOURCE_XP_DIR)/include/,$$(REQUIRES))'
+-
+-# Work around NSS's MAKE_OBJDIR being racy. See bug #836220
+-DEFAULT_GMAKE_FLAGS += MAKE_OBJDIR='$$(INSTALL) -D $$(OBJDIR)'
+-
+-# Work around NSS adding IMPORT_LIBRARY to TARGETS with no rule for
+-# it, creating race conditions. See bug #836220
+-DEFAULT_GMAKE_FLAGS += TARGETS='$$(LIBRARY) $$(SHARED_LIBRARY) $$(PROGRAM)'
+-
+-ifdef MOZ_FOLD_LIBS_FLAGS
+-NSS_XCFLAGS += $(MOZ_FOLD_LIBS_FLAGS)
+-endif
+-
+-# Pass on the MSVC target arch from the main build system.
+-# Note this is case- and switch-character sensitive, while
+-# the MSVC option is not.
+-ifeq (WINNT,$(OS_TARGET))
+-NSS_XCFLAGS += $(filter -arch:%,$(CFLAGS))
+-endif
+-
+-# Enable short header experiment. Firefox only.
+-NSS_XCFLAGS += -DNSS_ENABLE_TLS13_SHORT_HEADERS
+-
+-# Export accumulated XCFLAGS to modify nss defaults.
+-DEFAULT_GMAKE_FLAGS += XCFLAGS='$(NSS_XCFLAGS)'
+-
+-NSS_SRCDIR = $(topsrcdir)
+-
+-NSS_DIRS =
+-ifndef MOZ_FOLD_LIBS
+-NSS_DIRS += nss/lib
+-else
+-ifndef NSS_DISABLE_DBM
+-NSS_DIRS += nss/lib/dbm
+-endif
+-endif
+-NSS_DIRS += \
+-  nss/cmd/lib \
+-  nss/cmd/shlibsign \
+-  $(NULL)
+-
+-ifdef ENABLE_TESTS
+-NSS_DIRS += \
+-  nss/cmd/certutil \
+-  nss/cmd/pk12util \
+-  nss/cmd/modutil \
+-  $(NULL)
+-endif
+-
+-ifneq (,$(filter %--build-id,$(LDFLAGS)))
+-DEFAULT_GMAKE_ENV = LDFLAGS=-Wl,--build-id
+-endif
+-
+-ifdef MOZ_FOLD_LIBS
+-# TODO: The following can be replaced by something simpler when bug 844880
+-# is fixed.
+-# All static libraries required for nss, smime, ssl and nssutil.
+-# The strip is needed to remove potential linefeed characters, since they hang
+-# around in some cases on Windows.
+-NSS_STATIC_LIBS := $(strip $(shell $(MAKE) --no-print-directory -f $(srcdir)/nss.mk DEPTH='$(DEPTH)' topsrcdir='$(topsrcdir)' srcdir='$(srcdir)' echo-variable-libs))
+-# Corresponding build directories
+-NSS_STATIC_DIRS := $(foreach lib,$(NSS_STATIC_LIBS),$(patsubst %/,%,$(dir $(lib))))
+-NSS_DIRS += $(NSS_STATIC_DIRS)
+-
+-# TODO: The following can be replaced by something simpler when bug 844884
+-# is fixed.
+-# Remaining nss/lib directories
+-NSS_DIRS += nss/lib/freebl nss/lib/softoken nss/lib/jar nss/lib/crmf nss/lib/ckfw
+-
+-DEFAULT_GMAKE_FLAGS += NSS_DISABLE_LIBPKIX=1
+-
+-ifeq (WINNT,$(OS_TARGET))
+-NSS_DIRS += nss/lib/zlib
+-endif
+-endif # MOZ_FOLD_LIBS
+-
+-# Filter-out $(LIBRARY_NAME) because it's already handled in config/rules.mk.
+-NSS_DIST_DLL_FILES := $(addprefix $(DIST)/lib/$(DLL_PREFIX),$(addsuffix $(DLL_SUFFIX),$(filter-out $(LIBRARY_NAME),$(NSS_DLLS)) $(NSS_EXTRA_DLLS)))
+-NSS_DIST_DLL_DEST := $(DIST)/bin
+-NSS_DIST_DLL_TARGET := target
+-INSTALL_TARGETS += NSS_DIST_DLL
+-
+-ifeq ($(OS_ARCH)_$(1), SunOS_softokn3)
+-# has to use copy mode on Solaris, see #665509
+-$(DIST)/bin/$(DLL_PREFIX)softokn3$(DLL_SUFFIX): INSTALL := $(INSTALL) -t
+-endif
+-
+-NSS_SDK_LIB_FILES := \
+-  $(addprefix $(DIST)/lib/$(LIB_PREFIX),$(addsuffix .$(LIB_SUFFIX),$(SDK_LIBS))) \
+-  $(addprefix $(DIST)/bin/$(DLL_PREFIX),$(addsuffix $(DLL_SUFFIX),$(NSS_DLLS))) \
+-  $(NULL)
+-NSS_SDK_LIB_DEST := $(DIST)/sdk/lib
+-NSS_SDK_LIB_TARGET := target
+-INSTALL_TARGETS += NSS_SDK_LIB
+-
+-ifdef MOZ_FOLD_LIBS
+-# Add all static libraries for nss, smime, ssl and nssutil
+-STATIC_LIBS += $(addprefix $(DEPTH)/security/,$(NSS_STATIC_LIBS))
+-
+-IMPORT_LIB_FILES = $(IMPORT_LIBRARY)
+-IMPORT_LIB_DEST ?= $(DIST)/lib
+-IMPORT_LIB_TARGET = target
+-INSTALL_TARGETS += IMPORT_LIB
+-
+-endif # MOZ_FOLD_LIBS
+-
+-include $(topsrcdir)/config/rules.mk
+-
+-ifeq (1,$(ALLOW_COMPILER_WARNINGS))
+-DEFAULT_GMAKE_FLAGS += NSS_ENABLE_WERROR=0
+-endif
+-
+-# Can't pass this in DEFAULT_GMAKE_FLAGS because that overrides
+-# definitions in NSS, so just export it into the sub-make's environment.
+-ifeq (WINNT_1,$(OS_TARGET)_$(MOZ_MEMORY))
+-DLLFLAGS := -LIBPATH:$(ABS_DIST)/../mozglue/build -DEFAULTLIB:mozglue
+-export DLLFLAGS
+-endif
+-
+-ifdef MOZ_FOLD_LIBS
+-# Force the linker to include everything from the static libraries.
+-EXPAND_LIBS_EXEC += --extract
+-
+-$(SHARED_LIBRARY): $(addprefix $(DEPTH)/security/,$(NSS_STATIC_LIBS))
+-
+-ifdef IMPORT_LIB_SUFFIX
+-IMPORT_PREFIX = $(LIB_PREFIX)
+-IMPORT_SUFFIX = .$(IMPORT_LIB_SUFFIX)
+-else
+-IMPORT_PREFIX = $(DLL_PREFIX)
+-IMPORT_SUFFIX = $(DLL_SUFFIX)
+-endif
+-
+-NSPR_IMPORT_LIBS = $(addprefix $(DIST)/lib/$(IMPORT_PREFIX),$(addsuffix $(IMPORT_SUFFIX),nspr4 plc4 plds4))
+-SQLITE_IMPORT_LIB = $(DIST)/lib/$(IMPORT_PREFIX)mozsqlite3$(IMPORT_SUFFIX)
+-
+-# TODO: The following can be replaced by something simpler when bug 844884
+-# is fixed.
+-# Associate target files with the rules that build them.
+-$(DIST)/lib/$(LIB_PREFIX)crmf.$(LIB_SUFFIX): libs-nss/lib/crmf
+-$(DIST)/lib/$(DLL_PREFIX)freebl3$(DLL_SUFFIX): libs-nss/lib/freebl
+-$(DIST)/lib/$(DLL_PREFIX)nssckbi$(DLL_SUFFIX): libs-nss/lib/ckfw
+-$(DIST)/lib/$(DLL_PREFIX)softokn3$(DLL_SUFFIX): libs-nss/lib/softoken
+-$(DIST)/lib/$(DLL_PREFIX)nssdbm3$(DLL_SUFFIX): libs-nss/lib/softoken
+-$(foreach lib,$(NSS_STATIC_LIBS),$(eval $(DEPTH)/security/$(lib): libs-$(patsubst %/,%,$(dir $(lib)))))
+-
+-# Create fake import libraries for the folded libraries, so that linking
+-# against them works both for the NSS build system (see dependencies below)
+-# and for the rest of the mozilla build system.
+-$(NSPR_IMPORT_LIBS) \
+-$(SQLITE_IMPORT_LIB) \
+-$(DIST)/lib/$(IMPORT_PREFIX)nssutil3$(IMPORT_SUFFIX) \
+-$(DIST)/lib/$(IMPORT_PREFIX)ssl3$(IMPORT_SUFFIX) \
+-$(DIST)/lib/$(IMPORT_PREFIX)smime3$(IMPORT_SUFFIX): $(DIST)/lib/$(IMPORT_PREFIX)nss3$(IMPORT_SUFFIX)
+-ifeq (WINNT,$(OS_TARGET))
+-	cp $< $@
+-else
+-	ln -sf $< $@
+-endif
+-
+-# Interdependencies between nss sub-directories, and dependencies on NSPR/SQLite
+-libs-nss/lib/ckfw: libs-nss/lib/nss/../base $(NSPR_IMPORT_LIBS)
+-libs-nss/lib/softoken: $(NSPR_IMPORT_LIBS) $(SQLITE_IMPORT_LIB)
+-libs-nss/lib/softoken: libs-nss/lib/freebl
+-ifndef NSS_DISABLE_DBM
+-libs-nss/lib/softoken: libs-nss/lib/dbm
+-endif
+-libs-nss/lib/softoken: $(DIST)/lib/$(IMPORT_PREFIX)nssutil3$(IMPORT_SUFFIX)
+-libs-nss/lib/freebl: $(DIST)/lib/$(IMPORT_PREFIX)nssutil3$(IMPORT_SUFFIX) $(NSPR_IMPORT_LIBS)
+-
+-# For each directory where we build static libraries, force the NSS build system
+-# to only build static libraries.
+-$(addprefix libs-,$(NSS_STATIC_DIRS)): DEFAULT_GMAKE_FLAGS += SHARED_LIBRARY= IMPORT_LIBRARY=
+-else
+-$(STATIC_LIBS) $(NSS_DIST_DLL_FILES) $(NSS_SDK_LIB_FILES): libs-nss/lib
+-endif # MOZ_FOLD_LIBS
+-
+-ifeq ($(NSINSTALL_PY),$(NSINSTALL))
+-DEFAULT_GMAKE_FLAGS += PYTHON='$(PYTHON)'
+-DEFAULT_GMAKE_FLAGS += NSINSTALL_PY='$(abspath $(topsrcdir)/config/nsinstall.py)'
+-DEFAULT_GMAKE_FLAGS += NSINSTALL='$$(PYTHON) $$(NSINSTALL_PY)'
+-else
+-DEFAULT_GMAKE_FLAGS += NSINSTALL='$(abspath $(NSINSTALL))'
+-endif
+-ifeq ($(OS_ARCH),WINNT)
+-DEFAULT_GMAKE_FLAGS += INSTALL='$$(NSINSTALL) -t'
+-endif
+-DEFAULT_GMAKE_FLAGS += $(EXTRA_GMAKE_FLAGS)
+-
+-$(addprefix libs-,$(NSS_DIRS)): libs-%:
+-# Work around NSS's export rule being racy when recursing for private_export
+-# See bug #836220.
+-$(addprefix export-,$(NSS_DIRS)): EXTRA_GMAKE_FLAGS = PRIVATE_EXPORTS=
+-$(addprefix export-,$(NSS_DIRS)): export-%: private_export-%
+-$(addprefix private_export-,$(NSS_DIRS)): EXTRA_GMAKE_FLAGS =
+-$(addprefix private_export-,$(NSS_DIRS)): private_export-%:
+-
+-$(foreach p,libs export private_export,$(addprefix $(p)-,$(NSS_DIRS))):
+-	$(DEFAULT_GMAKE_ENV) $(MAKE) -C $(NSS_SRCDIR)/security/$* $(@:-$*=) $(DEFAULT_GMAKE_FLAGS)
+-
+-export:: $(addprefix export-,$(NSS_DIRS))
+-
+-$(addprefix clean-,$(NSS_DIRS)): clean-%:
+-	$(MAKE) -C $(NSS_SRCDIR)/security/$* $(DEFAULT_GMAKE_FLAGS) clean
+-
+-clean clobber clobber_all realclean distclean depend:: $(addprefix clean-,$(NSS_DIRS))
+-
+-NSS_CMD_TARGETS := $(addprefix libs-,$(filter-out nss/cmd/lib,$(filter nss/cmd/%,$(NSS_DIRS))))
+-target:: $(NSS_CMD_TARGETS)
+-
+-ifdef MOZ_FOLD_LIBS
+-$(NSS_CMD_TARGETS): $(addprefix $(DIST)/lib/$(IMPORT_PREFIX),$(addsuffix $(IMPORT_SUFFIX),$(NSS_LIBS)))
+-libs-nss/cmd/modutil: libs-nss/lib/jar
+-ifeq (WINNT,$(OS_TARGET))
+-libs-nss/cmd/modutil: libs-nss/lib/zlib
+-endif
+-$(NSS_CMD_TARGETS): libs-nss/cmd/lib
+-else
+-$(NSS_CMD_TARGETS): libs-nss/lib libs-nss/cmd/lib
+-endif # MOZ_FOLD_LIBS
+-
+-# Work around NSS build system race condition creating certdata.c in
+-# security/nss/lib/ckfw/builtins. See bug #836220.
+-libs-nss/lib$(if $(MOZ_FOLD_LIBS),/ckfw): $(call mkdir_deps,$(DEPTH)/security/nss/lib/ckfw/builtins)
+-
+-endif
+diff --git a/config/external/nss/crmf/moz.build b/config/external/nss/crmf/moz.build
+deleted file mode 100644
+--- a/config/external/nss/crmf/moz.build
++++ /dev/null
+@@ -1,20 +0,0 @@
+-# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+-# vim: set filetype=python:
+-# This Source Code Form is subject to the terms of the Mozilla Public
+-# License, v. 2.0. If a copy of the MPL was not distributed with this
+-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+-
+-Library('crmf')
+-
+-if CONFIG['MOZ_SYSTEM_NSS']:
+-    OS_LIBS += [l for l in CONFIG['NSS_LIBS'] if l.startswith('-L')]
+-    OS_LIBS += ['-lcrmf']
+-else:
+-    USE_LIBS += [
+-        # The dependency on nss is not real, but is required to force the
+-        # parent directory being built before this one. This has no
+-        # practical effect on linkage, since the only thing linking crmf
+-        # will need nss anyways.
+-        'nss',
+-        'static:/security/nss/lib/crmf/crmf',
+-    ]
+diff --git a/config/external/nss/nss.mk b/config/external/nss/nss.mk
+deleted file mode 100644
+--- a/config/external/nss/nss.mk
++++ /dev/null
+@@ -1,27 +0,0 @@
+-# This Source Code Form is subject to the terms of the Mozilla Public
+-# License, v. 2.0. If a copy of the MPL was not distributed with this
+-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+-
+-include $(DEPTH)/config/autoconf.mk
+-
+-include $(topsrcdir)/config/config.mk
+-
+-dirs :=
+-
+-define add_dirs
+-SHARED_LIBRARY_DIRS :=
+-include $(topsrcdir)/security/$(1)/config.mk
+-dirs += $$(addprefix $(1)/,$$(SHARED_LIBRARY_DIRS)) $(1)
+-endef
+-$(foreach dir,util nss ssl smime,$(eval $(call add_dirs,nss/lib/$(dir))))
+-
+-libs :=
+-define add_lib
+-LIBRARY_NAME :=
+-include $(topsrcdir)/security/$(1)/manifest.mn
+-libs += $$(addprefix $(1)/,$(LIB_PREFIX)$$(LIBRARY_NAME).$(LIB_SUFFIX))
+-endef
+-$(foreach dir,$(dirs),$(eval $(call add_lib,$(dir))))
+-
+-echo-variable-%:
+-	@echo $($*)
+diff --git a/moz.build b/moz.build
+--- a/moz.build
++++ b/moz.build
+@@ -70,7 +70,7 @@
+     if not CONFIG['JS_STANDALONE']:
+         DIRS += [
+             'config/external',
+-            'config/external/nss',
++            'security',
+         ]
+ 
+     if CONFIG['BUILD_CTYPES']:
+diff --git a/old-configure.in b/old-configure.in
+--- a/old-configure.in
++++ b/old-configure.in
+@@ -2130,6 +2130,15 @@
+    NSS_LIBS="$NSS_LIBS -lcrmf"
+ else
+    NSS_CFLAGS="-I${DIST}/include/nss"
++   case "${OS_ARCH}" in
++        # This is to match the conditions in security/generate_mapfile.py,
++        # plus Windows which doesn't run that script.
++        WINNT|Darwin|Linux)
++            ;;
++        *)
++            AC_MSG_ERROR([building in-tree NSS is not supported on this platform. Use --with-system-nss])
++            ;;
++   esac
+ fi
+ 
+ if test -z "$SKIP_LIBRARY_CHECKS"; then
+diff --git a/python/mozbuild/mozbuild/frontend/emitter.py b/python/mozbuild/mozbuild/frontend/emitter.py
+--- a/python/mozbuild/mozbuild/frontend/emitter.py
++++ b/python/mozbuild/mozbuild/frontend/emitter.py
+@@ -140,8 +140,6 @@
+         if os.path.exists(subconfigures):
+             paths = open(subconfigures).read().splitlines()
+         self._external_paths = set(mozpath.normsep(d) for d in paths)
+-        # Add security/nss manually, since it doesn't have a subconfigure.
+-        self._external_paths.add('security/nss')
+ 
+         self._emitter_time = 0.0
+         self._object_count = 0
+diff --git a/security/generate_certdata.py b/security/generate_certdata.py
+new file mode 100644
+--- /dev/null
++++ b/security/generate_certdata.py
+@@ -0,0 +1,11 @@
++#!/usr/bin/env python
++#
++# This exists to paper over differences between gyp's `action` definitions
++# and moz.build `GENERATED_FILES` semantics.
++
++import buildconfig
++import subprocess
++
++def main(output, *inputs):
++    output.write(subprocess.check_output([buildconfig.substs['PERL']] + list(inputs)))
++    return None
+diff --git a/security/generate_mapfile.py b/security/generate_mapfile.py
+new file mode 100644
+--- /dev/null
++++ b/security/generate_mapfile.py
+@@ -0,0 +1,54 @@
++#!/usr/bin/env python
++
++# This Source Code Form is subject to the terms of the Mozilla Public
++# License, v. 2.0. If a copy of the MPL was not distributed with this
++# file, You can obtain one at http://mozilla.org/MPL/2.0/.
++
++# This script processes NSS .def files according to the rules defined in
++# a comment at the top of each one. The files are used to define the
++# exports from NSS shared libraries, with -DEFFILE on Windows, a linker
++# script on Linux, or with -exported_symbols_list on OS X.
++#
++# The NSS build system processes them using a series of sed replacements,
++# but the Mozilla build system is already running a Python script to generate
++# the file so it's simpler to just do the replacement in Python.
++
++import buildconfig
++
++
++def main(output, input):
++    # There's a check in old-configure.in under the system-nss handling
++    # that should match this.
++    if buildconfig.substs['OS_ARCH'] not in ('Linux', 'Darwin'):
++        print "Error: unhandled OS_ARCH %s" % buildconfig.substs['OS_ARCH']
++        return 1
++    is_linux = buildconfig.substs['OS_ARCH'] == 'Linux'
++
++    with open(input, 'rb') as f:
++        for line in f:
++            line = line.rstrip()
++            # Remove all lines containing ';-'
++            if ';-' in line:
++                continue
++            # On non-Linux, remove all lines containing ';+'
++            if not is_linux and ';+' in line:
++                continue
++            # Remove the string ' DATA '.
++            line = line.replace(' DATA ', '')
++            # Remove the string ';+'
++            line = line.replace(';+', '')
++            # Remove the string ';;'
++            line = line.replace(';;', '')
++            # If a ';' is present, remove everything after it,
++            # and on non-Linux, remove it as well.
++            i = line.find(';')
++            if i != -1:
++                if is_linux:
++                    line = line[:i+1]
++                else:
++                    line = line[:i]
++            # On non-Linux, symbols get an underscore in front.
++            if line and not is_linux:
++                output.write('_')
++            output.write(line)
++            output.write('\n')
+diff --git a/config/external/nss/moz.build b/security/moz.build
+rename from config/external/nss/moz.build
+rename to security/moz.build
+--- a/config/external/nss/moz.build
++++ b/security/moz.build
+@@ -4,39 +4,122 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+-DIRS += ['crmf']
+-
+ if CONFIG['MOZ_SYSTEM_NSS']:
+     Library('nss')
+     OS_LIBS += CONFIG['NSS_LIBS']
+-elif CONFIG['MOZ_FOLD_LIBS']:
+-    GeckoSharedLibrary('nss', linkage=None)
+-    # TODO: The library name can be changed when bug 845217 is fixed.
+-    SHARED_LIBRARY_NAME = 'nss3'
++else:
++    include('/build/gyp_base.mozbuild')
++    if CONFIG['MOZ_FOLD_LIBS']:
++        GeckoSharedLibrary('nss', linkage=None)
++        # TODO: The library name can be changed when bug 845217 is fixed.
++        SHARED_LIBRARY_NAME = 'nss3'
++
++        SDK_LIBRARY = True
++
++        USE_LIBS += [
++            'nspr4',
++            'nss3_static',
++            'nssutil',
++            'plc4',
++            'plds4',
++            'smime3_static',
++            'ssl',
++        ]
++
++        OS_LIBS += CONFIG['REALTIME_LIBS']
+ 
+-    SDK_LIBRARY = True
+-
+-    USE_LIBS += [
+-        'nspr4',
+-        'plc4',
+-        'plds4',
+-    ]
++        SYMBOLS_FILE = 'nss.symbols'
++        # This changes the default targets in the NSS build, among
++        # other things.
++        gyp_vars['moz_fold_libs'] = 1
++        # Some things in NSS need to link against nssutil, which
++        # gets folded, so this tells them what to link against.
++        gyp_vars['moz_folded_library_name'] = 'nss'
++        # Force things in NSS that want to link against NSPR to link
++        # against the folded library.
++        gyp_vars['nspr_libs'] = 'nss'
++    else:
++        Library('nss')
++        USE_LIBS += [
++            'nss3',
++            'nssutil3',
++            'smime3',
++            'sqlite',
++            'ssl3',
++        ]
++        gyp_vars['nspr_libs'] = 'nspr4 plc4 plds4'
+ 
+-    OS_LIBS += CONFIG['REALTIME_LIBS']
++    # This disables building some NSS tools.
++    gyp_vars['mozilla_client'] = 1
++    # We run shlibsign as part of packaging, not build.
++    gyp_vars['sign_libs'] = 0
++    gyp_vars['python'] = CONFIG['PYTHON']
++    # The NSS gyp files do not have a default for this.
++    gyp_vars['nss_dist_dir'] = '$PRODUCT_DIR/dist'
++    # NSS wants to put public headers in $nss_dist_dir/public/nss by default,
++    # which would wind up being mapped to dist/include/public/nss (by
++    # gyp_reader's `handle_copies`).
++    # This forces it to put them in dist/include/nss.
++    gyp_vars['nss_public_dist_dir'] = '$PRODUCT_DIR/dist'
++    gyp_vars['nss_dist_obj_dir'] = '$PRODUCT_DIR/dist/bin'
++    # We don't currently build NSS tests.
++    gyp_vars['disable_tests'] = 1
++    if CONFIG['NSS_DISABLE_DBM']:
++        gyp_vars['disable_dbm'] = 1
++    gyp_vars['disable_libpkix'] = 1
++    # pkg-config won't reliably find zlib on our builders, so just force it.
++    # System zlib is only used for modutil and signtool unless
++    # SSL zlib is enabled, which we are disabling immediately below this.
++    gyp_vars['zlib_libs'] = '-lz'
++    gyp_vars['ssl_enable_zlib'] = 0
++    # System sqlite here is the in-tree mozsqlite.
++    gyp_vars['use_system_sqlite'] = 1
++    gyp_vars['sqlite_libs'] = 'sqlite'
++    gyp_vars['nspr_include_dir'] = CONFIG['NSPR_INCLUDE_DIR']
++    gyp_vars['nspr_lib_dir'] = CONFIG['NSPR_LIB_DIR']
++    # The Python scripts that detect clang need it to be set as CC
++    # in the environment, which isn't true here. I don't know that
++    # setting that would be harmful, but we already have this information
++    # anyway.
++    if CONFIG['CLANG_CXX']:
++        gyp_vars['cc_is_clang'] = 1
+ 
+-    SYMBOLS_FILE = 'nss.symbols'
+-else:
+-    Library('nss')
+-    USE_LIBS += [
+-        '/security/nss/lib/nss/nss3',
+-        '/security/nss/lib/smime/smime3',
+-        '/security/nss/lib/ssl/ssl3',
+-        '/security/nss/lib/util/nssutil3',
+-        'sqlite',
+-    ]
++    GYP_DIRS += ['nss']
++    GYP_DIRS['nss'].input = 'nss/nss.gyp'
++    GYP_DIRS['nss'].variables = gyp_vars
+ 
+-# XXX: We should fix these warnings.
+-ALLOW_COMPILER_WARNINGS = True
++    sandbox_vars = {
++        # NSS explicitly exports its public symbols
++        # with linker scripts.
++        'NO_VISIBILITY_FLAGS': True,
++        # XXX: We should fix these warnings.
++        'ALLOW_COMPILER_WARNINGS': True,
++        # NSS' build system doesn't currently build NSS with PGO.
++        # We could probably do so, but not without a lot of
++        # careful consideration.
++        'NO_PGO': True,
++    }
++    if CONFIG['OS_TARGET'] == 'WINNT':
++        if CONFIG['CPU_ARCH'] == 'x86':
++            # This should really be the default.
++            sandbox_vars['ASFLAGS'] = ['-safeseh']
++    if CONFIG['OS_TARGET'] == 'Android':
++        sandbox_vars['CFLAGS'] = [
++            '-include', TOPSRCDIR + '/security/manager/android_stub.h',
++            # Setting sandbox_vars['DEFINES'] is broken currently.
++            '-DCHECK_FORK_GETPID',
++        ]
++        if CONFIG['ANDROID_VERSION']:
++            sandbox_vars['CFLAGS'] += ['-DANDROID_VERSION=' + CONFIG['ANDROID_VERSION']]
++    GYP_DIRS['nss'].sandbox_vars = sandbox_vars
++    GYP_DIRS['nss'].no_chromium = True
++    GYP_DIRS['nss'].no_unified = True
++    # This maps action names from gyp files to
++    # Python scripts that can be used in moz.build GENERATED_FILES.
++    GYP_DIRS['nss'].action_overrides = {
++        'generate_certdata_c': 'generate_certdata.py',
++        'generate_mapfile': 'generate_mapfile.py',
++    }
+ 
+ if CONFIG['NSS_EXTRA_SYMBOLS_FILE']:
+     DEFINES['NSS_EXTRA_SYMBOLS_FILE'] = CONFIG['NSS_EXTRA_SYMBOLS_FILE']
+diff --git a/config/external/nss/nss.symbols b/security/nss.symbols
+rename from config/external/nss/nss.symbols
+rename to security/nss.symbols
+--- a/config/external/nss/nss.symbols
++++ b/security/nss.symbols
+@@ -13,7 +13,7 @@
+ PR_*
+ PL_*
+ #endif
+-#include ../../../db/sqlite3/src/sqlite.symbols
++#include ../db/sqlite3/src/sqlite.symbols
+ ATOB_AsciiToData
+ ATOB_AsciiToData_Util
+ ATOB_ConvertAsciiToItem

+ 41 - 0
mozilla-esr52/patches/1310067.patch

@@ -0,0 +1,41 @@
+
+# HG changeset patch
+# User Makoto Kato <m_kato@ga2.so-net.ne.jp>
+# Date 1479694484 -32400
+# Node ID 59375acb5ae8b4fdaba7fe649c25826e48536792
+# Parent  665038e5ef2b980dc38bd44c107803ab0d2de9b4
+Bug 1310067 - VS2017 doesn't require JS_DEPENDENT_TEMPLATE_HINT workaround. r=jonco
+
+MozReview-Commit-ID: DuDDyP6tpc8
+
+diff --git a/js/public/TraceKind.h b/js/public/TraceKind.h
+--- a/js/public/TraceKind.h
++++ b/js/public/TraceKind.h
+@@ -159,22 +159,22 @@ template <> struct MapTypeToRootKind<JSF
+ //
+ //    DispatchTraceKindTyped(f, thing, traceKind, ... args)
+ //
+ // Downcast the |void *thing| to the specific type designated by |traceKind|,
+ // and pass it to the functor |f| along with |... args|, forwarded. Pass the
+ // type designated by |traceKind| as the functor's template argument. The
+ // |thing| parameter is optional; without it, we simply pass through |... args|.
+ 
+-// GCC and Clang require an explicit template declaration in front of the
+-// specialization of operator() because it is a dependent template. MSVC, on
+-// the other hand, gets very confused if we have a |template| token there.
++// VS2017+, GCC and Clang require an explicit template declaration in front of
++// the specialization of operator() because it is a dependent template. VS2015,
++// on the other hand, gets very confused if we have a |template| token there.
+ // The clang-cl front end defines _MSC_VER, but still requires the explicit
+ // template declaration, so we must test for __clang__ here as well.
+-#if defined(_MSC_VER) && !defined(__clang__)
++#if (defined(_MSC_VER) && _MSC_VER < 1910) && !defined(__clang__)
+ # define JS_DEPENDENT_TEMPLATE_HINT
+ #else
+ # define JS_DEPENDENT_TEMPLATE_HINT template
+ #endif
+ template <typename F, typename... Args>
+ auto
+ DispatchTraceKindTyped(F f, JS::TraceKind traceKind, Args&&... args)
+   -> decltype(f. JS_DEPENDENT_TEMPLATE_HINT operator()<JSObject>(mozilla::Forward<Args>(args)...))
+

+ 156 - 0
mozilla-esr52/patches/1316844-1.patch

@@ -0,0 +1,156 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1478831563 -32400
+# Node ID f45564cb091fb98a058f470de5e1f5857683870f
+# Parent  7ea8e42c983584ed6638f2a10aca9b0019f20025
+Bug 1316844 - Improve function unwrapping to properly cover templates. r=chmanchester
+
+diff --git a/python/mozbuild/mozbuild/configure/__init__.py b/python/mozbuild/mozbuild/configure/__init__.py
+--- a/python/mozbuild/mozbuild/configure/__init__.py
++++ b/python/mozbuild/mozbuild/configure/__init__.py
+@@ -655,39 +655,42 @@ class ConfigureSandbox(dict):
+                     return func
+                 return obj
+ 
+             # The following function may end up being prepared to be sandboxed,
+             # so it mustn't depend on anything from the global scope in this
+             # file. It can however depend on variables from the closure, thus
+             # maybe_prepare_function and isfunction are declared above to be
+             # available there.
+-            @wraps(template)
++            @self.wraps(template)
+             def wrapper(*args, **kwargs):
+                 args = [maybe_prepare_function(arg) for arg in args]
+                 kwargs = {k: maybe_prepare_function(v)
+                           for k, v in kwargs.iteritems()}
+                 ret = template(*args, **kwargs)
+                 if isfunction(ret):
+                     # We can't expect the sandboxed code to think about all the
+                     # details of implementing decorators, so do some of the
+                     # work for them. If the function takes exactly one function
+                     # as argument and returns a function, it must be a
+                     # decorator, so mark the returned function as wrapping the
+                     # function passed in.
+                     if len(args) == 1 and not kwargs and isfunction(args[0]):
+-                        ret = wraps(args[0])(ret)
++                        ret = self.wraps(args[0])(ret)
+                     return wrap_template(ret)
+                 return ret
+             return wrapper
+ 
+         wrapper = wrap_template(template)
+         self._templates.add(wrapper)
+         return wrapper
+ 
++    def wraps(self, func):
++        return wraps(func)
++
+     RE_MODULE = re.compile('^[a-zA-Z0-9_\.]+$')
+ 
+     def imports_impl(self, _import, _from=None, _as=None):
+         '''Implementation of @imports.
+         This decorator imports the given _import from the given _from module
+         optionally under a different _as name.
+         The options correspond to the various forms for the import builtin.
+             @imports('sys')
+@@ -912,24 +915,24 @@ class ConfigureSandbox(dict):
+             def makecell(content):
+                 def f():
+                     content
+                 return f.func_closure[0]
+ 
+             closure = tuple(makecell(cell.cell_contents)
+                             for cell in func.func_closure)
+ 
+-        new_func = wraps(func)(types.FunctionType(
++        new_func = self.wraps(func)(types.FunctionType(
+             func.func_code,
+             glob,
+             func.__name__,
+             func.func_defaults,
+             closure
+         ))
+-        @wraps(new_func)
++        @self.wraps(new_func)
+         def wrapped(*args, **kwargs):
+             if func in self._imports:
+                 self._apply_imports(func, glob)
+                 del self._imports[func]
+             return new_func(*args, **kwargs)
+ 
+         self._prepared_functions.add(wrapped)
+         return wrapped, glob
+diff --git a/python/mozbuild/mozbuild/configure/lint.py b/python/mozbuild/mozbuild/configure/lint.py
+--- a/python/mozbuild/mozbuild/configure/lint.py
++++ b/python/mozbuild/mozbuild/configure/lint.py
+@@ -1,20 +1,22 @@
+ # This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import, print_function, unicode_literals
+ 
++from functools import wraps
+ from StringIO import StringIO
+ from . import (
+     CombinedDependsFunction,
+     ConfigureError,
+     ConfigureSandbox,
+     DependsFunction,
++    SandboxedGlobal,
+ )
+ from .lint_util import disassemble_as_iter
+ from mozbuild.util import memoize
+ 
+ 
+ class LintSandbox(ConfigureSandbox):
+     def __init__(self, environ=None, argv=None, stdout=None, stderr=None):
+         out = StringIO()
+@@ -32,17 +34,17 @@ class LintSandbox(ConfigureSandbox):
+ 
+     def _missing_help_dependency(self, obj):
+         if isinstance(obj, CombinedDependsFunction):
+             return False
+         if isinstance(obj, DependsFunction):
+             if (self._help_option in obj.dependencies or
+                 obj in (self._always, self._never)):
+                 return False
+-            func, glob = self._wrapped[obj.func]
++            func, glob = self.unwrap(obj.func)
+             # We allow missing --help dependencies for functions that:
+             # - don't use @imports
+             # - don't have a closure
+             # - don't use global variables
+             if func in self._imports or func.func_closure:
+                 return True
+             for op, arg in disassemble_as_iter(func):
+                 if op in ('LOAD_GLOBAL', 'STORE_GLOBAL'):
+@@ -66,13 +68,21 @@ class LintSandbox(ConfigureSandbox):
+                         % (obj.name, arg.name, arg.name))
+         elif ((self._help or need_help_dependency) and
+               self._missing_help_dependency(obj)):
+             raise ConfigureError("Missing @depends for `%s`: '--help'" %
+                                  obj.name)
+         return super(LintSandbox, self)._value_for_depends(
+             obj, need_help_dependency)
+ 
+-    def _prepare_function(self, func):
+-        wrapped, glob = super(LintSandbox, self)._prepare_function(func)
+-        if wrapped not in self._wrapped:
+-            self._wrapped[wrapped] = func, glob
+-        return wrapped, glob
++    def unwrap(self, func):
++        glob = func.func_globals
++        while func in self._wrapped:
++            if isinstance(func.func_globals, SandboxedGlobal):
++                glob = func.func_globals
++            func = self._wrapped[func]
++        return func, glob
++
++    def wraps(self, func):
++        def do_wraps(wrapper):
++            self._wrapped[wrapper] = func
++            return wraps(func)(wrapper)
++        return do_wraps
+

+ 184 - 0
mozilla-esr52/patches/1316844-2.patch

@@ -0,0 +1,184 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1478836357 -32400
+# Node ID e9f19254a85d07fd2b4e3fda76210b355ac52b48
+# Parent  f45564cb091fb98a058f470de5e1f5857683870f
+Bug 1316844 - Remove unused dependencies. r=chmanchester
+
+diff --git a/build/moz.configure/compile-checks.configure b/build/moz.configure/compile-checks.configure
+--- a/build/moz.configure/compile-checks.configure
++++ b/build/moz.configure/compile-checks.configure
+@@ -70,22 +70,22 @@ def check_header(header, language='C++',
+ @template
+ def check_headers(*headers, **kwargs):
+     checks = []
+     for header in headers:
+         checks.append(check_header(header, **kwargs))
+     return checks
+ 
+ 
+-@depends(c_compiler)
+-def warnings_cflags(c_compiler):
++@dependable
++def warnings_cflags():
+     return []
+ 
+-@depends(cxx_compiler)
+-def warnings_cxxflags(cxx_compiler):
++@dependable
++def warnings_cxxflags():
+     return []
+ 
+ 
+ # Tests whether GCC or clang support the given warning flag, and if it is,
+ # add it to the list of warning flags for the build.
+ # - `warning` is the warning flag (e.g. -Wfoo)
+ # - `compiler` (optional) is the compiler to test against (c_compiler or
+ #   cxx_compiler, from toolchain.configure). When omitted, both compilers
+diff --git a/build/moz.configure/init.configure b/build/moz.configure/init.configure
+--- a/build/moz.configure/init.configure
++++ b/build/moz.configure/init.configure
+@@ -487,18 +487,18 @@ add_old_configure_assignment('HAVE_64BIT
+ 
+ # Autoconf needs these set
+ @depends(host)
+ def host_for_old_configure(host):
+     return '--host=%s' % host.alias
+ 
+ add_old_configure_arg(host_for_old_configure)
+ 
+-@depends(host, target)
+-def target_for_old_configure(host, target):
++@depends(target)
++def target_for_old_configure(target):
+     target_alias = target.alias
+     # old-configure does plenty of tests against $target and $target_os
+     # and expects darwin for iOS, so make it happy.
+     if target.os == 'iOS':
+         target_alias = target_alias.replace('-ios', '-darwin')
+     return '--target=%s' % target_alias
+ 
+ add_old_configure_arg(target_for_old_configure)
+@@ -754,20 +754,20 @@ def project_flag(env=None, set_for_old_c
+ 
+ # milestone.is_nightly corresponds to cases NIGHTLY_BUILD is set.
+ @depends(milestone, '--help')
+ def enabled_in_nightly(milestone, _):
+     return milestone.is_nightly
+ 
+ # Set the MOZ_CONFIGURE_OPTIONS variable with all the options that
+ # were passed somehow (environment, command line, mozconfig)
+-@depends(mozconfig_options)
++@dependable
+ @imports(_from='mozbuild.shellutil', _import='quote')
+ @imports('__sandbox__')
+-def all_configure_options(_):
++def all_configure_options():
+     result = []
+     previous = None
+     for option in __sandbox__._options.itervalues():
+         # __sandbox__._options contains items for both option.name and
+         # option.env. But it's also an OrderedDict, meaning both are
+         # consecutive.
+         # Also ignore OLD_CONFIGURE and MOZCONFIG because they're not
+         # interesting.
+diff --git a/build/moz.configure/rust.configure b/build/moz.configure/rust.configure
+--- a/build/moz.configure/rust.configure
++++ b/build/moz.configure/rust.configure
+@@ -66,23 +66,23 @@ def rust_compiler(value, rustc, rustc_in
+             version {} of the 'rustc' toolchain and make sure it is
+             first in your path.
+             You can verify this by typing 'rustc --version'.
+             '''.format(version, min_version)))
+         return True
+ 
+ set_config('MOZ_RUST', rust_compiler)
+ 
+-@depends(rust_compiler, rustc, target, cross_compiling)
++@depends(rust_compiler, rustc, target)
+ @imports('os')
+ @imports('subprocess')
+ @imports(_from='mozbuild.configure.util', _import='LineIO')
+ @imports(_from='mozbuild.shellutil', _import='quote')
+ @imports(_from='tempfile', _import='mkstemp')
+-def rust_target(rust_compiler, rustc, target, cross_compiling):
++def rust_target(rust_compiler, rustc, target):
+     if rust_compiler:
+         # Rust's --target options are similar to, but not exactly the same
+         # as, the autoconf-derived targets we use.  An example would be that
+         # Rust uses distinct target triples for targetting the GNU C++ ABI
+         # and the MSVC C++ ABI on Win32, whereas autoconf has a single
+         # triple and relies on the user to ensure that everything is
+         # compiled for the appropriate ABI.  We need to perform appropriate
+         # munging to get the correct option to rustc.
+diff --git a/build/moz.configure/toolchain.configure b/build/moz.configure/toolchain.configure
+--- a/build/moz.configure/toolchain.configure
++++ b/build/moz.configure/toolchain.configure
+@@ -151,18 +151,18 @@ def using_compiler_wrapper(compiler_wrap
+ set_config('MOZ_USING_COMPILER_WRAPPER', using_compiler_wrapper)
+ 
+ 
+ # Cross-compilation related things.
+ # ==============================================================
+ js_option('--with-toolchain-prefix', env='TOOLCHAIN_PREFIX', nargs=1,
+           help='Prefix for the target toolchain')
+ 
+-@depends('--with-toolchain-prefix', target, host, cross_compiling)
+-def toolchain_prefix(value, target, host, cross_compiling):
++@depends('--with-toolchain-prefix', target, cross_compiling)
++def toolchain_prefix(value, target, cross_compiling):
+     if value:
+         return tuple(value)
+     if cross_compiling:
+         return ('%s-' % target.toolchain, '%s-' % target.alias)
+ 
+ @depends(toolchain_prefix, target)
+ def first_toolchain_prefix(toolchain_prefix, target):
+     # Pass TOOLCHAIN_PREFIX down to the build system if it was given from the
+@@ -878,18 +878,18 @@ add_old_configure_assignment('MOZ_DEBUG_
+ @depends(c_compiler, target)
+ def libcxx_inline_visibility(c_compiler, target):
+     if c_compiler.type == 'clang' and target.os == 'Android':
+         return ''
+ 
+ set_define('_LIBCPP_INLINE_VISIBILITY', libcxx_inline_visibility)
+ set_define('_LIBCPP_INLINE_VISIBILITY_EXCEPT_GCC49', libcxx_inline_visibility)
+ 
+-@depends(c_compiler, target, check_build_environment)
+-def visibility_flags(c_compiler, target, env):
++@depends(target, check_build_environment)
++def visibility_flags(target, env):
+     if target.os != 'WINNT':
+         if target.kernel == 'Darwin':
+             return ('-fvisibility=hidden', '-fvisibility-inlines-hidden')
+         return ('-I%s/system_wrappers' % os.path.join(env.dist),
+                 '-include',
+                 '%s/config/gcc_hidden.h' % env.topsrcdir)
+ 
+ @depends(target, visibility_flags)
+diff --git a/toolkit/moz.configure b/toolkit/moz.configure
+--- a/toolkit/moz.configure
++++ b/toolkit/moz.configure
+@@ -788,18 +788,18 @@ def skia_gpu(value, skia, target):
+     if skia and value:
+         return True
+ 
+ set_config('MOZ_ENABLE_SKIA_GPU', skia_gpu)
+ set_define('USE_SKIA_GPU', skia_gpu)
+ 
+ option('--enable-skia-pdf', help='Enable Skia PDF')
+ 
+-@depends('--enable-skia-pdf', skia, target)
+-def skia_pdf(value, skia, target):
++@depends('--enable-skia-pdf', skia)
++def skia_pdf(value, skia):
+     if value.origin == 'default':
+         if not skia:
+             return None
+     elif value and not skia:
+         die('Cannot enable Skia PDF without enabling Skia')
+     if skia and value:
+         return True
+ 
+

+ 262 - 0
mozilla-esr52/patches/1316844-3.patch

@@ -0,0 +1,262 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1478836378 -32400
+# Node ID f44dbf7e6f4c96d960a58ed77274eec619a87c8a
+# Parent  e9f19254a85d07fd2b4e3fda76210b355ac52b48
+Bug 1316844 - Make the linter detect unused dependencies. r=chmanchester
+
+diff --git a/python/mozbuild/mozbuild/configure/__init__.py b/python/mozbuild/mozbuild/configure/__init__.py
+--- a/python/mozbuild/mozbuild/configure/__init__.py
++++ b/python/mozbuild/mozbuild/configure/__init__.py
+@@ -205,17 +205,17 @@ class ConfigureSandbox(dict):
+     def __init__(self, config, environ=os.environ, argv=sys.argv,
+                  stdout=sys.stdout, stderr=sys.stderr, logger=None):
+         dict.__setitem__(self, '__builtins__', self.BUILTINS)
+ 
+         self._paths = []
+         self._all_paths = set()
+         self._templates = set()
+         # Associate SandboxDependsFunctions to DependsFunctions.
+-        self._depends = {}
++        self._depends = OrderedDict()
+         self._seen = set()
+         # Store the @imports added to a given function.
+         self._imports = {}
+ 
+         self._options = OrderedDict()
+         # Store raw option (as per command line or environment) for each Option
+         self._raw_options = OrderedDict()
+ 
+@@ -383,16 +383,19 @@ class ConfigureSandbox(dict):
+             value, _ = self._prepare_function(value)
+ 
+         elif (not isinstance(value, SandboxDependsFunction) and
+                 value not in self._templates and
+                 not (inspect.isclass(value) and issubclass(value, Exception))):
+             raise KeyError('Cannot assign `%s` because it is neither a '
+                            '@depends nor a @template' % key)
+ 
++        if isinstance(value, SandboxDependsFunction):
++            self._depends[value].func.__name__ = key
++
+         return super(ConfigureSandbox, self).__setitem__(key, value)
+ 
+     def _resolve(self, arg, need_help_dependency=True):
+         if isinstance(arg, SandboxDependsFunction):
+             return self._value_for_depends(self._depends[arg],
+                                            need_help_dependency)
+         return arg
+ 
+diff --git a/python/mozbuild/mozbuild/configure/lint.py b/python/mozbuild/mozbuild/configure/lint.py
+--- a/python/mozbuild/mozbuild/configure/lint.py
++++ b/python/mozbuild/mozbuild/configure/lint.py
+@@ -1,14 +1,15 @@
+ # This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ from __future__ import absolute_import, print_function, unicode_literals
+ 
++import inspect
+ from functools import wraps
+ from StringIO import StringIO
+ from . import (
+     CombinedDependsFunction,
+     ConfigureError,
+     ConfigureSandbox,
+     DependsFunction,
+     SandboxedGlobal,
+@@ -27,16 +28,56 @@ class LintSandbox(ConfigureSandbox):
+         self._wrapped = {}
+         super(LintSandbox, self).__init__({}, environ=environ, argv=argv,
+                                           stdout=stdout, stderr=stderr)
+ 
+     def run(self, path=None):
+         if path:
+             self.include_file(path)
+ 
++        for dep in self._depends.itervalues():
++            self._check_dependencies(dep)
++
++    def _check_dependencies(self, obj):
++        if isinstance(obj, CombinedDependsFunction) or obj in (self._always,
++                                                               self._never):
++            return
++        func, glob = self.unwrap(obj.func)
++        loc = '%s:%d' % (func.func_code.co_filename,
++                         func.func_code.co_firstlineno)
++        func_args = inspect.getargspec(func)
++        if func_args.keywords:
++            raise ConfigureError(
++                '%s: Keyword arguments are not allowed in @depends functions'
++                % loc
++            )
++
++        all_args = list(func_args.args)
++        if func_args.varargs:
++            all_args.append(func_args.varargs)
++        used_args = set()
++
++        for op, arg in disassemble_as_iter(func):
++            if op in ('LOAD_FAST', 'LOAD_CLOSURE'):
++                if arg in all_args:
++                    used_args.add(arg)
++
++        for num, arg in enumerate(all_args):
++            if arg not in used_args:
++                dep = obj.dependencies[num]
++                if dep != self._help_option:
++                    if isinstance(dep, DependsFunction):
++                        dep = dep.name
++                    else:
++                        dep = dep.option
++                    raise ConfigureError(
++                        '%s: The dependency on `%s` is unused.'
++                        % (loc, dep)
++                    )
++
+     def _missing_help_dependency(self, obj):
+         if isinstance(obj, CombinedDependsFunction):
+             return False
+         if isinstance(obj, DependsFunction):
+             if (self._help_option in obj.dependencies or
+                 obj in (self._always, self._never)):
+                 return False
+             func, glob = self.unwrap(obj.func)
+diff --git a/python/mozbuild/mozbuild/test/configure/test_lint.py b/python/mozbuild/mozbuild/test/configure/test_lint.py
+--- a/python/mozbuild/mozbuild/test/configure/test_lint.py
++++ b/python/mozbuild/mozbuild/test/configure/test_lint.py
+@@ -39,31 +39,31 @@ class TestLint(unittest.TestCase):
+         with self.moz_configure('''
+             option('--foo', help='foo')
+             @depends('--foo')
+             def foo(value):
+                 return value
+ 
+             @depends('--help', foo)
+             def bar(help, foo):
+-                return
++                return foo
+         '''):
+             self.lint_test()
+ 
+         with self.assertRaises(ConfigureError) as e:
+             with self.moz_configure('''
+                 option('--foo', help='foo')
+                 @depends('--foo')
+                 @imports('os')
+                 def foo(value):
+                     return value
+ 
+                 @depends('--help', foo)
+                 def bar(help, foo):
+-                    return
++                    return foo
+             '''):
+                 self.lint_test()
+ 
+         self.assertEquals(e.exception.message,
+                           "`bar` depends on '--help' and `foo`. "
+                           "`foo` must depend on '--help'")
+ 
+         with self.assertRaises(ConfigureError) as e:
+@@ -75,17 +75,17 @@ class TestLint(unittest.TestCase):
+                     option('--foo', help='foo')
+                     @depends('--foo')
+                     def foo(value):
+                         qux
+                         return value
+ 
+                     @depends('--help', foo)
+                     def bar(help, foo):
+-                        return
++                        return foo
+                 tmpl()
+             '''):
+                 self.lint_test()
+ 
+         self.assertEquals(e.exception.message,
+                           "`bar` depends on '--help' and `foo`. "
+                           "`foo` must depend on '--help'")
+ 
+@@ -122,11 +122,78 @@ class TestLint(unittest.TestCase):
+             def foo(value):
+                 os
+                 return value
+ 
+             include(foo)
+         '''):
+             self.lint_test()
+ 
++        with self.assertRaises(ConfigureError) as e:
++            with self.moz_configure('''
++                option('--foo', help='foo')
++                @depends('--foo')
++                def foo(value):
++                    return
++
++                include(foo)
++            '''):
++                self.lint_test()
++
++        self.assertEquals(e.exception.message,
++                          "%s:3: The dependency on `--foo` is unused."
++                          % mozpath.join(test_data_path, 'moz.configure'))
++
++        with self.assertRaises(ConfigureError) as e:
++            with self.moz_configure('''
++                @depends(when=True)
++                def bar():
++                    return
++                @depends(bar)
++                def foo(value):
++                    return
++
++                include(foo)
++            '''):
++                self.lint_test()
++
++        self.assertEquals(e.exception.message,
++                          "%s:5: The dependency on `bar` is unused."
++                          % mozpath.join(test_data_path, 'moz.configure'))
++
++        with self.assertRaises(ConfigureError) as e:
++            with self.moz_configure('''
++                @depends(depends(when=True)(lambda: None))
++                def foo(value):
++                    return
++
++                include(foo)
++            '''):
++                self.lint_test()
++
++        self.assertEquals(e.exception.message,
++                          "%s:2: The dependency on `<lambda>` is unused."
++                          % mozpath.join(test_data_path, 'moz.configure'))
++
++        with self.assertRaises(ConfigureError) as e:
++            with self.moz_configure('''
++                @template
++                def tmpl():
++                    @depends(when=True)
++                    def bar():
++                        return
++                    return bar
++                qux = tmpl()
++                @depends(qux)
++                def foo(value):
++                    return
++
++                include(foo)
++            '''):
++                self.lint_test()
++
++        self.assertEquals(e.exception.message,
++                          "%s:9: The dependency on `qux` is unused."
++                          % mozpath.join(test_data_path, 'moz.configure'))
++
+ 
+ if __name__ == '__main__':
+     main()
+

+ 80 - 0
mozilla-esr52/patches/1316956.patch

@@ -0,0 +1,80 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1494627176 -32400
+# Node ID 563f87448eff9e4db7c11f9bfbfddc4c746ca514
+# Parent  d1ed0a4e7d97f808c1caa1ebc5116b51d1986621
+Bug 1316956 - Add a when argument to check_prog. r=chmanchester
+
+diff --git a/build/moz.configure/checks.configure b/build/moz.configure/checks.configure
+--- a/build/moz.configure/checks.configure
++++ b/build/moz.configure/checks.configure
+@@ -89,17 +89,17 @@ def checking(what, callback=None):
+ # The simplest form is:
+ #   check_prog('PROG', ('a', 'b'))
+ # This will look for 'a' or 'b' in $PATH, and set_config PROG to the one
+ # it can find. If PROG is already set from the environment or command line,
+ # use that value instead.
+ @template
+ @imports(_from='mozbuild.shellutil', _import='quote')
+ def check_prog(var, progs, what=None, input=None, allow_missing=False,
+-               paths=None):
++               paths=None, when=None):
+     if input is not None:
+         # Wrap input with type checking and normalization.
+         @depends(input)
+         def input(value):
+             if not value:
+                 return
+             if isinstance(value, str):
+                 return (value,)
+@@ -112,17 +112,17 @@ def check_prog(var, progs, what=None, in
+                help='Path to %s' % (what or 'the %s program' % var.lower()))
+         input = var
+     what = what or var.lower()
+ 
+     # Trick to make a @depends function out of an immediate value.
+     progs = dependable(progs)
+     paths = dependable(paths)
+ 
+-    @depends_if(input, progs, paths)
++    @depends_if(input, progs, paths, when=when)
+     @checking('for %s' % what, lambda x: quote(x) if x else 'not found')
+     def check(value, progs, paths):
+         if progs is None:
+             progs = ()
+ 
+         if not isinstance(progs, (tuple, list)):
+             configure_error('progs must resolve to a list or tuple!')
+ 
+diff --git a/build/moz.configure/util.configure b/build/moz.configure/util.configure
+--- a/build/moz.configure/util.configure
++++ b/build/moz.configure/util.configure
+@@ -385,19 +385,24 @@ def delayed_getattr(func, key):
+         return getattr(value, key, None)
+ 
+     return result
+ 
+ 
+ # Like @depends, but the decorated function is only called if one of the
+ # arguments it would be called with has a positive value (bool(value) is True)
+ @template
+-def depends_if(*args):
++def depends_if(*args, **kwargs):
++    if kwargs:
++        assert len(kwargs) == 1
++        when = kwargs['when']
++    else:
++        when = None
+     def decorator(func):
+-        @depends(*args)
++        @depends(*args, when=when)
+         def wrapper(*args):
+             if any(arg for arg in args):
+                 return func(*args)
+         return wrapper
+     return decorator
+ 
+ # Hacks related to old-configure
+ # ==============================
+

+ 261 - 0
mozilla-esr52/patches/1316957.patch

@@ -0,0 +1,261 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1478898307 -32400
+# Node ID d63d083ab7672423620d6d83366d3e1cbae86bad
+# Parent  8c1409a443ee41860f8caaf59a149ab83c467736
+Bug 1316957 - Include windows.configure conditionally instead of using @depends_win. r=chmanchester
+
+diff --git a/build/moz.configure/toolchain.configure b/build/moz.configure/toolchain.configure
+--- a/build/moz.configure/toolchain.configure
++++ b/build/moz.configure/toolchain.configure
+@@ -962,10 +962,14 @@ def wrap_system_includes(target, visibil
+ 
+ set_define('HAVE_VISIBILITY_HIDDEN_ATTRIBUTE',
+            depends(visibility_flags)(lambda v: bool(v) or None))
+ set_define('HAVE_VISIBILITY_ATTRIBUTE',
+            depends(visibility_flags)(lambda v: bool(v) or None))
+ set_config('WRAP_SYSTEM_INCLUDES', wrap_system_includes)
+ set_config('VISIBILITY_FLAGS', visibility_flags)
+ 
+-include('windows.configure')
++@depends(target)
++def is_windows(target):
++    return target.kernel == 'WINNT'
++
++include('windows.configure', when=is_windows)
+ include('rust.configure')
+diff --git a/build/moz.configure/windows.configure b/build/moz.configure/windows.configure
+--- a/build/moz.configure/windows.configure
++++ b/build/moz.configure/windows.configure
+@@ -3,27 +3,17 @@
+ # This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ option('--with-windows-version', nargs=1, default='603',
+        help='Windows SDK version to target. Win 8.1 (603) is currently'
+             'the minimum supported version.')
+ 
+-@depends(target)
+-def is_windows(target):
+-    return target.kernel == 'WINNT'
+-
+-
+-@template
+-def depends_win(*args):
+-    return depends_when(*args, when=is_windows)
+-
+-
+-@depends_win('--with-windows-version')
++@depends('--with-windows-version')
+ @imports(_from='__builtin__', _import='ValueError')
+ def valid_windows_version(value):
+     if not value:
+         die('Cannot build with --without-windows-version')
+     try:
+         version = int(value[0], 16)
+         if version in (0x603,):
+             return version
+@@ -31,17 +21,17 @@ def valid_windows_version(value):
+         pass
+ 
+     die('Invalid value for --with-windows-version (%s)', value[0])
+ 
+ 
+ option(env='WINDOWSSDKDIR', nargs=1,
+        help='Directory containing the Windows SDK')
+ 
+-@depends_win('WINDOWSSDKDIR', host)
++@depends('WINDOWSSDKDIR', host)
+ def windows_sdk_dir(value, host):
+     if value:
+         return value
+     if host.kernel != 'WINNT':
+         return ()
+ 
+     return tuple(x[1] for x in get_registry_values(
+         r'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots'
+@@ -94,18 +84,17 @@ def get_sdk_dirs(sdk, subdir):
+         )
+ 
+ 
+ @imports(_from='mozbuild.shellutil', _import='quote')
+ def valid_windows_sdk_dir_result(value):
+     if value:
+         return '0x%04x in %s' % (value.version, quote(value.path))
+ 
+-@depends_win(c_compiler, windows_sdk_dir, valid_windows_version,
+-             'WINDOWSSDKDIR')
++@depends(c_compiler, windows_sdk_dir, valid_windows_version, 'WINDOWSSDKDIR')
+ @checking('for Windows SDK', valid_windows_sdk_dir_result)
+ @imports(_from='__builtin__', _import='sorted')
+ @imports(_from='textwrap', _import='dedent')
+ def valid_windows_sdk_dir(compiler, windows_sdk_dir, target_version,
+                           windows_sdk_dir_env):
+     if windows_sdk_dir_env:
+         windows_sdk_dir_env = windows_sdk_dir_env[0]
+     sdks = {}
+@@ -171,17 +160,17 @@ add_old_configure_assignment(
+         lambda x: '0x%04X0000' % x.version if x else None))
+ 
+ 
+ @imports(_from='mozbuild.shellutil', _import='quote')
+ def valid_ucrt_sdk_dir_result(value):
+     if value:
+         return '%s in %s' % (value.version, quote(value.path))
+ 
+-@depends_win(windows_sdk_dir, 'WINDOWSSDKDIR')
++@depends(windows_sdk_dir, 'WINDOWSSDKDIR')
+ @checking('for Universal CRT SDK', valid_ucrt_sdk_dir_result)
+ @imports('os')
+ @imports(_from='__builtin__', _import='sorted')
+ @imports(_import='mozpack.path', _as='mozpath')
+ def valid_ucrt_sdk_dir(windows_sdk_dir, windows_sdk_dir_env):
+     if windows_sdk_dir_env:
+         windows_sdk_dir_env = windows_sdk_dir_env[0]
+     sdks = {}
+@@ -237,17 +226,17 @@ def valid_ucrt_sdk_dir(windows_sdk_dir, 
+     return namespace(
+         path=sdk.path,
+         include=sdk.include,
+         lib=sdk.lib,
+         version=version,
+     )
+ 
+ 
+-@depends_win(c_compiler)
++@depends(c_compiler)
+ @imports('os')
+ def vc_path(c_compiler):
+     if c_compiler.type != 'msvc':
+         return
+     # Normally, we'd start from c_compiler.compiler, but for now, it's not the
+     # ideal full path to the compiler. At least, we're guaranteed find_program
+     # will get us the one we found in toolchain.configure.
+     cl = find_program(c_compiler.compiler)
+@@ -258,27 +247,27 @@ def vc_path(c_compiler):
+             die('Cannot determine the Visual C++ directory the compiler (%s) '
+                 'is in' % cl)
+         result = next
+         if p.lower() == 'bin':
+             break
+     return result
+ 
+ 
+-@depends_win(vc_path)
++@depends(vc_path)
+ @checking('for the Debug Interface Access SDK', lambda x: x or 'not found')
+ @imports(_from='os.path', _import='isdir')
+ def dia_sdk_dir(vc_path):
+     if vc_path:
+         path = os.path.join(os.path.dirname(vc_path), 'DIA SDK')
+         if isdir(path):
+             return path
+ 
+ 
+-@depends_win(vc_path, valid_windows_sdk_dir, valid_ucrt_sdk_dir, dia_sdk_dir)
++@depends(vc_path, valid_windows_sdk_dir, valid_ucrt_sdk_dir, dia_sdk_dir)
+ @imports('os')
+ def include_path(vc_path, windows_sdk_dir, ucrt_sdk_dir, dia_sdk_dir):
+     if not vc_path:
+         return
+     atlmfc_dir = os.path.join(vc_path, 'atlmfc', 'include')
+     if not os.path.isdir(atlmfc_dir):
+         die('Cannot find the ATL/MFC headers in the Visual C++ directory (%s). '
+             'Please install them.' % vc_path)
+@@ -305,17 +294,17 @@ def include_path(vc_path, windows_sdk_di
+     # Set in the environment for old-configure
+     includes = os.pathsep.join(includes)
+     os.environ['INCLUDE'] = includes
+     return includes
+ 
+ set_config('INCLUDE', include_path)
+ 
+ 
+-@depends_win(target, vc_path, valid_windows_sdk_dir, valid_ucrt_sdk_dir, dia_sdk_dir)
++@depends(target, vc_path, valid_windows_sdk_dir, valid_ucrt_sdk_dir, dia_sdk_dir)
+ @imports('os')
+ def lib_path(target, vc_path, windows_sdk_dir, ucrt_sdk_dir, dia_sdk_dir):
+     if not vc_path:
+         return
+     vc_target = {
+         'x86': '',
+         'x86_64': 'amd64',
+         'arm': 'arm',
+@@ -359,17 +348,17 @@ def lib_path(target, vc_path, windows_sd
+     os.environ['LIB'] = libs
+     return libs
+ 
+ set_config('LIB', lib_path)
+ 
+ 
+ option(env='MT', nargs=1, help='Path to the Microsoft Manifest Tool')
+ 
+-@depends_win(valid_windows_sdk_dir)
++@depends(valid_windows_sdk_dir)
+ @imports(_from='os', _import='environ')
+ @imports('platform')
+ def sdk_bin_path(valid_windows_sdk_dir):
+     if not valid_windows_sdk_dir:
+         return
+ 
+     vc_host = {
+         'x86': 'x86',
+@@ -381,23 +370,23 @@ def sdk_bin_path(valid_windows_sdk_dir):
+         os.path.join(valid_windows_sdk_dir.path, 'bin', vc_host)
+     ]
+     if vc_host == 'x64':
+         result.append(
+             os.path.join(valid_windows_sdk_dir.path, 'bin', 'x86'))
+     return result
+ 
+ 
+-mt = check_prog('MT', depends_win()(lambda: ('mt.exe',)), input='MT',
++mt = check_prog('MT', ('mt.exe',), input='MT',
+                 paths=sdk_bin_path)
+ 
+ 
+ # Check that MT is not something unexpected like "magnetic tape manipulation
+ # utility".
+-@depends_win(mt)
++@depends(mt)
+ @checking('whether MT is really Microsoft Manifest Tool', lambda x: bool(x))
+ @imports('subprocess')
+ def valid_mt(path):
+     try:
+         out = subprocess.check_output([path]).splitlines()
+         out = '\n'.join(l for l in out
+                         if 'Microsoft (R) Manifest Tool' in l)
+         if out:
+@@ -405,26 +394,25 @@ def valid_mt(path):
+     except subprocess.CalledProcessError:
+         pass
+     raise FatalCheckError('%s is not Microsoft Manifest Tool')
+ 
+ 
+ set_config('MSMANIFEST_TOOL', depends(valid_mt)(lambda x: bool(x)))
+ 
+ 
+-link = check_prog('LINK', depends_win()(lambda: ('link.exe',)),
+-                  paths=vc_compiler_path)
++link = check_prog('LINK', ('link.exe',), paths=vc_compiler_path)
+ 
+-add_old_configure_assignment('LINK', depends_win(link)(lambda x: x))
++add_old_configure_assignment('LINK', link)
+ 
+ 
+ # Normally, we'd just have CC, etc. set to absolute paths, but the build system
+ # doesn't currently handle properly the case where the paths contain spaces.
+ # Additionally, there's the issue described in toolchain.configure, in
+ # valid_compiler().
+-@depends_win(sdk_bin_path)
++@depends(sdk_bin_path)
+ @imports('os')
+ def alter_path(sdk_bin_path):
+     path = os.pathsep.join(sdk_bin_path)
+     os.environ['PATH'] = path
+     return path
+ 
+ set_config('PATH', alter_path)
+

+ 109 - 0
mozilla-esr52/patches/1317504-1.patch

@@ -0,0 +1,109 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1479967621 -32400
+# Node ID cffe1cd111f65c9045cc8e1fe34d845a9a6b5c28
+# Parent  5c3271cb35c218a5976aa87873099b45719178ea
+Bug 1317504 - Warn that LD is not used by the build system. r=chmanchester
+
+It turns out that, in practice, the LD variable is not used by the build
+system, except on Windows, where it's used to feed the default for LINK,
+which is then re-injected as LD.
+
+The upcoming changes are going to normalize the use of LD/LINK.
+
+diff --git a/build/moz.configure/toolchain.configure b/build/moz.configure/toolchain.configure
+--- a/build/moz.configure/toolchain.configure
++++ b/build/moz.configure/toolchain.configure
+@@ -791,16 +791,40 @@ def compiler(language, host_or_target, c
+         }[language]
+ 
+         preprocessor = depends_if(valid_compiler)(
+                 lambda x: list(x.wrapper) + [x.compiler, '-E'] + list(x.flags))
+ 
+         set_config(pp_var, preprocessor)
+         add_old_configure_assignment(pp_var, preprocessor)
+ 
++    if language == 'C':
++        linker_var = {
++            target: 'LD',
++            host: 'HOST_LD',
++        }[host_or_target]
++
++        @deprecated_option(env=linker_var, nargs=1)
++        def linker(value):
++            if value:
++                return value[0]
++
++        @depends(valid_compiler, linker)
++        def unused_linker(compiler, linker):
++            if linker and compiler.type != 'msvc':
++                log.warning('The value of %s is not used by this build system.'
++                            % linker_var)
++
++        if host_or_target == target:
++            @depends(valid_compiler)
++            def is_msvc(compiler):
++                return compiler.type == 'msvc'
++
++            imply_option('LINK', linker, reason='LD', when=is_msvc)
++
+     return valid_compiler
+ 
+ 
+ c_compiler = compiler('C', target)
+ cxx_compiler = compiler('C++', target, c_compiler=c_compiler)
+ host_c_compiler = compiler('C', host, other_compiler=c_compiler)
+ host_cxx_compiler = compiler('C++', host, c_compiler=host_c_compiler,
+                              other_compiler=cxx_compiler,
+diff --git a/build/moz.configure/windows.configure b/build/moz.configure/windows.configure
+--- a/build/moz.configure/windows.configure
++++ b/build/moz.configure/windows.configure
+@@ -405,21 +405,17 @@ def valid_mt(path):
+     except subprocess.CalledProcessError:
+         pass
+     raise FatalCheckError('%s is not Microsoft Manifest Tool')
+ 
+ 
+ set_config('MSMANIFEST_TOOL', depends(valid_mt)(lambda x: bool(x)))
+ 
+ 
+-# Ultimately, this will move to toolchain.configure and be turned into a
+-# cross-platform check.
+-option(env='LD', nargs=1, help='Path to the linker')
+-
+-link = check_prog('LINK', depends_win()(lambda: ('link.exe',)), input='LD',
++link = check_prog('LINK', depends_win()(lambda: ('link.exe',)),
+                   paths=vc_compiler_path)
+ 
+ add_old_configure_assignment('LD', depends_win(link)(lambda x: x))
+ 
+ 
+ # Normally, we'd just have CC, etc. set to absolute paths, but the build system
+ # doesn't currently handle properly the case where the paths contain spaces.
+ # Additionally, there's the issue described in toolchain.configure, in
+diff --git a/python/mozbuild/mozbuild/test/configure/test_moz_configure.py b/python/mozbuild/mozbuild/test/configure/test_moz_configure.py
+--- a/python/mozbuild/mozbuild/test/configure/test_moz_configure.py
++++ b/python/mozbuild/mozbuild/test/configure/test_moz_configure.py
+@@ -14,16 +14,20 @@ class TestMozConfigure(BaseConfigureTest
+     def test_moz_configure_options(self):
+         def get_value_for(args=[], environ={}, mozconfig=''):
+             sandbox = self.get_sandbox({}, {}, args, environ, mozconfig)
+ 
+             # Add a fake old-configure option
+             sandbox.option_impl('--with-foo', nargs='*',
+                                 help='Help missing for old configure options')
+ 
++            # Remove all implied options, otherwise, getting
++            # all_configure_options below triggers them, and that triggers
++            # configure parts that aren't expected to run during this test.
++            del sandbox._implied_options[:]
+             result = sandbox._value_for(sandbox['all_configure_options'])
+             shell = mozpath.abspath('/bin/sh')
+             return result.replace('CONFIG_SHELL=%s ' % shell, '')
+ 
+         self.assertEquals('--enable-application=browser',
+                           get_value_for(['--enable-application=browser']))
+ 
+         self.assertEquals('--enable-application=browser '
+

+ 103 - 0
mozilla-esr52/patches/1317504-2.patch

@@ -0,0 +1,103 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1479968279 -32400
+# Node ID 677f47fec9e7f21f1188c1a1d437d33f749cafc6
+# Parent  cffe1cd111f65c9045cc8e1fe34d845a9a6b5c28
+Bug 1317504 - Remove unused non-GCC/clang flags settings. r=chmanchester
+
+Compilers other than GCC, clang and MSVC have not been supported for a
+while, and have been explicitly rejected since bug 1259382.
+
+There are a few branches in old-configure that are taken for
+non-GCC/clang compilers, but all of them are later overwritten by the
+MSVC setup. So we just remove those.
+
+diff --git a/js/src/old-configure.in b/js/src/old-configure.in
+--- a/js/src/old-configure.in
++++ b/js/src/old-configure.in
+@@ -505,38 +505,21 @@ if test "$GNU_CC"; then
+     LDFLAGS="$LDFLAGS -Wl,--build-id"
+     AC_TRY_LINK(,,AC_MSG_RESULT([yes])
+                   [NSPR_LDFLAGS="$NSPR_LDFLAGS -Wl,--build-id"],
+                   AC_MSG_RESULT([no])
+                   LDFLAGS=$_SAVE_LDFLAGS)
+ 
+     _DEFINES_CFLAGS='-include $(topobjdir)/js/src/js-confdefs.h -DMOZILLA_CLIENT'
+     _USE_CPP_INCLUDE_FLAG=1
+-
+-else
+-    MKSHLIB='$(LD) $(DSO_LDOPTS) -h $(DSO_SONAME) -o $@'
+-    MKCSHLIB='$(LD) $(DSO_LDOPTS) -h $(DSO_SONAME) -o $@'
+-
+-    DSO_LDOPTS='-shared'
+-    if test "$GNU_LD"; then
+-        # Don't allow undefined symbols in libraries
+-        DSO_LDOPTS="$DSO_LDOPTS -z defs"
+-    fi
+-
+-    DSO_CFLAGS=''
+-    DSO_PIC_CFLAGS='-KPIC'
+-    _DEFINES_CFLAGS='$(ACDEFINES) -D_JS_CONFDEFS_H_ -DMOZILLA_CLIENT'
+ fi
+ 
+ if test "$GNU_CXX"; then
+     _DEFINES_CXXFLAGS='-DMOZILLA_CLIENT -include $(topobjdir)/js/src/js-confdefs.h'
+     _USE_CPP_INCLUDE_FLAG=1
+-
+-else
+-    _DEFINES_CXXFLAGS='-DMOZILLA_CLIENT -D_JS_CONFDEFS_H_ $(ACDEFINES)'
+ fi
+ 
+ dnl ========================================================
+ dnl System overrides of the defaults for host
+ dnl ========================================================
+ case "$host" in
+ *mingw*)
+     if test -n "$_WIN32_MSVC"; then
+diff --git a/old-configure.in b/old-configure.in
+--- a/old-configure.in
++++ b/old-configure.in
+@@ -706,41 +706,24 @@ if test "$GNU_CC"; then
+             esac
+         fi
+     fi
+ 
+     _DEFINES_CFLAGS='-include $(topobjdir)/mozilla-config.h -DMOZILLA_CLIENT'
+     _USE_CPP_INCLUDE_FLAG=1
+ 
+     ASFLAGS="$ASFLAGS $_DEFINES_CFLAGS"
+-
+-else
+-    MKSHLIB='$(LD) $(DSO_LDOPTS) -h $(DSO_SONAME) -o $@'
+-    MKCSHLIB='$(LD) $(DSO_LDOPTS) -h $(DSO_SONAME) -o $@'
+-
+-    DSO_LDOPTS='-shared'
+-    if test "$GNU_LD"; then
+-        # Don't allow undefined symbols in libraries
+-        DSO_LDOPTS="$DSO_LDOPTS -z defs"
+-    fi
+-
+-    DSO_CFLAGS=''
+-    DSO_PIC_CFLAGS='-KPIC'
+-    _DEFINES_CFLAGS='$(ACDEFINES) -D_MOZILLA_CONFIG_H_ -DMOZILLA_CLIENT'
+ fi
+ 
+ if test "$GNU_CXX"; then
+     # FIXME: Let us build with strict aliasing. bug 414641.
+     CXXFLAGS="$CXXFLAGS -fno-exceptions -fno-strict-aliasing"
+ 
+     _DEFINES_CXXFLAGS='-DMOZILLA_CLIENT -include $(topobjdir)/mozilla-config.h'
+     _USE_CPP_INCLUDE_FLAG=1
+-
+-else
+-    _DEFINES_CXXFLAGS='-DMOZILLA_CLIENT -D_MOZILLA_CONFIG_H_ $(ACDEFINES)'
+ fi
+ 
+ dnl ========================================================
+ dnl = Use Valgrind
+ dnl ========================================================
+ MOZ_ARG_ENABLE_BOOL(valgrind,
+ [  --enable-valgrind       Enable Valgrind integration hooks (default=no)],
+     MOZ_VALGRIND=1,
+

+ 87 - 0
mozilla-esr52/patches/1317504-3.patch

@@ -0,0 +1,87 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1479968742 -32400
+# Node ID fd007caf51dfebb5224316c5d0978d15a2cfcc4b
+# Parent  677f47fec9e7f21f1188c1a1d437d33f749cafc6
+Bug 1317504 - Remove the GNU_LD variable, nothing uses it. r=chmanchester
+
+diff --git a/build/autoconf/toolchain.m4 b/build/autoconf/toolchain.m4
+--- a/build/autoconf/toolchain.m4
++++ b/build/autoconf/toolchain.m4
+@@ -10,32 +10,28 @@ dnl the corresponding variables already,
+ dnl entirely.
+ define([AC_PROG_CPP],[])
+ define([AC_PROG_CXXCPP],[])
+ define([AC_HEADER_STDC], [])
+ 
+ AC_DEFUN([MOZ_TOOL_VARIABLES],
+ [
+ GNU_AS=
+-GNU_LD=
+ 
+ GNU_CC=
+ GNU_CXX=
+ if test "$CC_TYPE" = "gcc"; then
+     GNU_CC=1
+     GNU_CXX=1
+ fi
+ 
+ if test "`echo | $AS -o conftest.out -v 2>&1 | grep -c GNU`" != "0"; then
+     GNU_AS=1
+ fi
+ rm -f conftest.out
+-if test "`echo | $LD -v 2>&1 | grep -c GNU`" != "0"; then
+-    GNU_LD=1
+-fi
+ 
+ CLANG_CC=
+ CLANG_CXX=
+ CLANG_CL=
+ if test "$CC_TYPE" = "clang"; then
+     GNU_CC=1
+     GNU_CXX=1
+     CLANG_CC=1
+diff --git a/js/src/old-configure.in b/js/src/old-configure.in
+--- a/js/src/old-configure.in
++++ b/js/src/old-configure.in
+@@ -294,17 +294,16 @@ if test -n "$SBCONF"; then
+         QEMU_CANT_RUN_JS_SHELL=1
+     fi
+ fi
+ AC_SUBST(QEMU_CANT_RUN_JS_SHELL)
+ 
+ AC_SUBST(_MSC_VER)
+ 
+ AC_SUBST(GNU_AS)
+-AC_SUBST(GNU_LD)
+ AC_SUBST(GNU_CC)
+ AC_SUBST(GNU_CXX)
+ 
+ dnl ========================================================
+ dnl Checks for programs.
+ dnl ========================================================
+ if test "$COMPILE_ENVIRONMENT"; then
+ 
+diff --git a/old-configure.in b/old-configure.in
+--- a/old-configure.in
++++ b/old-configure.in
+@@ -421,17 +421,16 @@ if test -n "$_WIN32_MSVC"; then
+ fi
+ 
+ fi # COMPILE_ENVIRONMENT
+ 
+ AC_SUBST(MIDL_FLAGS)
+ AC_SUBST(_MSC_VER)
+ 
+ AC_SUBST(GNU_AS)
+-AC_SUBST(GNU_LD)
+ AC_SUBST(GNU_CC)
+ AC_SUBST(GNU_CXX)
+ 
+ AC_SUBST(STL_FLAGS)
+ AC_SUBST(WRAP_STL_INCLUDES)
+ AC_SUBST(MOZ_MSVC_STL_WRAP_RAISE)
+ 
+ dnl ========================================================
+

+ 288 - 0
mozilla-esr52/patches/1317504-4.patch

@@ -0,0 +1,288 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1479969916 -32400
+# Node ID 6353e704bf2c4d47610f0e3555d2fd47c002ebda
+# Parent  fd007caf51dfebb5224316c5d0978d15a2cfcc4b
+Bug 1317504 - Make MSVC builds use the LINK variable instead of LD. r=chmanchester
+
+At the same time, remove HOST_LD. It was only used for MSVC builds,
+which don't support cross-compile anyways, so we can, at least for now,
+use LINK for both host and target.
+
+diff --git a/build/moz.configure/windows.configure b/build/moz.configure/windows.configure
+--- a/build/moz.configure/windows.configure
++++ b/build/moz.configure/windows.configure
+@@ -408,17 +408,17 @@ def valid_mt(path):
+ 
+ 
+ set_config('MSMANIFEST_TOOL', depends(valid_mt)(lambda x: bool(x)))
+ 
+ 
+ link = check_prog('LINK', depends_win()(lambda: ('link.exe',)),
+                   paths=vc_compiler_path)
+ 
+-add_old_configure_assignment('LD', depends_win(link)(lambda x: x))
++add_old_configure_assignment('LINK', depends_win(link)(lambda x: x))
+ 
+ 
+ # Normally, we'd just have CC, etc. set to absolute paths, but the build system
+ # doesn't currently handle properly the case where the paths contain spaces.
+ # Additionally, there's the issue described in toolchain.configure, in
+ # valid_compiler().
+ @depends_win(sdk_bin_path)
+ @imports('os')
+diff --git a/config/config.mk b/config/config.mk
+--- a/config/config.mk
++++ b/config/config.mk
+@@ -543,17 +543,17 @@ CREATE_PRECOMPLETE_CMD = $(PYTHON) $(abs
+ # MDDEPDIR is the subdirectory where dependency files are stored
+ MDDEPDIR := .deps
+ 
+ EXPAND_LIBS_EXEC = $(PYTHON) $(MOZILLA_DIR)/config/expandlibs_exec.py
+ EXPAND_LIBS_GEN = $(PYTHON) $(MOZILLA_DIR)/config/expandlibs_gen.py
+ EXPAND_AR = $(EXPAND_LIBS_EXEC) --extract -- $(AR)
+ EXPAND_CC = $(EXPAND_LIBS_EXEC) --uselist -- $(CC)
+ EXPAND_CCC = $(EXPAND_LIBS_EXEC) --uselist -- $(CCC)
+-EXPAND_LD = $(EXPAND_LIBS_EXEC) --uselist -- $(LD)
++EXPAND_LINK = $(EXPAND_LIBS_EXEC) --uselist -- $(LINK)
+ EXPAND_MKSHLIB_ARGS = --uselist
+ ifdef SYMBOL_ORDER
+ EXPAND_MKSHLIB_ARGS += --symbol-order $(SYMBOL_ORDER)
+ endif
+ EXPAND_MKSHLIB = $(EXPAND_LIBS_EXEC) $(EXPAND_MKSHLIB_ARGS) -- $(MKSHLIB)
+ 
+ # $(call CHECK_SYMBOLS,lib,PREFIX,dep_name,test)
+ # Checks that the given `lib` doesn't contain dependency on symbols with a
+diff --git a/config/rules.mk b/config/rules.mk
+--- a/config/rules.mk
++++ b/config/rules.mk
+@@ -635,17 +635,17 @@ alltags:
+ #
+ # PROGRAM = Foo
+ # creates OBJS, links with LIBS to create Foo
+ #
+ $(PROGRAM): $(PROGOBJS) $(STATIC_LIBS_DEPS) $(EXTRA_DEPS) $(EXE_DEF_FILE) $(RESFILE) $(GLOBAL_DEPS)
+ 	$(REPORT_BUILD)
+ 	@$(RM) $@.manifest
+ ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
+-	$(EXPAND_LD) -NOLOGO -OUT:$@ -PDB:$(LINK_PDBFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(MOZ_PROGRAM_LDFLAGS) $(PROGOBJS) $(RESFILE) $(STATIC_LIBS) $(SHARED_LIBS) $(EXTRA_LIBS) $(OS_LIBS)
++	$(EXPAND_LINK) -NOLOGO -OUT:$@ -PDB:$(LINK_PDBFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(MOZ_PROGRAM_LDFLAGS) $(PROGOBJS) $(RESFILE) $(STATIC_LIBS) $(SHARED_LIBS) $(EXTRA_LIBS) $(OS_LIBS)
+ ifdef MSMANIFEST_TOOL
+ 	@if test -f $@.manifest; then \
+ 		if test -f '$(srcdir)/$@.manifest'; then \
+ 			echo 'Embedding manifest from $(srcdir)/$@.manifest and $@.manifest'; \
+ 			$(MT) -NOLOGO -MANIFEST '$(win_srcdir)/$@.manifest' $@.manifest -OUTPUTRESOURCE:$@\;1; \
+ 		else \
+ 			echo 'Embedding manifest from $@.manifest'; \
+ 			$(MT) -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \
+@@ -670,17 +670,17 @@ ifdef ENABLE_STRIP
+ endif
+ ifdef MOZ_POST_PROGRAM_COMMAND
+ 	$(MOZ_POST_PROGRAM_COMMAND) $@
+ endif
+ 
+ $(HOST_PROGRAM): $(HOST_PROGOBJS) $(HOST_LIBS) $(HOST_EXTRA_DEPS) $(GLOBAL_DEPS)
+ 	$(REPORT_BUILD)
+ ifeq (_WINNT,$(GNU_CC)_$(HOST_OS_ARCH))
+-	$(EXPAND_LIBS_EXEC) -- $(HOST_LD) -NOLOGO -OUT:$@ -PDB:$(HOST_PDBFILE) $(HOST_OBJS) $(WIN32_EXE_LDFLAGS) $(HOST_LDFLAGS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
++	$(EXPAND_LIBS_EXEC) -- $(LINK) -NOLOGO -OUT:$@ -PDB:$(HOST_PDBFILE) $(HOST_OBJS) $(WIN32_EXE_LDFLAGS) $(HOST_LDFLAGS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
+ ifdef MSMANIFEST_TOOL
+ 	@if test -f $@.manifest; then \
+ 		if test -f '$(srcdir)/$@.manifest'; then \
+ 			echo 'Embedding manifest from $(srcdir)/$@.manifest and $@.manifest'; \
+ 			$(MT) -NOLOGO -MANIFEST '$(win_srcdir)/$@.manifest' $@.manifest -OUTPUTRESOURCE:$@\;1; \
+ 		else \
+ 			echo 'Embedding manifest from $@.manifest'; \
+ 			$(MT) -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \
+@@ -707,17 +707,17 @@ endif
+ # Foo.o (from either Foo.c or Foo.cpp).
+ #
+ # SIMPLE_PROGRAMS = Foo Bar
+ # creates Foo.o Bar.o, links with LIBS to create Foo, Bar.
+ #
+ $(SIMPLE_PROGRAMS): %$(BIN_SUFFIX): %.$(OBJ_SUFFIX) $(STATIC_LIBS_DEPS) $(EXTRA_DEPS) $(GLOBAL_DEPS)
+ 	$(REPORT_BUILD)
+ ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
+-	$(EXPAND_LD) -nologo -out:$@ -pdb:$(LINK_PDBFILE) $< $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(MOZ_PROGRAM_LDFLAGS) $(STATIC_LIBS) $(SHARED_LIBS) $(EXTRA_LIBS) $(OS_LIBS)
++	$(EXPAND_LINK) -nologo -out:$@ -pdb:$(LINK_PDBFILE) $< $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(MOZ_PROGRAM_LDFLAGS) $(STATIC_LIBS) $(SHARED_LIBS) $(EXTRA_LIBS) $(OS_LIBS)
+ ifdef MSMANIFEST_TOOL
+ 	@if test -f $@.manifest; then \
+ 		$(MT) -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \
+ 		rm -f $@.manifest; \
+ 	fi
+ endif	# MSVC with manifest tool
+ else
+ 	$(EXPAND_CCC) $(CXXFLAGS) -o $@ $< $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(WRAP_LDFLAGS) $(STATIC_LIBS) $(MOZ_PROGRAM_LDFLAGS) $(SHARED_LIBS) $(EXTRA_LIBS) $(OS_LIBS) $(BIN_FLAGS)
+@@ -729,17 +729,17 @@ ifdef ENABLE_STRIP
+ endif
+ ifdef MOZ_POST_PROGRAM_COMMAND
+ 	$(MOZ_POST_PROGRAM_COMMAND) $@
+ endif
+ 
+ $(HOST_SIMPLE_PROGRAMS): host_%$(HOST_BIN_SUFFIX): host_%.$(OBJ_SUFFIX) $(HOST_LIBS) $(HOST_EXTRA_DEPS) $(GLOBAL_DEPS)
+ 	$(REPORT_BUILD)
+ ifeq (WINNT_,$(HOST_OS_ARCH)_$(GNU_CC))
+-	$(EXPAND_LIBS_EXEC) -- $(HOST_LD) -NOLOGO -OUT:$@ -PDB:$(HOST_PDBFILE) $< $(WIN32_EXE_LDFLAGS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
++	$(EXPAND_LIBS_EXEC) -- $(LINK) -NOLOGO -OUT:$@ -PDB:$(HOST_PDBFILE) $< $(WIN32_EXE_LDFLAGS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
+ else
+ ifneq (,$(HOST_CPPSRCS)$(USE_HOST_CXX))
+ 	$(EXPAND_LIBS_EXEC) -- $(HOST_CXX) $(HOST_OUTOPTION)$@ $(HOST_CXXFLAGS) $(INCLUDES) $< $(HOST_LIBS) $(HOST_EXTRA_LIBS)
+ else
+ 	$(EXPAND_LIBS_EXEC) -- $(HOST_CC) $(HOST_OUTOPTION)$@ $(HOST_CFLAGS) $(INCLUDES) $< $(HOST_LIBS) $(HOST_EXTRA_LIBS)
+ endif
+ endif
+ ifndef CROSS_COMPILE
+diff --git a/js/src/old-configure.in b/js/src/old-configure.in
+--- a/js/src/old-configure.in
++++ b/js/src/old-configure.in
+@@ -203,17 +203,17 @@ case "$target" in
+             CXXFLAGS="$CXXFLAGS -Zc:threadSafeInit-"
+             ;;
+         esac
+         AC_SUBST(MSVS_VERSION)
+         AC_SUBST(MSVC_C_RUNTIME_DLL)
+         AC_SUBST(MSVC_CXX_RUNTIME_DLL)
+ 
+         # Check linker version
+-        _LD_FULL_VERSION=`"${LD}" -v 2>&1 | sed -nre "$_MSVC_VER_FILTER"`
++        _LD_FULL_VERSION=`"${LINK}" -v 2>&1 | sed -nre "$_MSVC_VER_FILTER"`
+         _LD_MAJOR_VERSION=`echo ${_LD_FULL_VERSION} | $AWK -F\. '{ print $1 }'`
+         if test "$_LD_MAJOR_VERSION" != "$_CC_SUITE"; then
+             AC_MSG_ERROR([The linker major version, $_LD_FULL_VERSION,  does not match the compiler suite version, $_CC_SUITE.])
+         fi
+ 
+         INCREMENTAL_LINKER=1
+ 
+         unset _MSVC_VER_FILTER
+@@ -672,33 +672,32 @@ case "$target" in
+         IMPORT_LIB_SUFFIX=a
+ 
+         WIN32_CONSOLE_EXE_LDFLAGS=-mconsole
+         WIN32_GUI_EXE_LDFLAGS=-mwindows
+     else
+         TARGET_COMPILER_ABI=msvc
+         HOST_CC='$(CC)'
+         HOST_CXX='$(CXX)'
+-        HOST_LD='$(LD)'
+         if test "$AS_BIN"; then
+             AS="$(basename "$AS_BIN")"
+         fi
+         AR='lib'
+         AR_FLAGS='-NOLOGO -OUT:$@'
+         AR_EXTRACT=
+         RANLIB='echo not_ranlib'
+         STRIP='echo not_strip'
+         PKG_SKIP_STRIP=1
+         OBJ_SUFFIX=obj
+         LIB_SUFFIX=lib
+         DLL_PREFIX=
+         LIB_PREFIX=
+         IMPORT_LIB_SUFFIX=lib
+-        MKSHLIB='$(LD) -NOLOGO -DLL -OUT:$@ -PDB:$(LINK_PDBFILE) $(DSO_LDOPTS)'
+-        MKCSHLIB='$(LD) -NOLOGO -DLL -OUT:$@ -PDB:$(LINK_PDBFILE) $(DSO_LDOPTS)'
++        MKSHLIB='$(LINK) -NOLOGO -DLL -OUT:$@ -PDB:$(LINK_PDBFILE) $(DSO_LDOPTS)'
++        MKCSHLIB='$(LINK) -NOLOGO -DLL -OUT:$@ -PDB:$(LINK_PDBFILE) $(DSO_LDOPTS)'
+         dnl Set subsystem version 5 for Windows XP.
+         if test "$CPU_ARCH" = "x86"; then
+             WIN32_SUBSYSTEM_VERSION=5.01
+         else
+             WIN32_SUBSYSTEM_VERSION=6.01
+         fi
+         WIN32_CONSOLE_EXE_LDFLAGS=-SUBSYSTEM:CONSOLE,$WIN32_SUBSYSTEM_VERSION
+         WIN32_GUI_EXE_LDFLAGS=-SUBSYSTEM:WINDOWS,$WIN32_SUBSYSTEM_VERSION
+@@ -2160,17 +2159,16 @@ AC_SUBST(HOST_CC)
+ AC_SUBST(HOST_CXX)
+ AC_SUBST(HOST_CFLAGS)
+ AC_SUBST(HOST_CPPFLAGS)
+ AC_SUBST(HOST_CXXFLAGS)
+ AC_SUBST(HOST_LDFLAGS)
+ AC_SUBST(HOST_OPTIMIZE_FLAGS)
+ AC_SUBST(HOST_AR)
+ AC_SUBST(HOST_AR_FLAGS)
+-AC_SUBST(HOST_LD)
+ AC_SUBST(HOST_RANLIB)
+ AC_SUBST(HOST_BIN_SUFFIX)
+ 
+ AC_SUBST(TARGET_XPCOM_ABI)
+ 
+ AC_SUBST(WRAP_LDFLAGS)
+ AC_SUBST(MKSHLIB)
+ AC_SUBST(MKCSHLIB)
+diff --git a/old-configure.in b/old-configure.in
+--- a/old-configure.in
++++ b/old-configure.in
+@@ -292,17 +292,17 @@ case "$target" in
+         if test -n "$WIN32_REDIST_DIR"; then
+           if test ! -d "$WIN32_REDIST_DIR"; then
+             AC_MSG_ERROR([Invalid Win32 Redist directory: ${WIN32_REDIST_DIR}])
+           fi
+           WIN32_REDIST_DIR=`cd "$WIN32_REDIST_DIR" && pwd -W`
+         fi
+ 
+         # Check linker version
+-        _LD_FULL_VERSION=`"${LD}" -v 2>&1 | sed -nre "$_MSVC_VER_FILTER"`
++        _LD_FULL_VERSION=`"${LINK}" -v 2>&1 | sed -nre "$_MSVC_VER_FILTER"`
+         _LD_MAJOR_VERSION=`echo ${_LD_FULL_VERSION} | $AWK -F\. '{ print $1 }'`
+         if test "$_LD_MAJOR_VERSION" != "$_CC_SUITE"; then
+             AC_MSG_ERROR([The linker major version, $_LD_FULL_VERSION,  does not match the compiler suite version, $_CC_SUITE.])
+         fi
+ 
+         INCREMENTAL_LINKER=1
+ 
+         # Set midl environment
+@@ -959,33 +959,32 @@ case "$target" in
+ 
+         # GCC/binutils can't link to a function if we try to include dllexport function
+         # in the same library as dllimport caller. To work around it, we build NSPR
+         # and NSS with -mnop-fun-dllimport flag. The drawback of this solution is that
+         # function thunks need to be generated for cross-DLL calls.
+         MOZ_FOLD_LIBS_FLAGS=-mnop-fun-dllimport
+     else
+         TARGET_COMPILER_ABI=msvc
+-        HOST_LD='$(LD)'
+         if test "$AS_BIN"; then
+             AS="$(basename "$AS_BIN")"
+         fi
+         AR='lib'
+         AR_FLAGS='-NOLOGO -OUT:$@'
+         AR_EXTRACT=
+         RANLIB='echo not_ranlib'
+         STRIP='echo not_strip'
+         PKG_SKIP_STRIP=1
+         OBJ_SUFFIX=obj
+         LIB_SUFFIX=lib
+         DLL_PREFIX=
+         LIB_PREFIX=
+         IMPORT_LIB_SUFFIX=lib
+-        MKSHLIB='$(LD) -NOLOGO -DLL -OUT:$@ -PDB:$(LINK_PDBFILE) $(DSO_LDOPTS)'
+-        MKCSHLIB='$(LD) -NOLOGO -DLL -OUT:$@ -PDB:$(LINK_PDBFILE) $(DSO_LDOPTS)'
++        MKSHLIB='$(LINK) -NOLOGO -DLL -OUT:$@ -PDB:$(LINK_PDBFILE) $(DSO_LDOPTS)'
++        MKCSHLIB='$(LINK) -NOLOGO -DLL -OUT:$@ -PDB:$(LINK_PDBFILE) $(DSO_LDOPTS)'
+         dnl Set subsystem version 5 for Windows XP.
+         if test "$CPU_ARCH" = "x86"; then
+             WIN32_SUBSYSTEM_VERSION=5.01
+         else
+             WIN32_SUBSYSTEM_VERSION=6.01
+         fi
+         WIN32_CONSOLE_EXE_LDFLAGS=-SUBSYSTEM:CONSOLE,$WIN32_SUBSYSTEM_VERSION
+         WIN32_GUI_EXE_LDFLAGS=-SUBSYSTEM:WINDOWS,$WIN32_SUBSYSTEM_VERSION
+@@ -5621,17 +5620,16 @@ AC_SUBST(HOST_CC)
+ AC_SUBST(HOST_CXX)
+ AC_SUBST(HOST_CFLAGS)
+ AC_SUBST(HOST_CPPFLAGS)
+ AC_SUBST(HOST_CXXFLAGS)
+ AC_SUBST(HOST_LDFLAGS)
+ AC_SUBST(HOST_OPTIMIZE_FLAGS)
+ AC_SUBST(HOST_AR)
+ AC_SUBST(HOST_AR_FLAGS)
+-AC_SUBST(HOST_LD)
+ AC_SUBST(HOST_RANLIB)
+ AC_SUBST(HOST_BIN_SUFFIX)
+ 
+ AC_SUBST(TARGET_XPCOM_ABI)
+ AC_SUBST(HAVE_TOOLCHAIN_SUPPORT_MSSSE3)
+ AC_SUBST(HAVE_TOOLCHAIN_SUPPORT_MSSE4_1)
+ AC_SUBST(HAVE_X86_AVX2)
+ AC_SUBST(HAVE_ALTIVEC)
+

+ 121 - 0
mozilla-esr52/patches/1317504-5.patch

@@ -0,0 +1,121 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1479970030 -32400
+# Node ID 8c1409a443ee41860f8caaf59a149ab83c467736
+# Parent  02b47786b36c47858b5c4ac40b5332f021aaec82
+Bug 1317504 - Don't try to set LD from old-configure. r=chmanchester
+
+Now, it's completely unused.
+
+diff -r 02b47786b36c build/autoconf/ios.m4
+--- a/build/autoconf/ios.m4	Thu Nov 24 15:45:16 2016 +0900
++++ b/build/autoconf/ios.m4	Mon Aug 13 18:33:39 2018 +0200
+@@ -96,7 +96,6 @@
+    MOZ_IOS_PATH_PROG(CC, clang, $ARGS)
+    MOZ_IOS_PATH_PROG(CXX, clang++, $ARGS)
+    export CPP="$CC -E"
+-   export LD="$CXX"
+    MOZ_IOS_PATH_PROG(AR)
+    MOZ_IOS_PATH_PROG(AS, as, $ARGS)
+    MOZ_IOS_PATH_PROG(OTOOL)
+diff -r 02b47786b36c build/autoconf/jemalloc.m4
+--- a/build/autoconf/jemalloc.m4	Thu Nov 24 15:45:16 2016 +0900
++++ b/build/autoconf/jemalloc.m4	Mon Aug 13 18:33:39 2018 +0200
+@@ -73,7 +73,7 @@
+       ac_configure_args="$ac_configure_args --disable-tls"
+     fi
+     EXTRA_CFLAGS="$CFLAGS"
+-    for var in AS CC CXX CPP LD AR RANLIB STRIP CPPFLAGS EXTRA_CFLAGS LDFLAGS; do
++    for var in AS CC CXX CPP AR RANLIB STRIP CPPFLAGS EXTRA_CFLAGS LDFLAGS; do
+       ac_configure_args="$ac_configure_args $var='`eval echo \\${${var}}`'"
+     done
+ 
+diff -r 02b47786b36c build/autoconf/toolchain.m4
+--- a/build/autoconf/toolchain.m4	Thu Nov 24 15:45:16 2016 +0900
++++ b/build/autoconf/toolchain.m4	Mon Aug 13 18:33:39 2018 +0200
+@@ -78,7 +78,6 @@
+ AC_CHECK_PROGS(RANLIB, "${TOOLCHAIN_PREFIX}ranlib", :)
+ AC_CHECK_PROGS(AR, "${TOOLCHAIN_PREFIX}ar", :)
+ AC_CHECK_PROGS(AS, "${TOOLCHAIN_PREFIX}as", :)
+-AC_CHECK_PROGS(LD, "${TOOLCHAIN_PREFIX}ld", :)
+ AC_CHECK_PROGS(LIPO, "${TOOLCHAIN_PREFIX}lipo", :)
+ AC_CHECK_PROGS(STRIP, "${TOOLCHAIN_PREFIX}strip", :)
+ AC_CHECK_PROGS(WINDRES, "${TOOLCHAIN_PREFIX}windres", :)
+diff -r 02b47786b36c build/macosx/universal/mozconfig.common
+--- a/build/macosx/universal/mozconfig.common	Thu Nov 24 15:45:16 2016 +0900
++++ b/build/macosx/universal/mozconfig.common	Mon Aug 13 18:33:39 2018 +0200
+@@ -41,7 +41,6 @@
+   RANLIB="${TOOLCHAIN_PREFIX}ranlib"
+   AR="${TOOLCHAIN_PREFIX}ar"
+   AS=$CC
+-  LD=ld
+   STRIP="${TOOLCHAIN_PREFIX}strip"
+   OTOOL="${TOOLCHAIN_PREFIX}otool"
+ 
+@@ -50,6 +49,6 @@
+   # needs to know to look for universal bits when building the .dmg.
+   UNIVERSAL_BINARY=1
+ 
+-  export CC CXX HOST_CC HOST_CXX RANLIB AR AS LD STRIP OTOOL
++  export CC CXX HOST_CC HOST_CXX RANLIB AR AS STRIP OTOOL
+ fi
+ fi
+diff -r 02b47786b36c js/src/old-configure.in
+--- a/js/src/old-configure.in	Thu Nov 24 15:45:16 2016 +0900
++++ b/js/src/old-configure.in	Mon Aug 13 18:33:39 2018 +0200
+@@ -118,7 +118,6 @@
+     AC_PROG_RANLIB
+     MOZ_PATH_PROGS(AS, $AS as, $CC)
+     AC_CHECK_PROGS(AR, ar, :)
+-    AC_CHECK_PROGS(LD, ld, :)
+     AC_CHECK_PROGS(STRIP, strip, :)
+     AC_CHECK_PROGS(WINDRES, windres, :)
+     if test -z "$HOST_CC"; then
+@@ -2077,7 +2076,6 @@
+ AC_SUBST(AS)
+ AC_SUBST(ASFLAGS)
+ AC_SUBST(AS_DASH_C_FLAG)
+-AC_SUBST(LD)
+ AC_SUBST(RC)
+ AC_SUBST(RCFLAGS)
+ AC_SUBST(WINDRES)
+diff -r 02b47786b36c old-configure.in
+--- a/old-configure.in	Thu Nov 24 15:45:16 2016 +0900
++++ b/old-configure.in	Mon Aug 13 18:33:39 2018 +0200
+@@ -187,7 +187,6 @@
+     AC_PROG_RANLIB
+     MOZ_PATH_PROGS(AS, $AS as, $CC)
+     AC_CHECK_PROGS(AR, ar, :)
+-    AC_CHECK_PROGS(LD, ld, :)
+     AC_CHECK_PROGS(STRIP, strip, :)
+     AC_CHECK_PROGS(WINDRES, windres, :)
+     AC_CHECK_PROGS(OTOOL, otool, :)
+@@ -5245,7 +5244,6 @@
+ AC_SUBST(AS)
+ AC_SUBST(ASFLAGS)
+ AC_SUBST(AS_DASH_C_FLAG)
+-AC_SUBST(LD)
+ AC_SUBST(RC)
+ AC_SUBST(RCFLAGS)
+ AC_SUBST(WINDRES)
+@@ -5930,7 +5928,6 @@
+ export CPP
+ export CC
+ export CXX
+-export LD
+ export ARFLAGS
+ export CPPFLAGS
+ export CFLAGS
+diff -r 02b47786b36c toolkit/mozapps/installer/informulate.py
+--- a/toolkit/mozapps/installer/informulate.py	Thu Nov 24 15:45:16 2016 +0900
++++ b/toolkit/mozapps/installer/informulate.py	Mon Aug 13 18:33:39 2018 +0200
+@@ -32,7 +32,7 @@
+         'host_alias', 'host_cpu', 'host_os', 'host_vendor',
+         'MOZ_UPDATE_CHANNEL', 'MOZ_APP_VENDOR', 'MOZ_APP_NAME',
+         'MOZ_APP_VERSION', 'MOZ_APP_MAXVERSION', 'MOZ_APP_ID',
+-        'CC', 'CXX', 'LD', 'AS']
++        'CC', 'CXX', 'AS']
+ 
+     all_key_value_pairs = dict([(x.lower(), buildconfig.substs[x]) for x in important_substitutions])
+     all_key_value_pairs.update(parse_cmdline(sys.argv[2:]))

+ 4145 - 0
mozilla-esr52/patches/1318143-1.patch

@@ -0,0 +1,4145 @@
+
+# HG changeset patch
+# User Ted Mielczarek <ted@mielczarek.org>
+# Date 1493234328 14400
+# Node ID 311336b5377de438e6e71e4ad4eca6b18da2b37c
+# Parent  43ccab8eba5e5142878c9927d6647bf461dd7bd1
+bug 1318143 - add support for detecting Visual Studio 2017 to configure. r=gps
+
+This patch adds a copy of vswhere.exe to build/win32, downloaded from the
+current latest release (1.0.62):
+https://github.com/Microsoft/vswhere/releases/download/1.0.62/vswhere.exe
+
+It changes toolchain.configure to invoke vswhere.exe instead of reading
+the registry, since that no longer works for VS2017 (but vswhere can locate
+VS2015). It also removes a layer of complexity in that code by dropping
+support for non-64-bit host systems, since we don't really support building
+on 32-bit Windows anymore anyway.
+
+There's a little bit of fixup in windows.configure where some LIB paths
+have changed in 2017.
+
+MozReview-Commit-ID: 5XLWjidS6W4
+
+diff --git a/build/moz.configure/toolchain.configure b/build/moz.configure/toolchain.configure
+--- a/build/moz.configure/toolchain.configure
++++ b/build/moz.configure/toolchain.configure
+@@ -405,67 +405,72 @@ def check_compiler(compiler, language, t
+         version=info.version,
+         target_cpu=info.cpu,
+         target_kernel=info.kernel,
+         target_endianness=info.endianness,
+         flags=flags,
+     )
+ 
+ 
+-@imports(_from='collections', _import='defaultdict')
+-@imports(_from='__builtin__', _import='sorted')
+-def get_vc_paths(base):
+-    vc = defaultdict(lambda: defaultdict(dict))
+-    subkey = r'Microsoft\VisualStudio\VC\*\*\*\Compiler'
+-    for v, h, t, p in get_registry_values(base + '\\' + subkey):
+-        vc[v][h][t] = p
+-    if not vc:
+-        return
+-    version, data = sorted(vc.iteritems(), key=lambda x: Version(x[0]))[-1]
+-    return data
++@imports(_from='__builtin__', _import='open')
++@imports('json')
++@imports('subprocess')
++def get_vc_paths(topsrcdir):
++    def vswhere(args):
++        return json.loads(subprocess.check_output([os.path.join(topsrcdir, 'build/win32/vswhere.exe'), '-format', 'json'] + args))
++
++    # Can't pass -requires with -legacy, so query each separately.
++    # Legacy versions first (VS2015)
++    for install in vswhere(['-legacy', '-version', '[14.0,15.0)']):
++        version = Version(install['installationVersion'])
++        # Skip anything older than VS2015.
++        if version < '14':
++            continue
++        path = install['installationPath']
++
++        yield (Version(install['installationVersion']), {
++            'x64': [os.path.join(path, r'VC\bin\amd64')],
++            'x86': [os.path.join(path, r'VC\bin\amd64_x86')],
++        })
++    # Then VS2017 and newer.
++    for install in vswhere(['-requires', 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64']):
++        path = install['installationPath']
++        tools_version = open(os.path.join(path, r'VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt'), 'rb').read().strip()
++        tools_path = os.path.join(path, r'VC\Tools\MSVC', tools_version, r'bin\HostX64')
++        yield (Version(install['installationVersion']), {
++            'x64': [os.path.join(tools_path, 'x64')],
++            # The x64->x86 cross toolchain requires DLLs from the native x64 toolchain.
++            'x86': [os.path.join(tools_path, 'x86'), os.path.join(tools_path, 'x64')],
++        })
+ 
+ 
+-@depends(host)
++@depends(host, target, check_build_environment)
++@imports(_from='__builtin__', _import='sorted')
++@imports(_from='operator', _import='itemgetter')
+ @imports('platform')
+-def vc_compiler_path(host):
++def vc_compiler_path(host, target, env):
+     if host.kernel != 'WINNT':
+         return
+-    vc_host = {
+-        'x86': 'x86',
+-        'AMD64': 'x64',
+-    }.get(platform.machine())
+-    if vc_host is None:
+-        return
+     vc_target = {
+         'x86': 'x86',
+         'x86_64': 'x64',
+         'arm': 'arm',
+-    }.get(host.cpu)
++    }.get(target.cpu)
+     if vc_target is None:
+         return
+ 
+-    base_key = r'HKEY_LOCAL_MACHINE\SOFTWARE'
+-    data = get_vc_paths(base_key)
+-    if not data:
+-        data = get_vc_paths(base_key + r'\Wow6432Node')
+-    if not data:
++    all_versions = sorted(get_vc_paths(env.topsrcdir), key=itemgetter(0))
++    if not all_versions:
+         return
+-
+-    path = data.get(vc_host, {}).get(vc_target)
+-    if not path and vc_host == 'x64':
+-        vc_host = 'x86'
+-        path = data.get(vc_host, {}).get(vc_target)
+-    if not path:
++    # Choose the newest version.
++    data = all_versions[-1][1]
++    paths = data.get(vc_target)
++    if not paths:
+         return
+-    path = os.path.dirname(path)
+-    if vc_host != vc_target:
+-        other_path = data.get(vc_host, {}).get(vc_host)
+-        if other_path:
+-            return (path, os.path.dirname(other_path))
+-    return (path,)
++    return paths
+ 
+ 
+ @depends(vc_compiler_path)
+ @imports('os')
+ def toolchain_search_path(vc_compiler_path):
+     if vc_compiler_path:
+         result = [os.environ.get('PATH')]
+         result.extend(vc_compiler_path)
+diff --git a/build/moz.configure/windows.configure b/build/moz.configure/windows.configure
+--- a/build/moz.configure/windows.configure
++++ b/build/moz.configure/windows.configure
+@@ -247,22 +247,27 @@ def vc_path(c_compiler):
+             die('Cannot determine the Visual C++ directory the compiler (%s) '
+                 'is in' % cl)
+         result = next
+         if p.lower() == 'bin':
+             break
+     return result
+ 
+ 
+-@depends(vc_path)
++@depends(vc_path, c_compiler)
+ @checking('for the Debug Interface Access SDK', lambda x: x or 'not found')
+ @imports(_from='os.path', _import='isdir')
+-def dia_sdk_dir(vc_path):
++def dia_sdk_dir(vc_path, c_compiler):
+     if vc_path:
+-        path = os.path.join(os.path.dirname(vc_path), 'DIA SDK')
++        if c_compiler.version < '19.10':
++            path = os.path.join(os.path.dirname(vc_path), 'DIA SDK')
++        else:
++            # This would be easier if we had the installationPath that
++            # get_vc_paths works with, since 'DIA SDK' is relative to that.
++             path = os.path.normpath(os.path.join(vc_path, r'..\..\..\..\..\..\..\DIA SDK'))
+         if isdir(path):
+             return path
+ 
+ 
+ @depends(vc_path, valid_windows_sdk_dir, valid_ucrt_sdk_dir, dia_sdk_dir)
+ @imports('os')
+ def include_path(vc_path, windows_sdk_dir, ucrt_sdk_dir, dia_sdk_dir):
+     if not vc_path:
+@@ -294,60 +299,65 @@ def include_path(vc_path, windows_sdk_di
+     # Set in the environment for old-configure
+     includes = os.pathsep.join(includes)
+     os.environ['INCLUDE'] = includes
+     return includes
+ 
+ set_config('INCLUDE', include_path)
+ 
+ 
+-@depends(target, vc_path, valid_windows_sdk_dir, valid_ucrt_sdk_dir, dia_sdk_dir)
++@depends(target, c_compiler, vc_path, valid_windows_sdk_dir, valid_ucrt_sdk_dir, dia_sdk_dir)
+ @imports('os')
+-def lib_path(target, vc_path, windows_sdk_dir, ucrt_sdk_dir, dia_sdk_dir):
++def lib_path(target, c_compiler, vc_path, windows_sdk_dir, ucrt_sdk_dir, dia_sdk_dir):
+     if not vc_path:
+         return
+-    vc_target = {
+-        'x86': '',
+-        'x86_64': 'amd64',
+-        'arm': 'arm',
+-    }.get(target.cpu)
+-    if vc_target is None:
+-        return
+-    # As vc_target can be '', and os.path.join will happily use the empty
+-    # string, leading to a string ending with a backslash, that Make will
+-    # interpret as a "string continues on next line" indicator, use variable
+-    # args.
+-    vc_target = (vc_target,) if vc_target else ()
+     sdk_target = {
+         'x86': 'x86',
+         'x86_64': 'x64',
+         'arm': 'arm',
+     }.get(target.cpu)
+ 
++    old_target = {
++        'x86': '',
++        'x86_64': 'amd64',
++        'arm': 'arm',
++    }.get(target.cpu)
++    if old_target is None:
++        return
++    # As old_target can be '', and os.path.join will happily use the empty
++    # string, leading to a string ending with a backslash, that Make will
++    # interpret as a "string continues on next line" indicator, use variable
++    # args.
++    old_target = (old_target,) if old_target else ()
++    if c_compiler.version < '19.10':
++        # MSVC2015
++        vc_target = old_target
++    else:
++        # MSVC2017 switched to use the same target naming as the sdk.
++        vc_target = (sdk_target,)
++
+     atlmfc_dir = os.path.join(vc_path, 'atlmfc', 'lib', *vc_target)
+     if not os.path.isdir(atlmfc_dir):
+-        # For Visual Studio 2017
+-        atlmfc_dir = os.path.join(vc_path, 'atlmfc', 'lib', sdk_target)
+-        if not os.path.isdir(atlmfc_dir):
+-            die('Cannot find the ATL/MFC libraries in the Visual C++ directory '
+-                '(%s). Please install them.' % vc_path)
+-
++        die('Cannot find the ATL/MFC libraries in the Visual C++ directory '
++            '(%s). Please install them.' % vc_path)
+ 
+     libs = []
+     lib_env = os.environ.get('LIB')
+     if lib_env:
+         libs.append(lib_env)
+     libs.extend((
+         os.path.join(vc_path, 'lib', *vc_target),
+         atlmfc_dir,
+         os.path.join(windows_sdk_dir.lib, 'um', sdk_target),
+         os.path.join(ucrt_sdk_dir.lib, 'ucrt', sdk_target),
+     ))
+     if dia_sdk_dir:
+-        libs.append(os.path.join(dia_sdk_dir, 'lib', *vc_target))
++        # For some reason the DIA SDK still uses the old-style targets
++        # even in a newer MSVC.
++        libs.append(os.path.join(dia_sdk_dir, 'lib', *old_target))
+     # Set in the environment for old-configure
+     libs = os.pathsep.join(libs)
+     os.environ['LIB'] = libs
+     return libs
+ 
+ set_config('LIB', lib_path)
+ 
+ 
+diff --git a/build/win32/vswhere.exe b/build/win32/vswhere.exe
+new file mode 100644
+index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..80706d852e5777c4ec05a6f349c7cd55cd490a5b
+GIT binary patch
+literal 401016
+zc%0mQeS8x|`uHZ<whIK3LMufIR;`K_6$uKxD7HXad`a1~Hl<>VuQf(Jk!AsvLN)E#
+zW!yWycY3FHdZPHkiQaL(Mnp|1HswVq(8DTxwQA3snyN(+f>ieRJTsd#E#Uor|Ni)B
+zv%51p^UTci{>(h<zJ9e}5d=Ym|8-puLIVF+ApBqaGYP_|Gd7MAULW@1nIY4)AD(%g
+z?~dA>MT_sbeeq3q=iGABuYY|{Am`@WauzGU&bi~)IdkTf<=lPGt+!n?a^&z_qlsy)
+zXZ?B6i`Q<A|G&lg?$+h(_x-IuvfuZ%-VMLk9G%y88~eSgZ65ob+g8fnac><4zxRFi
+z+18ct`^8aL+s*9vwXOHE^8H&Ev-^@Zyf3}u79aK#AA;->glkP{!Yy^*%#T0o63nI%
+zrcnSK%u2|_p6&P<e(m^z$Y%$y&4Q33@bdVtP>{+dv-aPqFs}s<vWi$Y@tgQz|9Y3C
+z2#>H%Q-t{$Nd<7fY$jf$3K{u=aO1ft!lIKb!Q}H&ge>@Nhw?#d25@dLoqFjm3f#6V
+z0Kc=QiX0#ut2nq$4s?6b;#+SD+$0D!Q%rp9Q{i{U;EK?1!9~29@bU%lXLX7oWW%pN
+zWoW(dMYq@7aciw0#M0nF7|JF1{mlvW3N8xVRg2fd@K1XRn`_~>CuwhS?c!VDn#~=|
+znQ)rX|Iqdp-*(qMP!Z=6=T!I={Jd~Ny;-N8vHw5+`L7NA`J6cdz4AMg;F~|uC1~z-
+z^s=)B!LeU+hkYC1iCWc9bK!|kIs=P4TV4GoItCs@T>ZEznyas=s!vz?)CuB7mmq7d
+zb?O8Ouha=v_@Pf+BnUxwzYYbyyQdTgev3a#rt`mn9$O2cZ*$ZnRMOvkYZ6*~H$We6
+z+wrY`o&{aDWBC_fLwQR%=?(Ty@%lc)N4wxr@SMw`o)8gp@z-YpSp0%-bq-v^Wql-N
+z20U(pTRl^d=Ln>)@o*p|c-*YmA}N!g2#c%9zpGk;y;)?3@AV1LX$#PjS97=1-GEO%
+z`w|$it6iqu!_C4D-yA^wQ2J!(J{@57iDyBnw&A$0M_j#@Wd$%FeY;>j=#evVQhH@g
+zYlA}i?F}%Shczt*H>%Rlh8S^mzq1tIpgZx657-;s@P=K7H#Wf=ILn$=0Jpx39DL!x
+zGWJ4OJHGHJd*J}QFdtta`~|b-Zt~gB!rC2Yv)Y}zv33os-63o4HT1?C*uo*tS1+9m
+zQ=nct1*iKVV1J~KKZ2%2?OhyM1--Zm=sp;>%U(7UFT!mwG8e9$v4BKa_2|cJbsO;o
+z-^vNFz@mSyOqas4`b@K6y3Xvu1%AF47T6D~aU-n8+G+4&i_eb5W-M;;osQRsDPF(b
+z_Y#2guO?W7TzuNap877r>keKc_hqQ@8rGPBPv2utckJ-pg^Sd9Har>y2u561$9`V}
+z4z_U<fTuNzFkfY`qNB}%Bdk7^0k{6NN?S!()w1BaMrAc>)TgrH$Cloh13&6hQ`p~W
+z_*c7@UC-r}XYk50EAg?CTY1TKc;l{DpIXlE?_xhy4M0vD3jZ|KMK#x&G8wQT8wicg
+z1E7Livec?I09w`SHLB}5wQ2`|r@BL`yB+Q~Y3^?NKJeBuTy8ycorfd#eUp=r_;@BF
+zvDSphH*9nqj~nq`rsE_Wc*ON2GGMjpacHzje*@=+uR3C>u1M<vmDaD<8e{CGt9(FP
+zdYR^Gf=VfXbqGKG5r`$&Yvq;54w*i64&WIt^XK3t7SO8m5dYytOIZ=L>ZN}j59C?b
+zDA*dFWb9*&td(~g?~Mi4T**m+-9HF?M$dc_h8e6|BLs%&${Ia03lOLb$aE7egQoE6
+zIeHbp(r}vT<;D%J0lnC`!KI>SjYqg9<K;D{<0Y;yEjXQ5VO{EQ;|TXOS#W+j)v694
+z9e_R!pzJiN<bVJquFlHFa3CFs%A-&5i+bi1<T9>KvR5rX053>TnxT~+P^%6Qsnkca
+zfg|ear2K$is&s_4cf&9_KddkHaBP49;{*EP6h_L!w0C>iN_0R~R<a(Kqn9nm_YPKP
+zxb_$hF!(NF9B}5Y5He1+s>?Q~oxXbwt22VQyNF4*H-rOY2G8^>FosIDe7(l<-2vhd
+zs<YYWFwq#a0u9qw({Qe^BK@Bf*04mhPPlE{8b~E3k1k6%MZ|Rg2AxVIS@+<BRO0Fw
+z^uPl1Gw|RS7WV#e@r7LkSL9gFSAZ(yjSzym!Wz^olp(|U6qc)UBkFa4WAw-^49Jne
+zWf{_9GZ894Ds}tnaS7-+Sl{3lI}}?{$TgMuO>_iy=ezYekRA2#r_4*uBSff`0l<z6
+zhBM;rU^6m}LhZ`R=s1!}cIvXo+J2n1y?Y$CZ6!rk&Tm4ujV%ybhKvw<-Q+l2R^+9B
+z$chhBg)8zdzLUV>C0R*Wd`DIi7T=JSz~aWS2`s*UY!VjdV|$UF%`hQ}S^4~C<nb`@
+zQNa~#JeLveb(~QXj>3z>Si^=foDIVc@Aw6noo}Gw(8XE5IFhYn<0E;0Y!W5DIyPwx
+z&yP(S!{cKUV`x4tF@`r!OB#cM{iYNM_4IdNq3pQxdQIy>9L!<^VdH|)*l=tqH?wPd
+zd}Q$z^Rm@>oej&86(5#kzvFNbtnwHGBGzhZVwh!Ka?r6K5JM~R(eDr>yacHcznn%t
+zMwm+`(G>QZO@Gd0MPw&^AD&b%Xz||~dIQDKH~^h|qPi&=L+Yf)J%Ie?QlJ;q5PaFd
+zul-{|ZJ9g)^^`RRJ6|?gS9<l#=i;|^;_5B)S)q<hB;X-^aF16W30QxA@N5BorapN5
+zI+Iv$Ye0=6NgDLom`byW9v_iVX*S6;-E0PCMOPJM0c)rZ-qtS!Z|fDvh{mnTaGwR|
+z+_WD6H)-X)rM^y>K96p13@<yID7~OZ{V%Z%P=4?{fuvS=bvcUx8$@jY034w6;FW^n
+z#HIt!V_j1Pyk%u#>zpJ&i#edHY54%4t9wcj5mt8N@=ptWj}zJkH{|>Jx9d@VB`(R<
+z_&8p)(f#LwssaisJqSY2u~l<*I`)IK&39AVW6cjXZ^L=1>y>P?U7fP84Tq$;!ZH=j
+z3@b=Gs$8&s`Nkr<!%d+19t1^j;|@kZVY+4^bcFTHP%nK@y{#FDNwhr^Sp$3AN#B5H
+zwB<{HoeUe8u9lt>Xb#j_kB8$~1>l7`QLPr$YKat!d1=itvrO-SO0YDilM2xT9q3BG
+zN572N=sJOcs}_k1No(~2P+&KUg13SkCDUPH^2^9VF=`{Dl9s1cbpD`xLyD!mG{1;#
+z>(lA3F^o}xo{^>&i)yj7U|}_?*a%RV0h9_os6|qvu832^(cA}N9rP=gp5-_B#R|4o
+zYAQ4Ul{T2jD9!q|S|Tm1Mp%3?m|FVOQZSmKK^USUkxu|V=dr-)0O2TNQwN|E0lHvB
+zjDEoeQ^i40B&d#rT$@gc>;<y7g65B6@J2^8>H(3Ys%gP<1t?RC?W8C}EzXD(WuQV6
+ztg#Dm4&VqctWi@LNZ2YUH8?h`VN`}v`Us2)dNwL~NV!#W*^wF;*gIu<Ni{4e)IdW4
+zYWQ{Egxop8t<NCx$=+uIt6hTQ1K=@-Ze7dp@gTlTN^)U@qe;4Rr|q$@?ai>Pm)e6h
+zxgcH--Kvhnij}NIm~O2ki>^g=P+;8SLBQSWmc)8aW9vB_3U;HYZ!LhO{GKmmL31n>
+zmr@*klBMj~2-Ush5@=$yRwB~%*n{0mU+e@uxw6_A%8Y@boH&xJvIcM{32p>iKL-Uj
+zv&gK*i>j-ilmk;c1Vd8G54E~tz$V2=>YP%L@Mj9an?%7Q(}hQ{d*bdVt&R_?sRf|n
+z2#hO)Xh#lK(3jH~=4Zn~+84uON6n;FSFCw4va`ZV6#yc7Gbyo?<}y-cJ<_haC1=YL
+zuO^Ob+#e|N1B={AQ--r9W*AM3f+luCDIklz%+g#T(_2kuCaB$#Wjj_<OA=kRijqKD
+z7a%fAg6{ybruKk=%%n;}Fs%S4*-irhD4A^sSn?vI&hCr>D7NAlX+F~Kj4ZiD6Y~LE
+z%Q!@}!x%)a-~#}WnT#I<nI6alOU2SsAp?MxW|@8<B*5Es67V>&Y_=NUU1EUeA%&uT
+z2}8g(M0dMhDglG!Gwja|-2%%^%RhrTKd36b$Q&v1$EuvbY42YS4OP$=0Ln_aLUY@x
+zAI&8&`82mg*C6(Q*#ys-^?wl66y$O3G&~Gdcsr1k4GoHFI}lCNM7q~(Fh@K6E7TyZ
+z^o37>4>FX=!F6M+jokkr*`X>iU9r<fFx|>3P~AjxD!3&FWVoGaT`+&Y`<asn6h~55
+z15(i<XjfffC9Mmg*GOs~41lvkD`L}Omt+D|jHKQG&jZ8#l9#Uk7ehWy?V$pA-ZFr8
+zL0u0_^TQNu<Jgx27zg;~7wEajS8xqhB(1>=wgv+j^7qAj34(Q26VQQT58lUMAGXS6
+zZxYj^+3|a5*7lyuE^A`COshq<%m&CP4Hz(p+YE)S)UpwUF7^v$Fa=XMWM^{7^d)vm
+zaGnsf>Lk#z;^+~FZL|R!pn|i|zBFAeOhDHvnuMqoiL1~q(`C>cz804Qeq9DMiZ5-E
+zy(yJuppB5=mt`<{2mSWS{F02tc>sC-yo|-e$taQr(!&Ns3fy^OFl-8pkb!Uy{%pd*
+zs%J#6f*H!cI-~Xi=l6jtv?9A>zq56`9{f+A<*2i7X<pvGRpQiDqnc8itW%3-J3mwU
+zqGN$B$gg-)-ctI4(bUX^I8KpsqU-@q1kl3^!8V(-D5LgrFB;90bVTQFXI~%((dkO$
+z`!LV0LohDl0?Iu^N-|WCCGHqUvu^tDRJ4cskx^a0mocir;>li{iM;?&Stz2?e=z+w
+z5oH??Q8@jVEo@B{1`8-dJYhvBOBPT5oX~HOez&4prbwV)IQB<ey;!sCeSIYws~r_U
+z(M?sI^c)}-^fS0RLE*7iFpUQmnLf6NiHgRsGRij>Py@vZENJxnGNw0m!fW{Z3M2i_
+zp){?>slJnLV`xDC^NC3Sd<g{%TJk_A$bRU*??Fl7mSlQw3RBXME+vpPlTorr&m4H$
+zB{&~MH}Z-ryzk+imp%t`9J~Ur^-ASj-<HBTLL{XNZtJ1-NJ=+cq1TG;-DiT@)Auq#
+z7QzaKG+Un}m@7_{XNuKJ7Xw@*RtYO)rT5_6x+OI~I-IV;3UGaiS}2m{Bx$#>nnRA{
+zQz$Z}z$-dui9mv>PM1|lafAz^W=FU>UI~U;ZdL8-T+w*q@t_hN!{seSwHMx;D?%gW
+zD$#khs0=59GgSd4Dr%k@t{yT?bkH<WHcfSVaGGd*nm%CD)C;#yvT5prD^zai%m2b@
+zvhU&3gcVx+QfMEdQ0d2jLPyoQJ{XQ#*NZErxvVm6K%3u7cG2>mm^;X%&C4MBB59kD
+zi@ZJp{j0eAR=VAS#wFbg;(K#88+JKbHhGM#hy=z$nw{;7$K$;h9$W$s4w6E<rM23*
+zd5JODp<@3Od=~gSS1Y$56g77nysXgfbV-ZFfs$+Qjw_t;2LFW%49MF;+}6B^vw3MI
+zG@YzeVDr(-LCcwu{50=lEn^00$%_O=0hb;wm(uCqG0OfWPRo|wYUl?C$#$7mVDF$D
+zK;O+wIRMQ7l(*ACD?q){jKwZs<T8jD7u-az0_g(;d9{ggdFLq<1z=Xz3QLRZq0hty
+zpgK`BC8-Ca?}C}}TSEtN?VCU1;-8}U-DL~v$CsqQW%L5a9&}?P-bF}t#u25LY~S7E
+zY+I7<KR!RN+1a@?MZ0`l)Z#zBkl{<Q2`mAVOs}wT#r#6ReD$_Ize#mT1yF!S63sy$
+znyVMeL%*H`b~Rz$f^7&206YhcZ2S-nZA2MpiIF30WQImu4HJT{dw31R%8HEmG64T<
+z6(<VRy^k>=;-<`5aj}WvsX#9Ve!RnA*umq+mtK{BZ$|A1{a(<5zXMJdy|}*4Dg?#`
+zkK1cUBRcijX0^)Dz_+Mij&3}x*w4IoKv0?h2GHe`ME*PeB&D#79HfW(b^T;|YbV(W
+zmf<JBT%)s@^0*WAjGJ{<`=aF9u)ZTI%4FJl_*6@a)G&Z>QvD1;5gp;G7ELy-k_sBO
+zDo67+b1`)?aT0+(D^aGyw9Xo2`PA1*f}z<4&SxN<T}CEyc)av74iCsNzo|ejV?IE*
+zUl12*2Apg~W(r($W{dGGbb>|>V;m(JbS=E76&YrMOkcyuPj!n{C`L^D$um(S)&nom
+z7I+)=I8fgvdui|XB=s$saeQ-(X+cubR5`ZRsMck1*1_h=4pI+rNUCbFgi#p6EYRvG
+z8yB0f0lx9nu{hr-N4~Ln=~&J;q`|EN=h(wIN8-6=U6%I=at`1d9-z<$rp8(USx<O-
+z{vgibmKwM6bqu!Yjy*>dtFyT_rRNNvAlUxlw$|6#g}|8)9>qZI;&EEx+0N!AU&z#o
+z6Qa#MJNS8*TG$^Q=Al1rgD0eoG*`6%y<0J`w|j3gy{A2hLVP7B`SVXj^7i+!5{WRf
+zw*c7>P`p{D*YHsdp?EW=_=_;=!72X6$tR`wvBq35ibrZci*t~;{cAaa+9iY99pM^P
+ztfp0a2GP50G3Xsbm~nc4@HmcO=`{l+kG|{ZC2^9M29vxM+K6TV$&cnFkN$&U*qv!8
+z(YMybb?HIO-hcELnSII6Nz8sVGJ?6B*}FLt_!TgF$zb-0xj{y+iL(KZ1m>Z#o)ilc
+zyne9KKE%y&b&?(_hAu|LaPJ;a0=(3RWQ?m^lp%xEH)Q@gd@Vww?J(n_(L)mX9{P_-
+zK>Dl%0?qK!YubhoC}Tks6)A3>B^99(?IlMk?rDgm^<!a?RV}s}3Ug%PK+WVHA4=*G
+z)VYr%C+%@O>k*AaqbPVE7<}SHmtb=hiY-H04dw{J8$~cOT~aVC%JiMDk{X4I!I?rp
+z(l6s4Z_dcF=_i7r4V8#2gv&fC9(3ENb^Xk9GaEfO{;W#p4}o!>g$8z`CTckXnDHH{
+z>xV+-$$8?)Q4czDoWhBY95gz5o`GdJB@g>^-vAE-?g1!>48#s(oYG?(Z$<`UH&{nD
+zyt?iTpvbxX&bHdm^O}P(aq%a?*x5@`qI-b}d1w&iTqSF2s6dbg34~vB9)JSDi~^ya
+z-!F)};S6pZC)yQBA_08~+z*hEWUxWOn*gj#<%#&W{0{E_==18CIWX<#=qsUvm|3|H
+z-RAHx7alf-0~39?3khDnkG(twUaqW^>Evwujh?M%W<x!&0s4Ho6EOntG~cfv`_1&F
+ziP%MkVc^~OLBha;iO|aJrD$biT!c?7@D0S-z$lWcx$Pcif<qxjfc%1Q5;P8X)xf{+
+zXM{Yu)HfNPdFac0Vwi<uqI*vVxZqvC04pcc1ptk{NYtm$g4<Z+cR;XXCs@nsA1>1r
+zh8P(P5?#sCl?+|68_Pd7(MBz{u@!pDZVcPzf(Qu3n9`pcDn)w#pAXS(j`-QZ3`bn2
+zGK@2~vpEE-4vfbd)zwL>(RahmM_r)_mwB1D%qNV-aO@;L`D3}&_!kq-X(!nw(?`Ds
+z)@Jq1fT4pG@tt7!fI8{=pBW>0YX|oMadTlZ<Fo_j0{Td#WOG3ii+;ggc%AdkiOD?C
+za1-v<E4<VTMohF2eNDJVW%To-tp4QW`ehX|eYXG9Qaa%W<Uqs2{NaJqyxL-O4KW8d
+zn`@lS%8z7Q-p<`et5NEn+R^+@lInHYAl2(cw@)E=`&`1^KIe0|&mM65JQydjYWpda
+z3NEb1-8jhcGln~UxNzH3qh=HixPAfyt{>vIgGn?V#E<Q*cCxwo3p+wLV)O2vAJ&iA
+zTJyvDg^U9wIlD&3Tde^W1?29Do*sV!?Sn1^=nASGCxy7I8gRQ^hU)O_7#rnT3Afvm
+z`YE)!!H%~}7ou_F3;i2${FQAe(^%98h_weWUI@-K*&53LqqS;rqwfqr%<Xi6$V{wZ
+zt;JcUp68*`#znkf7B3h9V+UnLE6$FN+t|R1&f`TB;zg5Wk5=BRxhd_$Een-B61MX=
+zul$pR`w*eBR!*_LtJfo=yR<Y7D{J$n^|WGSb{((3%@PObT2oI3HWcCo|4bCPO+Cl(
+zjW%BJI4`Ii+Czx;F>o|j2=y^weZ7wTvRc(kA4Z$q)$2^bEjv(bYxn}0;XK*d78r)k
+zU3$(DU2g)icZbTNmu>9i9bL>jntI|;9_Ag*^U3r(5v3tK1RfVgRY;*xd1Ehc;Ty9t
+zhKDg?XNpeW*v|_(Sb>tWQOIHUTll?wqsZ@H=PxdAeHanm6l~1~HP)$EZH?#QP9u8`
+zZbxgUO+de7X*TI}F3qtuypQVaHFl;@)sivMdxLd5kbi|>D%$-3YvxzXw_(Ap53Y9H
+z_pte}uKO!A_ak)D@I>VC5t)A54U)B0jK`C31C;-EnRfh}@0E$Z>#w;U0a!JgZ`TU;
+zW<_5nds+Q7k_vMbwWvyOKGHRD_u6I^0Trx~&@*-oO7am<vN(0A2&~i^Y|TRO8|Ub8
+zH+MT-0we(s1G%lm<4j~>4h%9n%1|V(k6|<@3p9yuNpZGXoKwHjEd+Am+F6_fOs05}
+zvv_hK!+#fpkj`Qdru0-IQLS7ifRVcLMnO64J=|O7r4x@KbMgW*&_Dl#K0t}S2<uMM
+zK)(WV_1_h`?pz?Rk_g%os3+alD|kGrtDW8lYg7=7>47Xj3Re><yVJ~Em2~LE<g@5#
+zFYY>9_@l1Fz26Ml(E`Ap4#dc-f5feGY!Bh#7IOfG28*yJ_~p-Z`4K+Fhg(d65$tgj
+z^}(}X9hEd!2P|g?^cM1ch`v5LyPGi<93W{YRqcQ}N(`qF-a{%7>1249?^WZ=QbgwB
+zo;KCpp4iyof%aq?`;zN5?QHYPc6#C9cDfJa<n&V6%xS4rd6SiP&}~pcJ3nB0a-8@1
+z^-{m?0i$W9o;evrW{{eXbdC=fFjdj>3<Jl_%?PqctWc|BB&NFi>sO2vlncnmWg6nk
+z_1x*7LY7ETksK$NVR7I~{x-bf?svulW3*yB*a;W$x@o*HraDQ>LLL&4gr0rq7qN%#
+z!-d@R0b5A71gtV1crFz4O#bXADvumRV=)$g4sz(~2lcCdpF3>Ha30xhsf311o(eka
+zAlQ1T!7Y+nB;Faxwxj~vRf{m<)Kmp}N-vQ`3|ULmk`fPDlUDlIEo_p&e512XxX-k#
+zj5d7EO*aq2n=ooxejR<uAVWQd5G6ZNj6V216P-NF117sK2YJOodIKyJX|DvWq6*|F
+z$S?08!(5yj3?GNW3AVSg$WL$MOEvl90>gvN=HPcG<p;-BFu*gDtuJSDU<@o+bX%PK
+z^ICVuq88AwVM@86^y|Jy&;7+%uoE=KF-+@y=@8pi2b6pI=Qx5Pfnc1F-DG(EeX#Tw
+zl0vC|8C;A*y@*KoFmPBkM>B}oStuzZ)ZyeRkv;tuE;pZGdCXy!M>bj>r*q2#t&~Xs
+z0W&?mMbjgDu;~&0f#LlLricI5(EErm*R|j#7IGA&04R#CO(c!kN)H1Huz2Hi;Lc7*
+zU|MjdS-BWwZXhd|mJQEH8gXx8ReyxBIvvWFoV#_>$DvF5!e$e0D(VHQ?qo`)<_i07
+zlj))^Xt&qOe9*2iGU*8iIg?&ZgW|yU5Sd=}nTg5&LkQ+8o8vm}Ce+hAgSUkQ*7;|B
+z2Ardido^dPqnuJ8H<)i$&ImS(9#B@_?Ta(sPWtorOj{jx3gGsBHWaw}zPJSW%91QW
+zUj7t;6GNAt2f!U@W<*yag5u*mT01j;=F(r~%_I?j))Nbk93wGjiKIv#z>w<@cS?Yy
+zvQ)REy8A4t2s#GiWqKO)WU3aUd5PNR^4h#Auv6Uhk98~P*WUr0MPe4sYi1;e9<HNk
+zbS{)g3t1}WwZifTW2V}|yy*n5-+t+(mxkxH1&^8*Ps=+)TVx_F@8BbN2TC1#NZan7
+zypJtyPMD6}WS4WFZT9zGnhqTzO~iM8tSvV}p}ko!+0ZF)z$|hQ_->^~R+U4lJ4VyK
+zff@FSz&l_T1p=l=A8v3VqsnNJiH!$$<jf?^d66fM)WuX+4EWG==g~kmH1%;c6N0;F
+zIpBolxbqlT)5;-I)klh?yi^V>VD)A6>pq6nce;AB7Ft?>HQnioW#NUWPK@uI@moVO
+zuFl`WusUGvMu7L^wem*ZX8YM$TpHMFE<>P?Jgu%?FwA;A`lVP5D{!3e$XSbf-s$`A
+zGm*(&rSv<7R4^w8Ow0v;A9gh}Y!H(oVUwUDIFALc2Cj=31@vntX+W@Qs#Xk`d(O8g
+z=(BN}RHz@xj_x5!Z*(Ll>aspo>KB01D810pub?Afvia|GLu=6Pn+#}MLa);|2bl5@
+zjATWrvF`?F6exk3`?z(E?=>Edrq>Wtjnk~ykx_0o2fsBb-(aw-#r76HA0G~O9WRJ}
+z2P1nHM|SJ`CmC7cz{ptdW#6#g6C=useu5*iGQH-Z?^q!p&^IukJNB~y`QGCL`i1>T
+zh^cIUQdR|h5e(5gcV(ejm&&#%Sw;=npY(GnU}+2Y<e?HkWVY1+WTF@4H@TO&{YzzU
+zk^pyX4aUsXwkN~PnUNFv7mhjQy%U3J<yO=QKDz?M0^2W<*KGvW`ag|x8QfBAp$}1v
+zv|72l4IOXv(%yItD^<Q_eCV!s<6$<CIET+mNSt8rw1fwx59lme^6;H+69eaKE5!VT
+zcIC`6pNNFDi}oVRUdd$ImHLv53iNDEL+u3j@E3`ooVC#nQC-ik>Qu%s^SzDs!jfr4
+z**&MDK~;A^(r}k>8}2lo?P>#3%X|cPDz*XJ+35&tb=~Vdn!9`bdYTILb)_3*Jyg$g
+zcjLQY46@hYtw%lRM^J`iu>CBk8eOfqwy0HMWVCA47MTfmcwf(4&1wer5qH@3R-sjf
+zKcn!Egnx$1zR6ILPQw9q;-=mG$|!6T9dl(p`Ansrt*yu|gW-SEXAEB?V?n-t^h+)3
+zOD31ne=zFK)~<m@P*A+whdN+4y*KUwg!$RgiwiX<Y`lQD`y3zAGha*il}_C32R!W@
+zjG|T0BmY5F3KgW(3QGjgx(wJ?!58S+%QCGH4ZA+!j?Ctq&V)=Zr8h3R4T`94iMx<8
+zm<tI#MPQ=A5^_J$TV+H1L{J^WzYcUMO0rD1Aaj<Wa&W8JLkoshM`x<-v2Y7JRuP&x
+z325NbcVLvws;iAuSwT#|2<vvJWAbIu*5E|%kh@(i@AZ^|>a3QxdrB)1kW7&s$_XAf
+z+Zs+|c-0G*x|Ij}&Q01EdNJ5rU_?AgulO9TJ|<hAl&Oq?OjkS5<Za!8XE&`;-5o$y
+za>PYh{QGg>B#u3->wd5q&~)%H!-2TkN(X_^cvxBO3%%qL{4?m^-o^+@tWvFOV?0X_
+zOl3xg(xEFmY_pXPZJroOn~&&b{}$nzm(AiH7PyHNBL)glvqNXh%?Z5e;-rDp02lC$
+z64L55Z4vHjy}K(uo<_XynUt{oI_Uktz_{CsKJ+$=ckoD~9dJ7>g!^-G7md|h;n3fk
+zgDUVYBCc|Zzg48d;89WeKAQO+?k!F{9>X7_ub-sqvZy+uDes%18FaPB;|I(GJ`D)7
+z0OlpxQ?C`_(*VvE2x27{Rwzg2j_}<*x?aJBQ7c^fXL#xC4a|XV`0znDdk}FX{cRqI
+z+64BFW9u_`0t@H>Ft$WeORQ>%T`kE_m5^GJ1>Dr#PuzA8_haF9V6P~wMk-0G&}Auq
+zMV77M_vpWvJ&idbk8`Wu1dAmE77=e&<DU3F=KQ~#*uGzFg`Jq8u5GrvvqD=TRd`Bu
+z8SL=;3Ww@=cL2HkE3V_24IS^vui`qM`KJUPf{xeLVG`ns;}(j#J#BxB=>VKST5<3h
+zArul|?P1K!{iI{7>RP7)HMsj#H+Afv-Bi_21l9E%azhSv@D+Gt3L2Y#84J8#SDw?o
+z*{W*|aXo3&1a3G5{Z9`Jl;ie%+aoU{4TWt@FCbN|%o1!37a(Vxhco#s-@h%A(*RBP
+z5R;~Kc}v-L?20UC9ZaNpQb*YiCL7e)3Nxm3dU2+#*f_jxd*lOwx6fQH?oQ%5knirY
+zHNFA2`L1qT<3HH*b-3r*)_?&)+yK*tz1T@7!Y^S#rcuz&3L5t>ySFjC>>jq`kO_x5
+z%*m|G^!u;Z+#BdQQ`xR|l$x4r11`u2;0r!o7vkh}XKWBT$@HSVCc*Z23k)U=_%@y_
+zXgq9dSkG+9o~QXBo@j}F20$-OTigkQSiE=Y{^+jw1f=1{9>A^!dd}Av)m+CmejD>Q
+z3TMZIkV#*oX}3<M|2Ts5TL#aXT>qe<uZ+6}`U+ecP)uP^z~xSQ4qUEs{UdrtV;BS^
+zKmyB?LT#tv<n^*^3)X0%55B<|fPYTt%=2;o`x~5)wg4e%bq6ru6JGDwgPS?QG%Me*
+ze!W_LKrQc5%e#T~K|?iac?UU8J|-4GCl5MbfEoKuWw53&<+A|$g}~)R=}=*%$u6d_
+z{F$q~HVrAleSo&$Ryd{8v8M@I1U-(VdVvZZd+=T5MN&lxfRnnaz}*nGHN3+u5`OH+
+z*6^|*uoGvmccH_st}WsU^}^M95S$U$rWiZi7#7cjC+i*ICKuHe3X(*1?ND9qpbr2#
+zye`w@!x4Zsr?Mj;le#So4a$4TJP}<{rTS$oRD;{)(eJQ}Uc|k%R(1>%;J2jm1CoP}
+zCA5mrp7I(1g8Z5uWP^lp5T%Q_53DM<7Mi$|wB|K8$IM_SEm;UXYvr_5Ci~PnN|%m+
+z`bGU{*i<H36&+!86~Q>jb{vUCoh_=fB@8+tF!VWeG2TADK){Xk@C197={2vKgy?C+
+z)eTial8;bpMb&jcb#<w(ZiGL(9f+lcE`5z-f)px2OnC3Lgc}DY1D)QcQeQ62q(`ml
+z#p4?HjRb?YaFVldvhC59C>|;Syt{%QESSjeMDE|U^Skr;x|?4!u|pgT4^v6HM=zBC
+z5o511I}$khAF%r?dH3bmy_<D!_LO4J@-$=*c=U*j((1YZJ=d?FQ8`Yrk-}_eVUCi<
+ztfQy}3~>)`_q}E`cc9|D*L6FO*d7f75aMg5=zRoz>}_<Mg|A<*u2Tri_aKMR+%MBg
+z=1phF;9kAT^>UNz5nv87?E}dgP4_Yf!E5QvtDJ`3(j!WgX|${9>0j!)^9YbCvToaB
+zEp*tIapBuWfBphhye@h^{GMzc`u-W82a5AB{Z-UNfEEF1d)Z(KHWLg_lIfy!baAnG
+z1R^gVS=wu+9>s(^HoJjp>0>FlOR5`ZAbNurS;~|yGz->q4}STErmFQQcYcQscNlj!
+zGaa5!H4f%_*g;^>NF%96yzLR{{KD9(xq*@M<S)3l7_j|m7>ri_aw(w5%Sbd+aH+Z&
+ziE4En>k)X@%c`q`9eq3iDn2(=M0y5af)rBM8C^uiBA7uGEADQL)rrhwRX{p%{<YZ{
+z?)jbtbW+FybX@*G#@9bEQV0NHb^C<{&VzvrbZ@fNT8i!#cQ@i4IS3_UYtbYVhn_A5
+zoi7*>oplEkLco$>?%VYGWs?LvdD%-_QS)Y=*ywA3KOK0$#0#nl*bDHp41Q29kF}r@
+z+D#u|%4i#vVSZs9Cv9Ns*mEnoMl(X07r<irH!w+EER86}?e{83wuaS+$;I{&#Tm8+
+zl<Byji0`(FFu4SvsIiT4b<-bgOb&N}97Z7#Ugl;ZH!jd$eIB=vamh>eqU7y1BrmI+
+z12Q0go^@#!FoDG>`Nh)GQO<c8ONT8^aTeQ`0zn#5<2xJ5gs6FgiQe%K2L2BJ<)K*!
+z`aj^F{DgWq#%U19ZVo4aNT$;=gs(#P@{?D|8uo`DGYvaL_x~%Q*@R^J?RMO0jN;Br
+zCW25TyUOTzAQJ<U+iYwT=$D{gwHS6uCK{7C_lZ3dYz0ch>YhhUf?>hleL<21Ydw_(
+z`!R8lnT9>BFA?c^7{0RjC;Lrmfk-SW+^7Xo@D@?f9n|z0ciW%D09*4sH^6$vZ~)@L
+z)*{gvtIf@yxilwlX0vW~7D-B~hmJ*z_KKheoeyHb8d8TxPcw@85vn2#*5C;yDd_}L
+zktim%tAI_;+-$)sg}@Shx}LcxeunQJl1AoQQL~+EhtV-FE2*&NRfx?$nVY{ftL~U{
+zckN`d`E5LCwVOH)=e1cjJGX(sVVm9ORARPSN{qS%JR~<yr1Cb5dWmJa((k2z++q?m
+z(Sh!cVu`!_ld~Fp^ATI$9rW1V#QK5)HENql*kP>P8Qh}e$HOk88~*nMqmoVB3JJ_y
+zub8))OT^mgd8d_OWcx}O18K?I49^x%%A4uf3R60ZM0V4>PD{l3nQeBPa~t{$ca}1D
+z;ev(L2}ewzFzzn2CftRhjQ+wyw5xNln=tMpTr-TV1@{rQ<?T{k{mn;l20_c35*^JB
+zCk``CF1h-Vf5eop2aj;)0c1Kc#2VM3g_;<IL24oy>>D&8zR~MD*<`@Vn^i%ZD?;OD
+z)uhdp_(e^mz-lrX+Zw!ND)gh8;Sb}87F8C>ED<exlT#Lz6m=0E&zmJWWeIPjs9Bw&
+zdL?zSnAoa_tt<u=OPvLOPTk5VY{jmK>XfJj8d6V7YJ>azKCU3gSv2WFeW^sY(=Sow
+zzEUf(vyjACm;oH0mu}wA$>&J@N?_4@2M$$uJi*&y0^iY~D*fn{bobNWe;kj&v<%cC
+z2TP#_U4msUX_e4alr>PNtb+C-WyQ3G_L@ks6?EYJfiVom?Os~l2HdzPt7&#tH5iSo
+zZ+}+k_sG)5tOx4d4Vo<Ty`D~7cH+)J@<siqYlDf|PzP{~pl~UZK%|gQkq6VWK`y`}
+zR3pe`Q43ijvAEf%ApJ;rH~9e%y%MuCOPS#Dpr~<mlWj7s#kiiN+FFZ6Qx686naoNd
+zwNi8nv9P5WN&1Yn4g44#PiBkJVa_Sa2zXk+WMJSRc4V8=2T-s8-V;$Y4|<`)Ngj}L
+znu`L>QkkY<UxJzz{k^UnV4gDODZa1OB+wWhyO<78AcMX8Z@}j5{CFY|2%eqF>jaDk
+zF5?K3ADWMw<3SrdFZkebc24tBq#`eU8W=h&C27bhG;srRo#|eBYuMlzSx~qzer}3W
+z<QG>M$H_cw^Gu7eRU<FL&ZU0z0h8;edl*UXHO{5(qV`rqB6cn{-kg^c5IIQ4{tLr%
+zNJM+kc2b9HS0fqWF&UF~wG_W3o2%o_XCAh)(|bRTV`=us3`-N7wmSwa1DWklz)p|k
+z;Y0+F=h%Mx7(3@H2`lcwy(D|JYjZOy=-VcC4CRTu&7^PlancGGyJMA>J~Aga19xPR
+zU8*AGU7MSg*Ao1^KiJjpbvD<flk0M`fNp+^baO*)HW2Q$x!L3+T89soLmBV3vJyI8
+zN#M_l@z~Z!@J>4BBZ%Mp8uyo`2alVVkBmS1UyC87j7?{S;uSXpcBj~aC}(iSvkLGm
+zip!3Rm+suGj8g9h>Q`sL|I4K48Ehx36>ig=W+h$yRdggghMQRuaEtr#95ImdGOJ)~
+z{1bXXfm@RKA{he>O(SJe{r&LvCC)_>P+*^z{swnE7m2OF$gpAoULk|k7l}0Y7;aa^
+z7nIYnLhGy{l?d>nNk9XvrNcj+x}_Z63xlfRPME?4#Kdcu&@D0pg=mJLD_J!5Gs-D2
+zWT@8}mkt>W^MT+&D<jRY>Uj~h?hv3PTgozR+QV95KiMY(D&p}JZG~7_sn*5vl|!``
+zle$A>gjUq=l|j#-w|<KltemDRePo1}mh;;*qVzeBFaC(s#h?f0Q4qx=ycKjhFC9ll
+zRCwtH-?Ae^aBoGSa&++lU@f2|!YiMVR<)`R$kO?7?Ht@4>?IQY=^OU)*>LYIgZr=f
+z{df|=*INR^wR!zyFWco4Y!RJR(&7(5UST^3#35(%l2QWd+XMaBKm|1LH{JklEULf`
+zo-i5=ek(eUfXMp@^s-y9wWt{UPRy@51P!_m!I01b0oa;JRiBaz9R+T49y97YP_x<z
+z0Fk}8+oeT>{-b9FsfdHAl9V&C@m8q3kF?QLZ2UWs>?9unjPwXFF`x?Ea?xvMgMgQz
+zBbbz)AC5ECTwNwERHtx6_uE5nAX`s)o@uHdL$$nPpem?t8r03p=a7g&pwUZ9i1=DC
+z_ceBWgq=_7^~e<f!gjjN%+pCR(Vb+@g96=ncx8l^K8MKyjGq1iH_#8D7Z~K5^IDkR
+zVqSiOUtE}XOk3QKH-#iMcy7ESva^id%EA^D_fGARwc>uV-O|c<-@H?F4Kt*P(|Ox<
+z|D^3}5rRpfFA#!p&$0XuRR=Ig)Xq%`=P_HuKJ;EL6;-9v`Gc*Y4e!vG(9MBCA4q)Q
+zWLSkv{}E+u_gwO+^LW4x>szK>Bhrl+RR2ur!&<v!%6wZ@2ci{VL=bluV0#BT9mp`c
+zh`&CSRCS;xuXJH7WI4Cc;oW1{piHl3wUjT3(h1F|P!S=f%yBVK;A0;=a91~;;D^5W
+zI2vc7C$9b3c(6{9oZA9pn89FDQ}G-)U|6#l?ZG{KMw|i<Yf9ua=k9<_9Tm(G22x}U
+z?2%-g9uJoHGwRQ4Rh1Y_cLnYdiA`E@a{<};MDU9=3+Sa5(n(^?Us{^~V+H}IWlWc8
+z1u}nlbsO$>+@*<QWjcq;1JZ|&j>vf}47)F425k&^ba}s5v)X7j`cSvzM2BOj-DW~}
+z!vNFvc#;mkn_zTa^1bScdFk2guxSi;LuIjZUa{(AJnaX&M0z3-7z*~<%NQ-d>lIod
+zCJ6)OmmFt|4cc?|)m^4tUdM8+S>FLJCxck<0QLW+hb^jUo+iE{Yu4B3dPZ_Fa>N;1
+z{vmR)n38$8*`(O70@aq)P_c$`NGsB#=d!(-?_gul);!+Ugm_aoV#Om`v5piO+pXs-
+z{mXaa8&Ea}%93WmIL>{Pe9xF<3U7%smwnjG2-G0yH<Ufk!4=#`-(>|*eIHG#{vvO=
+zvg-daGRwABRgVuBu*j@El$HmSw{H#ePt_&wa>Dc)Jh)GGs;Gvo`<#y(86?ZJ(aU1{
+zm}%qO&*K^m9(8>>v2AH|yRNfsOCN6H+dD4C-hO_X^@gb}BzhGR%ejKzN^k!YJCdWi
+z`=DSfs%-1mug7c%fG&|j$p{#2Masgo7|L)KA)*bBVMLAI`!qMME3_ghIRbMrkW^lN
+zYG63p*vrAhJacAng(w6@qNzL`UJBNTLM0xNc=M0(U<|fnfcFw^13Xu#Zt-<uy0lji
+ze(VZaRF@+hNn3NaOHk_$aJ5n`w)&=>iOKG=F@>G0pJsv`xynV~dHpPx(A0SOalGqk
+zYP^DFSetg7<x0c6c#Sjg7>=(%P~R=Ur;YR3$ztZ}l6}{*Hg8}F^tykKwd#85;o&S5
+z9&>&9Ze=x|<TWPW!E1CRYFK1n6RUB6*SONC@hbXQU*-_&d?z8jc@F~_pw;8h>I~XM
+zX154S=2m(KgH~tI>TzgOWM2n|R%bokX7n^S0ZXdv>%|)GC!u(yQG7ltKEShwHR9~a
+zXuCgy32s=Tyfl9Sf6m>&bDlJz#=rV0lpixf(=pfJ$4?pg8cI<f>9Sh437ZamgsMod
+zb0qHd3*-T>4mM9x>-s&KdkbA_WvO(w&^Iw}7yQn8hXtmlW5Y>~fsP0$*HbaG&F3u%
+z&p=qFhu%iSmO{580J%>YB9th&^;uQ=n4GkD@%)1Y3^?S}bs0plN9}-)3b52(E-67U
+zY<C_3%i99F6;#VHs^?-_h^yYlWMVL2(D~x({4&l@x2SV+1HoH!CEN>Gp)JoXAP3j0
+zfm|!*K%0|WAeZWybNLyB+x-{7lk5C2dFd@C!S>di-1#7#WxOb1e`WT!H0kekGQ8sR
+zWu1kad$voA!2_$tc0kUK0TFO*?s7ak=-5GT`U7XvXhqO>#>6*w&B@J@>CO<&((=%s
+zaF(Xx(qTZR(+J2M_NQI1zJVzf)}u66de!nxa1~mQCt_Udkja;Ks0wEF3xiR}NW!CM
+z$~^3qt!bDykj_nX*|?kqwJM=g7L{>PIWY@+$Q9SY6+HKPy|Ulr!&I*NM=a&#n|@F%
+z0Po!E=)qmMg?5vqxz>4Yvt8>PhcW3_=fDfl)WhV8`2$UPlUlMhV17g1R+x@UMJuZV
+z+6rS^;doo#L{qi~q$iJ7z78Gk|HCj5V<Tn{(-&jRckkuyc(PsB*=3m4$1m4WWjl*{
+zJosl8_3+{L@z6&&*&qBFQBtjHU=9H*?!0NlnI;z1UGE{=)i>}wgDzXOBA?^1%BBuh
+z;7p}|>Q?fANES#<Zh}f!7@Dlm+>g@QbXay)k42G}*@eI;c<zyDEkAy7x909`brBP_
+zqJ`sbS6!<K>r-_-g5gYzequOtb*WbV2vc5|TlX^N@=Y}&i5+zRhxm4bR^9>i9>v)x
+zB_>^|*X68u=zrxlj6S@~LQ<>Vibo|LrMGWGS9k${-FOv_l|j48O&G9Z!&YUi&d?2-
+z#|GIH(6?DE79XIqKihEKz64{U7d*kD)O6p4c!DA;ly)J;GM?ZeCA;k{6DYHbCkJDe
+zB^kk(6eteHMg-0Y#%xQng0YOHWAuBiBvrpxB0Kp>Bwe=C&5yGt$!Wnhy~bGxWwu9o
+z`XgSYG$XnnUcrdgo*l-H%$?-4M6odk2j~M^!RXxJzbkY#0<{mCRo#!`3CcQ&l-ptM
+zlR{3u9YDyXYSrT`=*67dQy)BzdmC&GH<||JLhIgaY$f^rz2vPVDHu^jwKndnPyH=C
+zkhJp0OF?0?VuS=8!@-Ep5mxIS0UGCVlE+n-5hPKoy5pH~kMuAcG85&1Q|aO;Mke?`
+zM(dYhMB`&bYS$wi#drY3euSY|9S?lph5qy29F$tY+o-^z-GGOOFz005qm`AKo9as?
+zeW^&(F}Fss6x=c?-$j)fq^`G7w>9K5sRb?V1^jz}q-pLp&}S;xUWa94i2G3%J%fIA
+zWi=I#$1C%x-@taW^hYpWBqIEcMTk;L=g9&q2k3h}MuaTcD4^|sWN0Awymp+UZ?IXS
+z>mqz-p>b|4`>?LZEdbo0gxTz@OnbX7v=kTp^FQ(}6R->v6il27mZ8qXHxi&r{Z=v-
+z*&rU{*d^<wlUNqJx-KDbWw5RrI8!??rgoUoTLD_t0?T_|5-xOx0k%<iIN{%$63DPd
+zW<k#Q35-LnOl%5&jPJln0yd-SghyE?KFT&8>6tg6?&jtN7)Z=HWl3&4a|ol4t1y*V
+zI!R{)GLX)Ro^b*9jQDlmvlpH`qB1C;!jC`1Ln?3M9V&~s2cMl6@Xu$V6?U!iM{0qQ
+z;Wu~=<_H$N^zjc)47Bh#%Zx{iILk+`8i!RS9x<>xV@uD<FUkl^z;qEeY-XsQe$o@7
+z%;OGVP#XTf^|*sAkxphwstNuWuJXAeDHPRNd?e1f=q;Dg=Uyl}=c3PDMxVP~y;@Q|
+zV%+5p&46KMR)J-if3cZS*o>rzsy%9fmek<`jSTU*pFhOsPVF!;I65ya-IDBY|0v1d
+zUgoVpXFG1?ryC;d(73iVYt{S|VqXOS6-bd()VWo!s1{jCq^WvXQ;D=tU6LC=<}vj2
+zXr@em{2;#b@7=s1Tlql6>q1&9`~&mHu&iKv)bhUMW4zu$$M2+f=41cm{bdmsy7UG5
+z1<;74*j|ZQm5`hGb$+z{{$YYpMz^%$$s#<)h=>NX^z`q!Z@>r}U~Lv&Aloo};DVR1
+zp=&mrB*c&iL*U8nd%#`*%m8ZyLlSy8QQt3wEEmC;?*2XU4@N>&s3AntHCL8b*30dc
+zm3%({=F*FDQqNLBg_uso7PjH`*#E>+l^G!^SP)k~JNXwQ3q>-WCFCpEFp!Whja0?Z
+zQCorWro7I)vCYR)n}14m?yb$^0X@q=K#%Ogc-{}TSwGOs4Va{F7yTI%$zcM$81t$#
+zpZavtM(fk~!I^}MUK(@)_SG%Fd;<0eydJ&jgj9LuJXM~HC#Ku>9&2R!pwt6J_Oc31
+zER<<uGxK-?wz52VQc@y1c7$~9kW6_moMRk0Etg0$86Lbb7Y`#?Bf@e-8(6P`TynLj
+z&Yi@l{kqU(T&lyXjdNv)d|S>e?<aGS>5W8vYE3D~^mcd*%-J~I;A{`rNKvk{H6W?3
+zEvh#+IvFJc%LnXkqZhFdDe(1k*kSKB^unAj@WB7C{*JoU8anmwjIp1$ns4L~LKO(d
+zuU0dW18BzbH(u=AspJw<1#Xut&K=0>ICgMeM_>f=axu9hZTTH<E+e!WoAW|*G#$e{
+zeQXN|P?xsCUZYl9!CF)6y5k#65wCaA%ilxwE(;8B{BL0{7!xdE@->*CNJ20G4|2)u
+z0=0M&fL>wr1q=o4E&Y8Sutm4TWiNwWvSWuoJG36bNX1dP?T*8w3PWdTc(}V!ZBb}G
+z%l)oomU(o>=W#3YCYa)$kw~nWOk%jKPO~zOZ8V`Dwj-|C8agqgfQR6tA38THX94ep
+za?nv;G0O2PB8+cBrA3lA`ZxBv>gu9|)d*a|4iZt-MJa9%!#&~x)}eRu@^s>&Wn`}8
+zVaJ^QC`aGHZQx25y@r=x54I@2uTZ)L1K|Qc)*3hs-otjFHqGHxFUE{pMN*lEMdu{1
+zU+5W&#(_e6MzY@nETt+7zV*LkGQL#MSq4qOh`u!OC>?Nx5x-?|IFep}KMM-ZlA@W0
+zw7`>En~5y3k{?x5bUZP^tc_69NvX&len(8KrWqbJw-{p1v~eIRCJ|=I$0K9>3|~Ar
+z7Qf?%y-?1eKzV<CT%efV8x$IQ23Pfp3pY};Er>o#9!^?2g)JuwD6zhr%}R!PpCR#Q
+z@SkN;^gI??va2(US|%k^&5x#Ic!@tK#1PYc$swjcuv`NBG2$bOWH>ZDm0T^&sI&qN
+z#bZp5#fC(Nn&w-Lz>ouqqAsYejAId|!ogKAz;s?bz?AmO&A{c1`Bq!Qy%=8N=O9lS
+zVS3|uJi>G+2hE@CP&?AfC!ob3p}%V4V@3OtQ4P5lH{_9K+!p2PVgcv!Zsj7a$gV0~
+zG9uAG!LnP`4o@5Q430VPk2lpt`T${}_&k`?tTK<x;?6R?8eO4A)Hym2xAZ>#Gdn{K
+z&9V@(7n&}^05Y`ULEL7qjltJ2fE>}4PTKvmanxwWI^a6{FacmZfD9I<5kSVI9ud>y
+zz={JS{dT{}LnH4Phw?>1D->Hou@`wdJ+!qvBDu<{PeE;VioRzc3j*kMfUpxIW>iIB
+z!a+$|RU$QAEv+gU)^znSQesuFwvx@ssih*O8+oS^c3L{nX=u%hiPVAY%#a4Xx+RL=
+z2ZD|(6WL+m2G2=zK|-z)S%SUfO$tmkU|auBvNz#WMH<T$DMPV7x{^r296<$>pr3AD
+zH=s{gLzasHHJVnP<ZRQGL(Vo$Ml-RsAaS;-fS+wbbs>EnR~HmXImj03cQ3G$O}|wK
+zf+cvg>F7W--#FQX5q%3g*;L@AAHIPReYVp_++b?{D%CPwT{`Gw)7cXfdC9DXs(`_s
+z2&z=YELm*}sj@peS+d$rmU5y6lhvY5U?i)3^G(J&UGZ~5L(&qJX<{*Es%09&EpPu9
+z4Pi(&x`qh=o=49_i@3!vhAzU%4L2nxBf8`*?i<h+W~o(D@RnS@JG8`*gk>NJXXgT9
+zmo+8w5@E>Zpd)-@=A&)z7`ZmMN##wXobBgk;BL^$^~`HAO$-eD6VMAHshfDNB3%8c
+zVN{a62xE2=^Y8_4>l6Hw=<im-U0)@j0Y9_sA6`k0|F9m~SVysqE<n>@O%CpSF3RP=
+z6xm6O>Yz_OY+|VxS74)&hX)$9(_al~lpH5J(bYh&V{O{c2Dq?^>y0K}z$O}!n#iC>
+zR-C+v_0-PVC}3^07TE=8XSC7IPHg9LYzKoS{>f@pAN@OP2-@*aF7x6yfd2W4iRDS(
+zNn8JeEiHnU&~~e~M~Wt~uZdLW!XPt91T^W;Z=mH3rj|H~mKnK(08{+K7c}ZhO7N(@
+z<XXTtpRn!E&I%7b>uHOiR#_MLhb{0ASKU_B?8{>dNwZ_mkt4xx&7@76H3e2Q7&R$h
+zvmkwcqrUXL#n{l&x1dp0^M|CGja!vyJV!cL=VuJW>w>qnp>E@4AgRiZ#_-DA<sf-$
+zCm#7Y*e)FDls%gJCzdC+vNA}`{tGL?`iWZk<4No>UV0F1mN74zk<|L4x<q6zVYtA^
+z0X2~e1=yQ$-eP#&nj298)|Cv+eE>5dH}hUk=^ncQ=#!Q=#@V{}#C$U_w0xHo7?tOe
+zcE|8s7i|t1gkTj;HW#=+?Bw(g7!)qi;rq@y@+s0V%xRCA^szYwMyEuB&By&0&W9V&
+ze@<5J(Of^tcvS8t=8f#f;FIIS1vGQ{(23!U`EGrH*%}kFp#dkv_GY;qhr3<>C12sZ
+zH_%Vsz+6rz85|yw(p<3$+)`L~NL6B``la~sA+;{1XEyM2g)_kNGUiTQVb`p)5U*36
+zy8|Qhw(UOZDaC`SZ}G9TF2psy`T-*>05-+*#}e+NHkrP?27?0gL&K-QFeWr`w${$L
+z86K4ZGTi}Px2diUTFPQc%%stjPM&88B)RKN)Ji)@rz0$TWtmv?S~1vWmgy(s&3IsL
+zOLnkLZ#-<9i=NJ8k5=m6`3a>b>6n+2-J9nENRB;`Vs6s|OIIt9MW+Fajxd|Pv?$`*
+zfncC5x&xUn9*E*6rHr$ZtTI657d&7?*NVD>UNatZR%JJa{d%QsZZmpG?_np{v=SXx
+zKls+biTd@g@%&E@@$Wdy$I0385PEfc9a|k?)s2jw90xX~j#5kTOqfFlyS^ACLVlgK
+z&KTtm;5anr6+X%^z3^|zF{=WMUsl-xFc~JWlDK<ixZeH-j>c+QQA@;kV5OJX-jZrS
+zjQrYv;q^7Jz-Rg|X20XmJ0EeiW00L*_GTh6N%Zt!*bL8cc9;YI^fw0<&DD;!<;97E
+zpdHL-|2{~RVrQLoxdzgG!-EVjIs6ph?{V^EZi%E%qVs5NLH^98m*>qaBN2c0kYoU|
+z5Z{rUdFQTd%P3+}&7i5tU?$LWo@U7a7DOi{s-MZv-oOa$Bn`}mVo}Cp-N*jQQUPRh
+zJ%J|z$o_>y0GRJ%NFo4y1n>MmBm($z=81^_vWFxBIR5e}69L>MoGKB(4Cm3n1ZavU
+z0>FssHUBg+0eqXB2_QR>37~63JQF~6A`?LNkW2tWkIQEdJ&OP4Q|z!kp26>mADg#^
+zRw6D7^;|gweC5fTnX7urGjq^h`VC9q?0OGxy!72=n7<jX^-5(5G6ug4QgANj3n+Pk
+z<?^E#>GGxGcg?<ffLo-MUh0AuE6XY<elZbf$-6S{NW*;+==om8C{+SVZ6gItIYXtI
+zN@7w5?nExuNs-hWa-qxg4F;8hL3s!WN-L47dr~pi^If5RIJ8RWC*lere32CVi?2Bj
+zJN6fWQsAZG(*$Adb;wVZ{z%GQaKUnhPw?T#_a@BWh&n<frC}q_O07<)hpU>ki}+XO
+zEdFUV>V(y->hEy^@|Tzx61<KZ`~A~2*Cq_UgHjr?^xg!(T=+ar5Qxc5zHEekd@7P*
+zlT1IwPcr#ORDv9OK>Fc%{NByucpN5TnUc%9qL1R&JlQl)0oA6(0h(Rvd?R)Eu_;L&
+z^z2idNl<}-mrLkJv64DFG2>>fSzs2@d?jPabmwOQ2Rf{}O11KDOYyTgTKR#}iZZRd
+zyHuC68p8?<=i7W&mtra+RR@T>)2U=E-a051OybnS*8%=v47(7FS(N>G$24(fbRY9n
+zXP_U_<Oo-B*-zX#Y_}mWlMFSDxUy7J&kklhW#^l04eT<__Llv@pLE?W*dE3Q5B`J*
+zR-3x&6UX7`b>x!=f5Ojj){bb7raBJSZx0tmuY^Z}NvIv(9JSVO@A8|YlkrIodosFy
+zd!OGDJsqD2B0kBg-yZXeQK>mPv3`5MKc(78O>Aiu!0^r??(95CD>6CTmR||*2Gh*M
+z)Rd*0$T%Revq)XeojX&5J*i~#URsiSrM14vqNkBF8V|4h8uu080PXo{w#M_BI$?E$
+zoi^K}Vdgc@7X0S<(L>BG&EPp%b5t|Tg117oL?6IOumo0;;j2uS*Vjt6H~V^C1eh-m
+z+a7uWe&PP|uG)JYdhn|=iiz8<6`S&g1CS-etj#s4!-3UISas&AEtBgnzjEpQU~Adl
+z+!E}%azx*}LM&YQWzsOwO0x?~uOpTkbxP1;MwrdE#`_a64<CT}^1fOr_?69XUKmv`
+zkJY9Hze<Do{66@V<?{aVdN7h=Ys3VbS|RZI=wEa*j&X~T6WQ6H$cZd_Y3Jg>2~ZPX
+zy;xH<2funT%}d`%t^$h5luOWNcz}Hy5d~0{-EULz$XCb_u2fx5s_2&MZgO=n*Lu6^
+z+R?<Q&@>|j2~`=swh4aLK7y%H{1S@9Lgb6*Jc<z_qJ(<Zvi;Z8uDLqM$ZL@y%*Mtx
+z;5km>>bAHxkaW=EHsBefGOrI?(@QZT(ex6&88fZO1EjY#;>Q7@z35omo2fw0n5Xxn
+zC($nw3bvY6CFJ};`8OsZex0~CINNGR<u#*jzKQ<x30;ql4%T(sYi|I~#z6clf04B2
+zxnABKTZ^#bZpCsPcXEMdWMkrdle*9@lU+?`(2Tzt=jS%j&z>_bJ7~vqOp7^qACu|z
+zSNsnSIgsr`E(Z$F2T#Too=x;`&*616;)|V)n}XKRU5|sZ;^RTah-*!5E^a<~<d1xx
+z%>rDLP0*}<DY8<&Wo-h^j5+})TD=12k!~5yzR{`l;Rg)PdAl7ylDQpuR)v>ty^QAw
+zuC{9>Sw0Dw;|<8Os`|-DY}2_jFcG%^pch3VcGBiI>7!NN-A<Mg0FTp+#G{B4aC+$B
+zWl6?0X4U;*9a?<|cv9|4jCa*Z`Od)1pc9XLIjERn7Ao<RWP0F&`YS=;90{Zr)z1`^
+zpYo0rdFj_<%z|pc^Rgp=x6%VoFo{>akhBaOIvMmKk088yE+!X@v2StVt&NP_1Y<8$
+z*$;YbV)VjHZi1zvdcOW1uAcktp)gMEP0RQmsy@g5GP*v4O^aGBHdRY%wY90*4jO26
+z2H37yYIQdJ<bWmHR6R+pp4?PD1^0G=DW#m{v*x<kDMIm2u#}V8Qg%mN-K$w<;^s$9
+z7|8O{SM36$H~Pj>Hh}{fglW%coSJim_~)1Y%LgkCdg%r`M&Tw4m4RXUlF4)(HUOIO
+ziplvaa`90veGDI|D{}K!WaEQu+Q1)V=dZ}X2N|@MKgh^mVZ{eldNY4u&0itn1Ce_0
+z0okdp5b0OA{b|VOFIxO5OirSrL3RT_Ml~ser82Rr<^5=Eg4D^MX?v_CdJ~g7f!noN
+z5=(X($x8+OOTUDEZO3o4f$R<*Jsv0mn>}zj*yrOxI)FMU)a2V?RYz$a(<)P8Ls&VQ
+zx2=$r_k&e?^k<u^8TvG(22Ey1m~`gPRQ?i8LzXD2GZP8!vQPL1Oguw3fC_--;7K6{
+zXc}_nR9nMihLB9NHQ?7j^3sB_l;sn(LP;j6Wwy5jOpEqoI*Y$GhVQ!uJG_Tja2xq-
+z5l>|gRD>0i>9%w}K0Dj#xvU+U&P#JPFF)6V#n9IGxSzq*hiUy&%_a^-U<{ZkJxkaY
+zVX9i#`EL<pHR1eGw#UMN&)jm}e-~E=j8SF{`sNlNXa?H3YIz^D0*Xm5S4<GdQs^HD
+z?E-|a4+nF2WeQ53sQ^Jqp2gW(HwM6R;AX;N6*tkVbH!+8<KY!}e)<sFP&59>Xw>9L
+zvgNP3E3TjnP2~&_VV)8%F*^=}1_gki=Le_XbqEzDFR0d~2pArT=gIQXI;UGlB_YTq
+zh#-?OCtppzD+Z{sYY=J-;6<+`R)l)gOWZbRu)T6;95zR|prubQ6k8%D6o{Bzzt7fO
+zDEfu@wmHo$ClQ#Ump0rvSf>8h@1%)rgT_$aI^>gSL(!9eMySr(sK@iUxP#{*d-2_f
+zy!*8mc_f`@Wa_4qzeYPYCIQO<aoQc<)RG2ej_`Z9Ww=oX32Afn(JP<h2?qO_r(%tt
+zPe%L`C7_2I{iXY*%2v$Y*<(_UgjS1b^@#+)Rv3{bc&5;}l~vt{g*Mmb#J8aoYvbW~
+zGvip+nCwI%O#`yjfp6lRtiJdQ^?3r~llC7^bFUR;v=-S-iAH?Ob1_qtL@$4iZ>`wL
+za_S}}kw-CAzrrrG7Nwg4fB?}HUsEoA@@(RBxT%qS;kB}oH}(iCNJ%uc5}I0wF4Opj
+zn7%}zQm`1EJM}Bmd6bB6kL^(Gtlcu&x)!Orqp}hVw087?gxKi;!xO~4J@9K}m(+?A
+z-<b7yW#1as#64>ff{fPUbbN&!+PwK$U8jrgH3^BSsHk6&4kD5DiZf8MmN^*9t?^Xk
+zT1iGcBPo7JA{2&-@9%&=wmA{G)Z^<kUNjlK6{WK;c*NTu()@SNvgX~^c$>!DA>=$U
+zxkvULGAjT5S!^;3o2;%%_$o<JE}o+H3&HSl08XZr&nK3kny-NU9Nxg)&n6;8r+9Y)
+zyo>8<Bvq&L7<_|U%Qjj&V^C}U#IwrEr0+jsECWAb<=e|nvU1w-7lbaE3TuAtqWDIc
+z4$#n)9cop3@?M$2`M4!^^uCj2F*969bpP6f`zSh@xI2IWg4)Wy`|}lO6^|qBuf`RW
+z*)=>L@u{v`switkt?HnQS!o%1*jxfjcy>%z-ta(MpkRCO_}gnQfyT;mP?;;xJKgth
+zo}$V9Iz4-haoI_;*03!Qx%U`*T>v#ISc)RW>YQg^nns#?9%3g47uvnf?X`itkMpbS
+zOYa7jn&+}x2Kfaw>s%Fh#{R%)(n1c_1ZUn57!EpmkeZb59f!fjn+|BPk!5P#NuT})
+zzz=IUhU^4(oaeUgKAP98m6$D^(T(wVQ{E9gqsg+ZRxenHxEOZ~|LNDL$@z0Ip-dmn
+zyF;&0T?hPT&3yp3#Xq|i`DTUYg1dehKRNS#w=v`c%wI+){+bWC{yw`9Fp%c-HAzSS
+z)Er0XBs7;j>?6WhyZ32!E(F19Ewr2Br?%}Fx9oo!^Qbf0@l7(&Zqw6Atuy9jA7EV9
+z8I}I@be!8zVG!dQR6AhQz9Uh4V^VE|p*c?WNw5dQi6%;cI#(Nw<g!LG21uP0<s=c8
+zU8dn@kTC5@q_o9&m;Utx!W{B$!wK(p8}Gh6@NRrr!*~7ivTlE7@Uq%jA_`+!OThl5
+z#djHDRBo(fJ&DGOob(Bhn?wO7=O#&r6pHiVdBlXJNw56-FZjxnCw;~A<lwq*v%1R$
+z>ay5ke1jVOVpUS{zz0tGyLIf{y9T{$6y3~<8cx+LS(Q|rXciNhyARRvphfy_Sb$au
+zsH0PxO!2G=Sa=B*PP)M;%p6pROM+)%d>i5~|M>9Ga*SH}dgJB)!t&5_#*_fshh|jH
+z5%Q%#dN3?qv2MW}LHRy}-xsWEAq8UmqZ%RVWtB!@C42#xLwKOZAngb(3_IvHs3C#P
+zhG>E31q82JbqElnn{IrX>qDS2*IGa+D)Y)^0O*h}RGc-a3VNV*xvWgjT!SYZ7U`f1
+znaK}j{A-WWU*Z8CrbPN~GE7J@bO&<&iGIU`j1*xaO=hF-iKK1-wGq=dl=qWjEAGiG
+zwyQ<<RmB-iMH!?Ry?z$0I2%lISxs;9h_tN_(ALW~ihq2bVJJRwN8Hl(tinBTKuyem
+zXBii=jQ$3?@>*4|9h&D2F6~Ps#ExsL|HZ7l54bj2gsG^{#WC&D_u-K;&|qzT6S)MB
+zImRCkwFAA;Ed1cf+BS4Ntj1Um*t_L7GIjY<d<a_Jr*Y%<zof?Y@&VCNxMN~P7PoM-
+zXsZQH<eDsjYve<}muxt}{ygwuupBSlyKu0=?(s{s51s)Yp`fvokq8^wHWJ!4U`4VK
+zV0+JOd5M1)@ey3(U-?Xe<FMw&6Y=OYzXD5P6+lOy<E2Yj28#;%2d2j{|FbqPD^hH~
+z5(WEr-|D)0MHt(K*%e_L+kAW)pTUP~yWtP+gu##kFJEVrLx1!hk@@r=x}C@4L(>47
+zmv1+*k1F)iqj*BQim4^!0c&&ynJvvDVhF4&7~TaSrr2uE$M)QP`ab@AG?9$;yfR(@
+z<Jh9tO7tc(Ofohc!zBMBZ|9toZAy9cEu2gI%uonpifE+(yUk_EE`w}e82fw;y=$Nz
+zqAJvx%(BELPW1+t<qClewviJ^VD2OjyfmG?#AxbuobPQlFv1)<r#gN_(h-I=!%ZH@
+za~|qPRky~7azMT8>cpC22$;0dtxyHm(?E^-D|%p-1!c4^?}-ATH3jcX^aUrHU@mDb
+zu4Wv(3Niz5{(O?=<&!u5_LGu=Xgsc7$ivpS9{uzV^Z%jlYv7_P*8k7K0xPWUrl_c>
+zsQ6O8gyIXhmLMLmbaj;gtw1Y9+TJwwsHG^jV7nZ*thA^!sqBWmX*blhP!}=4G(|Hn
+zrk1JI*jk}^5e?b@JTqqwXJJw6_Pf8||9(C<*>h&*`Oe$(JTqtJ`*2(ql!i9Jm+8Ln
+zCp2gSdKXT6vejOeVo_`il{O>7$Z9xekKI^>C53|9Woef?mJ`CU{}ce<o&BSm7XGL2
+zr&<V4tnLoJ(1hwZ`8!8W_3!ThA)Qby8mp{J@zB!YA_8?=gGd>1?(NoC&T>~lkS$(i
+zU8+_s7!d8sKdxKjG9{b+rkdNp)zJ-9Plkwml{Es+a=G)MuwERh;QY8s?l$mjt32m`
+ztwFc7Ge-7Bob~&lvY-9GI+ZtmnAVbry(L4UI$MWJDA1W3ZJO!l?j(_0u)uDzK+gho
+zno^>$I(M0h6P}}T-7hpDQ+cJ+<wpZE>f`jADfv7XeLT$^JOhuE9*(8z-`_`37^v82
+z4?=I?KkSKW^cem(dT;D>jc#?BeF{X@yDb^5SK}d%YuZWtN-QtC>Tf+2q}w`av{v_i
+znGOGwu>21WPwOQ|DIKb`+Z76Tj-%^h=V>e*Gx6H_Qx6=jFzjA9(58Y09_C1C!0KUI
+zs%M^hDxqw~#yX0c7c46vR%o!aLrXlWrj{gHj2!cdtJReSaCm?ST~c?}zXzWNV`Aa-
+zSlEo^jn4OZZpp7ehtqUP-W~{RcjUk|al?(Q9Ni<XumH%3EqW}CQcv6#vdKY;eo8L-
+zU`(^3%S9Dj(VGAfsJ+Yj7fw1uqB9bA7X;_+wdj)z(zT=aS%TsUG<kc4f8Pf|Ce1NU
+zGy>1!n1=}c9lZi-=l76v@}&hqz$#c!CH`x4m7q!-2jvKt$b}|Y%BD)8i!1mV4lT%|
+z=R2Ygn;WOwdDl3Rud$~9|KqT;(R-th+vfZWrc0eJuMO^`0<{572p8x^msvCk<d<*>
+zMs3b{y~tOCt*^-)qk%YoiYL0AYK?!*x#zG<|8H=n(Lt8`a4~5fp;R>PL48LMmcRib
+zzbAK*niGPsb{XCW_CohS;`jieEf!It5>xhLG;SmQ*LrnXwp!fn_BSt^4wAAV;(*-<
+zv(eqn$IF}=drr08=n`|PZE8GUYT%0<UtKWgU-7thh6B21dP793vzGpVDSeN)4?RDe
+zpz7q|_d|4|Zot6c@?hEL&NMb1uDD|*tW;fS#sf_!3B?0x${jPD@F`UqdI&3iv3drC
+z$>@T$j}9VN6$IMULlYqi#=mF6q0Mqs{BMtEKk(s=#J$_^0cM4=;ZW*`8a#Zq@4^3}
+zhahXw-H4q3Ga)@tbi(EIspQUMqx&wbq+yc}og`O1t@R$E6VNIKK#YW0v%r}=WkNPM
+zE|pVjzXM8UwsGYHRPUytLG^g?1mY*r5MncDfr*sB*=I3uM<EE%h$;Yg;=LwtAO0kP
+z%Wl&exMFW`S$;}z?j;hqDh0UTW-)NjUzWgaY9Qct&s2arKa+urCE)f0IH#iJ^bFil
+zO>5xhdxP7jQi7Yz!0lInn<j(1SSNvNPr>z7f}0|PTMMi_BdP&hsRCT~j}o}pR>6(&
+z1~<eD+{cS0aMcQMTV^tFDGZ$O2LWfxP=Nbq1_S4T%eEtq063Qd+|eH-aBG8F0~h2C
+z?gdT>E|h^gq5u~rgLD2{0#|dD#=lHw_krj)=3}X8@Bt|S_*+et{s{coP0_Hw?pUmu
+zA(p>`|L1jKhpz7O9I$+IrTbo!R;9z56y8b>^ub}W1D)*4k0)317pd)w)vN}o8IluI
+z-t0`l4~lg<IULj$9IW+2;d84;@UI9|wf+eiyZBGu(=5y;ye73C*OMdhIOWt~sc5{f
+z)Oi^Y_`*l(PR&w_DWR}moK_Lo*O92I+Z|z1S8xO4>UQhlk3Mk)Mtx=_H{>>}%MTkS
+zf14&w{9+du#c_QO*6mhXdN04iMR1&@x8b0m{y5$}l7_z2ttoS8jj&(lj-)B@+e~*D
+zN%eqRuS_)ur?P1(;#4&Bc)9t0XK*w|ZvtP;7zrQ2gfKW~z!%zuVtaa#-B^N~R9E0X
+zW}rnqX0Q+t?MVU>crh{bQ-W-_VYemd)3dk<+`S!1exD-zm!WK7r`$1yC_!H^$)L);
+zvd9vUdu2LakJe91Mk9y&0mrv_$aK8ebt2O!thTuV&c-{*M|0F^xF0!+TjStAfFo#c
+z4WS{oOz8AgdLb7N-w&`AMq@z72qoA|z#5vETvMu@M>f6&d6tlqe%M6TNL!M`Qi{e>
+zF{Q{PwsELCnWl;J!|}*!xDV=H3Twh*EYpOdhS1m+ekiE{PTSRzXgFA=P>QO4ggeD9
+z0Cpt+=L;nFnC8LB;SyGkjW05!mst9Xd?~D7U?;1Py#q|xao}qR9Gf=G?JuTpu;v`m
+zi-IeAh(mC>Z_RTp9jMz`1>cVhRoM|9p=jVSa4b~G=;OgarKHM@;g<S|wFQA=mI;SM
+zz8Jo288^VPWJ!l*f!0M4+=38sUWDPo0`<TPxV!4axX`{XSdG@l>GB-7HSPeH&~hiR
+zI`ALhIUG*+w{iQ=??%5>g+<qq22|O3J=_+>9;1Xh&E%P{_6&8;lp2_}Y`O+N7eaAy
+zw4A!GP!1HWC<5L>Ui`idSo}Rv(RJ=fU*+IJpfi%uM_nOZ7)hhC8})Dt2VAI7lHAUh
+zi2R0ul_rrd@rNycI2D?Vo&w=1#nB!jUn2^IkTXtgnwpx7Vc4IJus<D%R*<5j97b1~
+zS%nT;<^AJIE7?CjJDqZs%!Vm)Wx8~P+@4;G{fng7o<ag%j6Y<O&ZO7&N(cJz9->i;
+z-s(n9RF<N&Qyx!3WneL$6u?>oU11*uk>51%_Aq{H_M498N^-`4oEIcHb>g>FQbOz~
+zVXQd}U73Ql310ugqTNO1jAn9v`womoZ9*y@y`a}?6;d9Rq^Oj&8R)w<Yo_?9&5^E>
+z6#I9iHetSNqXs$Z>FCuog`Dy<pK=EKlJh8&(~HWv$G4od-%&Y3iJURcr$=Eq_j${?
+z7t2Y-ZT9(Oc4L6b847aLRE`sE{}w9=EFb}AN;ZiHq;s*7Mn9zIyhS?+Fc7^pRf_d`
+zmzsR*jP@AjYqK?Cyhc=ShOY*AHPbmJKGf14E%?>rG0f9u2a0hTam;2GIfBMdcn6y3
+zNGebfhrtzsbV31|7%HZO_XX{0&&ji|BSaj=VtdNUJK&knaa!usWVlL=It7xcaZUp#
+z1xa84&`a}gWeU@FnJG*XMZnIlLYmVsP*xFYh8UGfqF#|yByIwGPEiH_0baU%#GwJV
+zGCi0@oCXJ@5E1K<3nIPgz~RXH12<OIdHf%$PCrbQ47E@U1gOOWh?}1flc2^6kA3Jf
+z;Qdbs7|pwd_9CB$?Vq^Mu}FpDvHEsL<Sr)blYMA4OZGE%FCf`q_rJuPBGI@q+7*4c
+zA}Gq9lbeLWE{}yP7Pgd4c!h0GDV$(W+0gd{@bkE^R@sA>Y&MbK44PuIonKwRjajD4
+z+e~=ib<Y*!e`8ZzLVzvhL-=yL3Y0Y{a(4<S>s6r0Ka4&+jqs*d@+ZjI&y*TlN)>u@
+z0SSvB?gQ-~U5Cp1lOpp+5$3fjJHJ-0$i9xGBG@M2#=@%HgqB_)7a;0`v!{y2!U}$q
+zD%NOQ*49JfUUb7PuX1<9<A=C11-a0$wxA@uj4BjUPKd^}*r~dzhZ<Goj)_`kG16bg
+zsz&ut_h@U*39L!ive%p?DL3as&Jr)f8Pic}*AIn3j1oQ_*Cvs|#wna_;m&F?1UKzR
+zYLyoSV<)EwPoECW%U^0t6jRoU{A&C%u|Si1WtnBH^;eZePZI7X=|*d#gns#Tf=>BN
+zv!nyg6$gf_4EKzCmzYxJ-iC*sN<u}pk;g6t3t#MhG8MzgAaI0Cxi0fU;h1AWfQk6M
+z{cBmX#^Ywa*(Tiw?T_{VrxY&nkG>>Cz&c!8_<5fE6ehE=>wyDA{HlWc0+?NQB}+qP
+zbdAsh<qg5U44JRuKH}2^!4O56xO8`*^a8gmzjApDj9OjZMsl36kkjR_=O}`wsK}9G
+z&IY-jwhmICox)mz0G@){ONj5Hh`+MuY=G$j6@DrePmiQH>|?nn$z_c1plqu@er0Vn
+z61SDXXv@)gHH#Zgd#It^qy~CBgo^tnl87tL&H0G4#5xvw3_`AD01^lLaRu!}ZnVaN
+z$3U#mwjwY}<Z~w*YK1fIfW|=lH~upa_eVwGP}~Fs{3aM!LshiYyhu8Idf?xztzT*{
+zRr(i87r7Qo*~9a?{0p$d5;RBLmxKaB$dHY$!&o_SpIumqhLR$MSXSKl_OjXus0bS9
+z4wK8gt-Y*iLMnm=LwQ?**%bJ>4=Lsjj9Jcb<rcX+I!n!y7fdVi8A)zAQefO93M;V>
+zuZFImMXi^LVu=2Ei?T-^{)P2OxV2G}6D)T}q9mdh7UAB48!k8J1MJ}AlKjP-JVtC2
+z#Gww0VW(sRx*a<t<yk=M@BAIii(sP1Ve!~GfDH^Kj1sXA#21QuxIO<-LKQa~D5a>a
+zK~a5}0ZF<bQQ*{L?LV8Sfn4<Yad3f)fRnTCDl<Gy76e`B&CJHo-#pCrNM^%+oSKbl
+zQ`U%?*ldK&WM*T5iJ1*NDa9QCGPQzV$Dz5sNxO|@?e?@@YW|<_&q{1R++F3a$zbn(
+z6m;-zFtsf|XdnbcW@S*+B5S3ejbD%Z%ARAh^DD9HL4j02Iup=^6;dtSg?|=nXy1O<
+zizFMyl3mnE$<A3i$^cHXhe&9He?E%yy74?(uM!>5&e1MvuduP2&}61caHm*Erxby5
+zEVA=?)KYyUSt=6jC}%S#;MK+(oVzogPRv$~1xL!53%2SFxax+z6c`hg{C>Iv>EzHQ
+zxVa=0%EqcwFFM<X5o6`VUV#k1hfXq9Hrz!X!Dd2-ex~EHQ}!fmd!Z(=4#2uBz=O56
+zLa9PeQth!)OxcfhqHL#}UUteU*{S{5j;vy@iJf{wX{T1VlN$03W~ZEJ%M-*-0b-m&
+z9|V&WR}1kG)J}~c1Jp+Cly~{WPOZX@L`yrhU$RL~g`H}8M(k7`vr~Csr<`D?)=75C
+zN$k`s3qi9Nx*vmqvb84}C=bYWscI|F^lB4Yc8;~^7~G;a(VF|9)lsiNIt-_i(k*Y{
+zist65=PYflIV-Uk&@=cEq!`)L+iKm_7Wz3?VYPyd(x4$$>p*`WR?CJq2PmypA&AlC
+z7fNR8a1UmtR?F4=UMtU=FbaAKdL)3Rf2#*GQ>(=s8~6*Zr>00|YPFk}%UGvXHWl0q
+zrcHG_ZYl$5svMuK<1fh>P33GV;Mc>57%3T;K0WA=@1rm<!x&t*!oYNA4}aF>*AW9V
+z4-CQvH5qGQVAg|yAzXCm%kJJb=2VERnVQ*{iV#^ZF&i^g&4%v^TFhA7$a01?A#z)G
+zmZ}(`rgcf{PHhbIzDR&DD+7hacK5b2lR}gY>i-jKP-bPMrc9KCeCAKB%=+A%b=1lP
+zQe8~-7w$N0YRtghVJyN+=JgiPX{hurScyIA90;Fw1Ma5w2AdjwC9yNBv7Ir&;-elb
+z6S3aGZ<ql`xwc=TW(F%jqS@Z!+#O)I57b)L-P9V`__u(`4I!HG$P80fXD}JMtOj|(
+zG3IV&IaWegs?}lzHf<;>oHWFptRWJD6%Ih4vU6??mK^|nMc`mZB6fP9giY|hQwTE$
+zFaMFl+GwUdXVvmXAb=DC%$f{$d;CKKdu?XD`@-dKyVdo%jD-(#*<tkC__uBRS{wf+
+zD(*&y9<28mmThe$iARKan^i0|y3-Ga#A=)%n`9F1Vi{Jnk)5F?TQi?MJTF9GwH9D)
+z)C-->`e80{Uj_yt6?zV0kG98ZEf|Bwk8#RQhRc@r(Jnj!zz$hYU9`G7;qLJWYvBSf
+zUSfm&sHXO#ltU#C6H-6YwpLe9P<YXJEonnvcBNJOot!o=6@^vGh0kG)Jo1j1ko_!-
+zJVQnH-MKk$as@WheSD!!BLw7LiL$gc@V0DCTm}E83j7jdHH6ZuuHfHRS+9WENGZ)7
+zGkTe2GX2GuHmYOX25U|=Ta4h>F`Q*W0sj`B8q|seV+@lu5Qgrpn1ldkMM}{VxH?G~
+zE?w<>!Lc^?bfH$nK=fUhm{OhZvGl>^OJ<CS5YyK#^-pr^hV6B?6Vpp^BG|uMTVQ<K
+zn&ZS^HbBY^*zq&r%y&>jGt&B-%A&)ih+mPKjMk18hUR;~&Q#0Kf|vBbg*hgua$~ur
+z<zkt87qk;@A)!qL7Zr!4@GF5AvNYMOvW203^QDVB8&J3TWUneFk+LZh7Gyn&>Pq&%
+zErAt@YA&PP+K<D3s4^hvxd~?J%Zc>J4?+ifVf9~w>t{j&Uerf>fFfsxeJN1b*_Vde
+za~dpdD*5wpVgj3k1dW|PPhyWv_#WKAQd1gGG(C7$qLbE;M_ET;1Kmg-YVC=7`tSri
+zjA0K$2^CMf%*sUVkU?lRPiP25e~7N46%*9(Z(H|Iz)5{32+qu<rJ>jd;YyLoDMAg_
+z@o*=aY*`z_L?HsNckD)I{&9=0Ah7vnb$n=Fn8J6E3ESO~<Yy>{9qKz_hx(p7Rk>GT
+zhx#hnp(Z;cL&BH`{P<aU&v`TKIadKcw!GV%OajJ}4d>@FTib9pIn>c6u}vz~R?qSB
+zZnM+D7n{)T&dgmt_Jd-#x!5k0pnI$3-DdGO!bywE2cB7fDBJ~~qOqfBnUv>RIzbGi
+zs&g<APy+g})W(<i*iJ5yx04_2>|;AQ-3b>q_!8@4X*+o_*-p-mFw`zk53D8I$q7EU
+zlkb4tR$M7*FB!I|`UKqUZgRSE7g*X#E@s7SRQudaE~cBwkm6G{+fMG&q9C%DTuhS9
+zQeS^J8P~mp>?S+?E5#fQ*-$PvrJ(^}eL=jif#!=-TOW$xfWO5wH8l;RK{0B!n@mo#
+zTOVusioNhLGDlaBQyhWXIF5Y?tos(f&7nu2()F=3wF?c7Y?ZZfK(@bmK!#XRcFND>
+zS*StZoMGpZ(Dz5NtDB^8w-u*ofh9H4#(9#ou?w|N{tBGID*DZ=cLEFrEglL<8c|)?
+z>`aw9p_MaL?s3u!$Y#{qwS|DP7^6fx;_0628K}We@vw2JHH?5mV8Rf3Y7G175AKyH
+zZg?j-f@~gZLOC3{Z3M4R0ROF-R{f8Yxa#Q|X~u{NK#Q3K^+oGXt2ldthF13?gxFcE
+zbq^2|HB&^b6V#Bg)~<D8T^Gt~J6wh>z|E5*Q2y_@e54_uwayN3qGMRRie6v`7bVns
+z$`3Aj@#ihm^N$Oo%wg!I7&wSk3+HKc$@C=Fx3FhQ#y$D|j)qr3#Pc*XtdXcPcX#@@
+zJARxj)*{0xymZAwrUQAcha2ptu-2@l+dWuJmRW-a#ZU$sGy@ytkX{*Tx~)!xz;|?X
+zu#yV-61cB4s9}_fUU9-%a1JeOThkqKk_EnQqqS0&*RD}qqiIR`l@wQ;gljQ*t*3di
+zq?az~WyUoLGz^J(80-|>Cd)=iyXXja6dYB>2)bg-q<s!xb)=ED%-^^|&aBme#v~uL
+zkw(H4c#X9cd3>RQiv3X%`%?oEOTx9LVyPo=mD`MJ(L}|pzHmqbeNaKmey@R*O&+h2
+z%I@?nEnB2zi-HDr&9$k>KS;$%e-3^LZULlg(~?tBAy#B<X6o@2783`N!>x%?CdZU8
+zRQoykQeJka!ouoMNC#?R18j)_ZhvfG3lamUjitv_fMTIDkkje5204s+6Pk_<W)fa>
+z3ct=IMoXUo$2LQO>`ReF?-9a)LjE=g(0~)y`buj(ugCTF9D{3_TCpCwVU)E$hu-gm
+zZ8;xm-J^lCccSiOO08XEA2l<>(&c2$abABiz5ZlC40fPT^7Y8r)sH)2td&`7aETwb
+zC~+Pxk(9-U&X@tQ0dZ-^(i<`?5xBTxthi&ixW+Di9DacRtT8s=B**v$a;_GR&+GGD
+zOM~HhW_gW@a|b^~u4+Dd2UcfriSr};a0UtC;8~zSMfjIzfgTl-e?!r#8hVTN=8oPP
+z1dXKw(ZBw{=nmr(^?86^8uL1C3-K=CcAF4L4uh79@$^7*d^lxno3Ce=WyHDiWf?UG
+zy3c?|de1uuohAeh2#0;O2*Q1XO*J2B=l75hljn4j6M<{t;6qIihaOg8Y3R^J>QrED
+zh;0!bs!w9ok(*OJ*pYL{;_t|*h7g9SK)I8KdiPXO#i<o*p%j#+BkMnZYltc~r^?d9
+znzNr1!r+QN$1T)DDT3eSZ$*AjCIrv3hWKHR0kk+CKYBcVkZuh2v?An+q>i~^MIu_Q
+zh^Bc(HdeM;kr_RjRphyLUKQy`Dxy<Vz&HLW1~2?C8*YeyRy&H{Vcb8pWgW&}AosXT
+zlsOzPlG}Edh%%v4dR(a^72t*8JVq@#)>a0M6UXvZumQ6lRy?iYT|e3j?~kKzh<9__
+z>)~Bp+YB$)9B-ro@2!6t?{BdLFP;R;&kyqFIOVP5aL1aO2GFkQk=A$MFE~UU0oM<w
+zIo6zLfH))YU)bWDW|Cp&pT*BiQ<3J3ggpNUJdmEFWpGN0<iqfftviMPxC2VC^n{N$
+z$MWF;xCB#=g-4=L+?O+Gq8Y4?yjH4XI~6T6mI$zPu<jrjg<x99v2M7&?fk$&s<i8%
+zx>MBhY2<sN=v`8&=20zcenPJKiDorFMQVPk^_sUk&1znwtobnbR8R8Znx9-#E!Vs|
+zu6Y+y=cy-grTO-L+{ty-l9}^6S;J~RF{DM!YowZ=pfx|457|y$ujcpO&T4LsbLz*y
+z$)^~~SsW=E!{PF0jx<R3kX7O>A(A@Cg5{KQaHgWmzc7VRN)<w3IgCX~36SABwQDmy
+zup(Hhgszn#sw2S5?I8esq8b@TdCjQRqi#5(GJ>x+qsINxY(}-|<~^gttEhT+)13Oc
+zP4hXWCxC+qVEZDquW3~{(hKx=BX0<LW1H)NcARepx@Sw!-4viB{tD<bBPeK#GZlR2
+z+eQMb8GJUf9`L|%F)}tT$Axln5aoN7-DuP0odCKK<Lar{asElemeGwzr4LE9Ga%f@
+zGi7uYO+HeX$UeHAud?w@l$1t3E-5}IUHy*Z;I_DlZnpa&Qwm#H6_L&NuCv&0Cwh@)
+zhXr%$X|H_#D6Cn&(=%bk4&Mo!WUt?3_G3+q8V)H88*WVEQGARuxaV2tti|=qh57}-
+z_=liK4Zwmm6|WjsdFFZblSe2-XMScqwUYMKl+LWDa>1eJ3(=D<fQ@@)CG^T#(kq45
+zdeuTdI!B-bX9mgBB){&d06Z()8j-i@)|A;a-t%MdaHhehLJSkhjoFi-aAW9I(1GAu
+zh8n7#1Xisw=@N4RuW7m~KhUTFo-MqFM(t9_zAm}kD6uoaiBYq^T}5b&!tAQ)GK<3`
+z#dSAw#_ST|s(=Ob6+D!)PGLtL58|waWL1cprNkVEJ!B0W%;8ILvxVWsHeAO^PD3Fi
+zFl7Vy<>k>|&dj(E72ifRR@lu6J3)p0vA|21JII%?H-2d@%peOh4|lGBY0xJcrokTI
+zbU%&-;aOYBpCzY5(ofmatI5&G2;g_4hj_%LVfOR}!@gy@C2GST3)>iWTLR31GsS%;
+z`Ea{&zj)BFTQD4R9sB-7_c-iJe|M^GPrPs&C{3#UCx(Dizkhqt3KjP%@SyJ=xcgz(
+zD+0&8dijb&8{~)|cCsef1Tj5+zXyi&Sv~MErvtqa9@y#CSdN27q_8yH9%9ZOGqlGe
+zUlY57>%Tu4ouo&J#44Jd+$*S_%GyR0T(De9L;Fdd2rP@ti1qiAeT~wgc)*3r?c+b}
+zzuG<ngKxThzDmBy_L+p+XW|h>`|Jp~srLEch*$e8yN|Tb+9=XKWU!9+@+xE&7gJVs
+z21KSR6|cbHoE$&~XQ}t#RJofE&Nuqs+)RkTGeHQ4$xuTl!>`$1li^#nugUPj&yu|1
+zOx}?GUSusdA@2y4x71tS<38o}Y9ViDKPJyS-uW2}u7BK4BDUp(7Vu#t;OOSdNyPrx
+z_)?+2ZYv)yM&nXT(`czv#mSMVEBJQ%JgJc)zxkYA1x`x|9A8NCWA-Vdnw*L+fh~zo
+zVfPAgic37XIpM&=$#$s@m@Gl)@^OxH2cY|pk+Xy~DB}XNE-qx7fs0rc2>}(!2I?}h
+zfx1w69ydweK(+M44N!^^QNX5T^xJR5VBl1Gdx}<!Q`>pHI}nICQnX~_(g=H-a39Bs
+zC1CyR1R|Ugobwr+6G{_>&9F-ed98CJIO|-pOPP$zK`)ZRqZsGL$?0T-ULA}_Xc$)z
+z-xgNCz+i)0Qez??9Tf}`B=j#_QyW+jD`?ZYc`pB}Prao(PLD?b&Jt)szhcMP7MLjV
+z4GA-57`_wEF_vO#Q<{q2^{0z=sIOZzHg=)R*!?Tb+t?AKrfzQ3^eA?6lTp)3@kg%Y
+zE>m+t0J;V2j-bh1N<L^EK&oHCX^9OI0%HR$f$kvuU$}}mQ@)z(nIFaEcRJ`Te=42m
+z7t+MZdc!{5GtZD))>=YPUb$eYLmdm3Lp_!UDMxwlRKihyk9BD%ux@m6`-w-TzgY~E
+zf#sGCCWpE!{(l$$N)vh_fozk2GCGi!jEs}vo?<8-D-8<L@(Q(vlN(J7j1|u$!=X{M
+z2^)_65OjU7m=qqXu>^=ogG5dK-ld`V506Hi5<XMB#W7B0SLwF;m6MyL@G+xo5W7NJ
+z4*VKP;UbCX0GVN*&Xw<48lc;%nn`nn;T+F5<-pA%NsOQpqlm;V_z#d6Aqm7?XY<o-
+zb-6o>Iv6>rCUHI-V&LVH<n|Y|$9N4j3he`6HwrePfJ%aHae*fV8`63yOjkiV<%qbM
+zoh5gqsCG2G&vWr6ds_{D>FM|Zgtmexgl#aIZ39)D=cq_tS+4{?dC14@?l<8jTucma
+z;|KfV6W*o;6+=NJr=7}3r?JE|o{moZisIw4igX;InAjIedb%mmW|oNjDq+8p(S^?m
+zd%D>#3qH@-{n3vaKhB<@hK~rA9@tz(V<6&U^>(1l6l*IJNXXXT-<g@=)}qe%o%JCN
+zq(^m75Y|Ive?HiRwgdyqT7njc?WD^?<YEh)o<Vyd@gfb%#{aql#HCs>kWkwSogsSD
+zgk9DvU3AZW2Hyi*5$8T3G%V>FdPg<8D=wjJG8zy}ZnO$I_cAe2U8kO|vMj)FdWhv^
+z^;jQVLQmt0h$)wJTffk4Q%~s2;R?7rLd=Y>%C2hQ=`QtzGNiMfQo%mH+0T}8-j@DL
+z1^+8I-5nh5vZbG|;D6!bAihk!!`NW<pK5~pPNbdE(3>5gg(KiNj#%z)j~#J5@ER;_
+zbX$$r%1&uQ%I=$)A>V{n)coKcTJxv&_^kQ*rkbPHYJNo1tmb~rYMvYPKU8x+sQJ6?
+zZ@T7Fr@~G(Ur)cUf#pKWVHl-o@SMWdCs>@I7I)k4Rx8ps;4E@_7|SK(PzlZvE~Ua&
+z4(xyy>_FTh6f5YNDG1eV3v?Jm@w&JR$0axx_+bkGw}<gEWG2}i55p@~>3XviXsWri
+zwM<$VlLi5|b=z)nYcmZgT1$x4<)_=G&&)q8{5G)cP<_)q;Hdup={?}bC*15k;I{wi
+zJ>VA=_kd^OV(ydf0aqO)r%DE~d%(eX2|FPd&Tj0{ZJQ8?a~lk0|BbuAJ(}MI9&%85
+z7r64_rn|u3DeeLfHPO4k#=i7|3F(=a`;wl)D-GN?UnzS>w=F1>eAleXG?4DmZPTV@
+z=I<41lT&eVQs>yykuALj9ZbY>8mC7eCVMb7<KPY?>7D4kwsh7rop8_KSvM1k?Wo(P
+z%QTc(f)k`C!iAgdpO;AgkZgt^O9qrSgI(1=KpNsU<yGx>mXfR5nIfc*4<sG5nRF2U
+z_jV93cMt@T!UN}4xq}>E5?o=lgZgFB4#JI&yXYH57d<zbcF}u%=mi-vmx)U?0K!To
+zYTf=2TV>`T2*!e(Sm)T2^w^l?E*+vK-(eQw_Yvgf>*Qr9d3n3qIXi1Sc^OGwE+sF+
+z@KO^0)NRF2V*MaCM3Poa3}cV_fqTCv5<hK6$cZ&{(GsPk;z=`yh{qg)eg>tS5VWvE
+zW9Gy_Qo>mk6q-ODVjU}$dq73#Sg{(x@7mFYO2@8rp)y>Ofrl7hEgnlVL3EMsJMrqm
+z9AYgG6KiLPe_%OAZL|k3c#hnLoelIclqV2J#fX<d_CyU5=fI0X{31Cmt0;3kXHV23
+zyNawq?TLD?3%K4b90M&p#)M8RCT;7yAGaH{?hI(W2`03MJP&owBF}H9&nKDC2aBZ^
+zjhm4vN-a5_{?%?~hTM3A9Q+X=4i}H1q#dMIgqA#v)Co<n0qh4B17U+vYfsRiC&-g2
+zP<Vp2QXN?|7uW?Cle@e21ie>eN71NHb$2ruLoK&sEv(x%G}CbO$)1^pi%)jMirHG`
+zXW+HMDR{55?)A9a15Jg_TIIoZZ7+VMTT>>MF^(4PK%OkD2MYQ_jfd(DwF^5rv?Hg&
+zNf0eZsN<&`Br8(5oh!vd#4n>=z4%ML`1(vdIDifcqF4c&XM+g^eCF|Fir`O%HgR6U
+zNdgE?1BP7Om+Hk!5M2i(*L=NLk0*E^at7tRDGisEj7R>b#P!7fagcva;=p?06fPjq
+z?3aqxmcjXhOT<MRYn^kJ6YIgCU^lZbDdH?%+}7ivvp_B(*uTbF=?CA6zZLmQK+dP5
+z<D(pXitX!u;uv}x!pG_*Lx`PUb}_w61UrwCSqc}^&wjvj+m9&t2JU!Qx|r_27fxgP
+zx|lvZ-0Na`eVND8bTNJL80lg<l+3PmFN<Io(|c}{E~bwyC7;`;^;F!NU(%C-+Y2#|
+zMr;Of)e3M$|B%3CR<#E1S~o9n_j!T))*yk~tN?eqCj<A)Rtel&pAm3ddMLns*Mor@
+zM8NF<aI-#W0_V@b?X7GLT!lBdoh~J~cm{5d0vs=c`(cX&E`WjyQ-T{OgL@t#@{L#p
+z;9?ZuGT)KF4QdtKL2q!qyufW3ErDC509V|Dft$d<WqnG(E$*%W_fB^P?jl6m8c_n^
+z_A9z|?*<9n^A)XutMLYxw@V2wh=D6nfD4hqy<Z}M+qa#7`!-wwP9uX$A>eWWT#W+U
+zAO`N@=dFQz-y7UdJC)$fu@bmk1-Qq%GjQz~xFHl=yb|0a;S8M9N!URE+-ya+KL54^
+zE~Qm)OTEF}?FH`37{(5w0Cy;yft&w{1nvbV0k@%>0^EUa3|uz?ZZ&`#qX2jDEeV`+
+zPix@r@&@<e4kfrK25z+i+;AD(k$+0yE^Q;=f|THf%HWo6Bh)1TE=vI}g@NnVD!5Q@
+zaC$FrFO6c<B?@q_bYtK~F>q-VoVlw4-0H3j-1l1nTp@sqQ-E{6DS=yB-Ws^?x_W`j
+zE>(i78!3S+RDiqMm4SQhV+q`+TM4)?yC}e2?!v&0C*Z09+@lI`-59v<cee)aJ#TPF
+zKU0F6!N653z@^LJu5FgUb*JE>l;G}_!M(c$z^w&v;}zhR7D?d7w+c@11{doEu5^S1
+zZmj~Gs|y1+i-F7CLcqNgrU17ijDZU#;A#MzMFH;n^%A&u%US~$=M8S{r%G@=8Mqn+
+zxIQwt@=X%BGbIFEU1tTj2pQaCC4`X%z|B*D8_&Q6w+gPmH#pCBCAepXGe#N(xD{ax
+zTt5abk%F6{1ZVBcz*R$-tq~gl+$06Kci)h}J?3f+oX#8EgI?f%h?c-@P=GtvnSrx^
+zB!SyVqkNTiQh@uh69X4bz!d?w2?}t*3|#fD*1*+u@dEd`QweSY16QN~H%SI}{zD0z
+zmV)c41b3GV?&W_1I46L+M*;4!brQJfR>6Ji4Q_xJxc7%i;G7C@n>sOYQy91>{z<?+
+z(@_ELgN`!)<HrCl55NslfU90BfqQvpYv49|gA=zY!L?)H@)Y3O%i#X`fduaG#{}FD
+zp$c$18QlE@Tq%H?t^gO!z+KtV8aRtLxL>y_!Ob5kfh$#j6FM?*9T~V06x;+QxF<sy
+zxLpwRbc7ASMJd3&{JI40{#L<_^#(W93*3<?37ky<t|pX$TlBsJu5dE}_kITjxUV}f
+zaJ>mQ7l6B80q)9c61ZKZt$_>n23N9032qbv=Td+($l#8@CxQE869Lyw2`)wkmk)18
+ztORhw72xh?;Ci<T4uyGv>+A*Ywc90dD;410=)l0;$-re$aP!+Mz`fp{fkP0!eZ&a>
+zw@3kQ*Q*k^{LfllLwJLGx<m=?+7Joc2?aQn4DQX161cLD2)HA+D8Mz|!oW==;EDm9
+zNdc}m1BX6s4cr=Ua3?=ef}6#_6)V8aZqLA}8MsIaZj=(-12VXeJ_K;50NfG<xcov1
+z+{9MF&GrTt=LN2OumtXu0$k-S4BXse3EZ<E5^%5S72x*h8Ms>rxDNo_00lVoiUjVX
+z?X7_`c!PWUpGt837`P7<;BJ$_eetdY?&l8(xNAB_qj(|OW%ig_#uUC~5!ZsdyLkXs
+z^hE;j^wZPTyPIcdC0OxmEFIg1Yfd*;ZL0JSdk{C;ukX=~CC6foSPNgH#PX(nqE<4J
+z2zpyu&1hCTW1v5V>*%#NI8|>?R7-KWD+32*;+J=)0YY@F9l46evZz|g^5|?Bd^F2H
+zXclsUU0WGAU=Ds&vr)y(ploo`*>?OU>mmGRXR|lfrF!5T!d0g+jNaHN9gJV&GvRnS
+zp}-P8+CrA5GH^Q7X_~J$d!UtLly6d$;jR)`xT}tkB-&;7&-Yk{q>7g_V}mRjYlUBC
+zY@kp-@G|}@71b51lrgV>DY041E18(DJ#0O#{EXwa!&!CMl=o)m1NQ6fjWYYSJ{5hf
+zZb7$)KK4rSiH{T;n^KHVMKAbBvDqud6D?Cz2CjlWjLL3C>Nh<V#rsNK4gKopBXtK~
+zsnt+++k+H?k}&WGe;=vGL)qUQXqkGOuhe8D7d_bw39hBxS86hdpY)OXzLu%c+t=h)
+z)25<WA1Pk<O3}Gl3W!xJ9uhh>MRCw%io8D4uD;vdojnBo!Nb`MhkBd|-4!Q=Q_yl|
+zy)zl+<B1UI<|<s7I~cUwgZpyXf&l!>eQWgLO8&e*e1)tOGeR#5=f!=8&Kar}=yyRP
+zv2tLUp=P1KV@wxvt~N<!R+;@wD0LJ)SUngEw$G_GtL*&wIQ)W~HjNzx#93$YduPg}
+zIIdg-!RJN(teCFF>GF?TIx8c{Cr>q@!3I(ud=mk>SNsdEXN&xKd!T)3C<~_ICyoS0
+zY;^|83Z{2ojffn{xz9kpr(k{5pM@$2RmQVE&pG15VAGj=xFuHN5;g??pf{-MRRz3O
+z@GsymiN=QLFVPZ}ic=_0t#!^Nn!la~_fqU|_t_wADL)nDgc<5q!+y7P@8y2ybI|(z
+zgMAQ1Zm_49*o|xdW}?Wpa08GpVnmVse^7Z7MgH==iV;N?!-3zYPS7u`CbZ5iU)n8(
+zOS>J`z)7C95SnNX;vn=i9wyW-@il1ce7ISAUgL`@vZRSBauDo)wUICHZXlO;1F%dw
+zPOe<?zPwwC)~%K=?;iMs^P-BhvvPFXs_iKyhV-?TK?=4=GkZ-UDQ%PKA~Bv!yLLKU
+zIWJ<Ak+%b7<ZXGbrGuL8`1YD6-|$`fiSmXoE`VI}trqzWgfp_}uX08fdvQjdcuaZA
+zS91f-NKH%5$YNSfuLrMp%{LiY9#e8gwkSus=bMa<J-}}HYFgurETWu|4)r2($9FT%
+z_4WgBd||^4NF!?>Rgy-o8!D4VzCDT@rP~w;{+~2m>I464)8*T5y{1e3_syou&TqY^
+z%iYJ=bO|}<JzdVeaJ}ggZlE#LZ(_Q<71(UL9Iau~W$wl1)8+9O<ms}0v-fnlH}JaC
+z#Sr+nO_%!3|BdPLq51EbE*CSdKV5k9%}tm0GXBbRv1HuLbSZmSIb9wfB2O2~a57zT
+z{pn#27fhEm{yw=+hofs(x#rxbcf##oAoTdXz{9vt-~Qd>&3!sgq}-<gN-4LuCgqiu
+zQffYzq&S+SENCtzSdy~dk4}B<omk2>KZ%i)oJKifPX|7cWwAYl#b!Mke3hd&s`pb~
+z(s3ljS&a!rY~mo;xgI8l6jzM|m~t2kQE&mJD>eJyC#^BM{Kj$iL<pP1h)Vq|Avme^
+z%rzw7)PPXS&SqR31m{=dP&*~cwCkaK_DU-#pZ=(Il(X#$lw`e={cGze589idoFt*l
+zQb~t=pvQ7lUhJ+@FusZA@#v>|&WlC1AM{wiJyMSyw^1Niqa@Jf6^cvZnzPAHw$r{l
+z!ztvo^(}9qFL_(bC3%l{$%9oIs!nVn?^_#{m(3|ya@TQQ@)%2QP&0XCL?$wMe>_WA
+za>vi{$&$MO<OEJfAxb$Te9KvX*@v8OcS~|!qH^*c@+qgCB<F4HFv@bi^l-l9jPfOC
+z0h2S3%9-W6KL5aP&HmGoK`CdBZ#f6+e8_3X<dm-<a*BM{=T1q^SB(le*BX7wnd?i=
+zKguLI_fa{EeAnmb3M%IjrJOas<#_(>L(ZK{&hPm|j?;I29+%|!6FFm?LxC-Mu(zCt
+zu$-CZ>F5<EM`BAJ4RVgUh#V&p^IKs{hNZGCV*naC4t~|o8Q+{X`R9C!Vc9hWhK<*}
+zFwDjnW?>8+nqe>ihG`5#(Dg7>Bo5%v$MNuUPfHMUBoJ2{6d)q6`D}>iF8OGPFLy~G
+zp2=$k1ndGpL->=1h?(62!}oa<!vZCSq6VK05q!x<L)^tMG+M8Nfi%QY(h%yFAnuny
+zT=+vV^13zn9C^U))nerB*(r^@r>tb;70&iK@-A5^S+-p%=aWBt%IWS)&izczEmTg;
+zgFfY~l;reM%9-d}&X$Wl<XqYz$=Ub}k#od%eIg|}+pj9*oVn^#j?tH#l}t`Nl@scF
+z#+E)q<xIWGHSwD-_Ljr=&40MSwd6OC+#wB;W6N6^BxD2X@wgWJ=JAr~qgNE7Ip3nq
+zzC>><l|*N>CYtPKoo^|+VmTFkpCtM-5S@R8^Y+y4!k!wBE%7h4#8W#@J+(*>J%ouq
+zlM9~OdF-j#(i?C#<T>Z%uQ}1ZAS+-x`mJ6et4nLLmba9(`!h+_!sfCnn#=k%m&&r%
+z(@}E<WPMog)uhR|NvD{#sB^9NsJRVfrG6%jnvh)PU(mhX1Z$=Suigg4x9~BZmSpOb
+zGGl$qeET;aGEaXh$$Vv5lT6q(mSmPR@4r$MD9L;s+xYU-H1PtuP@^L8Yb^RS$7D5n
+zZz*>D(e4*j+zjhdHD}R^iRyfp5bQ|QxC5LMW{&4(W|U{G2HxVx7&tR=nPas0Mj*ro
+zTKsf9rN!St=<JP!_BFsw*_;;Nzb&Q3pF(KyXGyg9_kO|FyOYnzwD_|KEq*S#@C@{0
+zu7fW!p<Zu6wyb8f_^W`780dG=Enl!j?1*E8-#Dv@-xxHA#BbbZ?szUMbS|(|!dm!c
+zs1D;dPDNvi$bo7jV|a9#;AnY5V5WipQRpZVPGy-Jf9q)6+<lw4ahuYf6+&3r!S2Ii
+z&MJ|R^fQk99YETd1jLmRP5yd9lW&_~Pg#8v{KI7u|L}Igl)qWf*w+BxsJo|vfOseP
+zK)@xd+lGbO^C1DD%y&xH`|T-JwiG9Nyt6k8v0*(Wj~vTbh*!$>E15#;M{mog9AM1Y
+z_lQQDf`PcL2WVu0-u(?PdUt4Z$_{HIOvEdjF%hRKnTQi81Hj5ACSp^jbq7>}vn0xh
+zdQV|3PU_c0N!+_Lqa<F5leLRwoUZ9_P%_B@gpznw6D4tzAVNvJ@_&qySl!b@D2WB&
+zj6JZ9jJAj63Qe7?Y~qXiSrd=PP5dXCmy*VIj-kx7SwxEEHC$o%IfDwln+@@kM#4j^
+z+qO86?c6NCBn_TSL%q-qjXwy>lT`{D;#KI=QF!e8!&BU_gu9%P=YK@V^KG0ie}lwI
+z{L@+@F-FNsJQqvN6v<>!@Dk4+MRRN+IV^_=FYzkMOFTp7C7vRe(#xo9uig7td&T1R
+zl6Z-AUQNRo^xsfPjdXD&m6$*!zC-w~#{q->7MP@#At>>H%8Nu_4<!18o*j7fPq{UX
+zf%GS((qB!e^a~}X<9Lbb`0VR+S`AS!9nYR5H^I-AZgQQBO^=Z-|5_8Be$vQhY{$^*
+zsNi*PX5n^C*?**b$4xx!7bnW^&dQ9(wIkT<7)y&9r(`_dHBr$|jPrQM2wJOlB!lH}
+zfpNV^&@@r&LwUcw<_#@-qO!L_zi3XaFZB~6Jx&|pgY+1bDq{-?;?S0EpdVMGL)b(s
+ztyJd=f7MFm`m|Cd<;+U)CtFyliA$QS)Z*8#Z>1h7XI5&^SIw=I{}S0s-3L}`l5C}F
+zYrU-0%ddJ{sjhcl$4cpkds(Sp@A^MvrNU}&&PrA3y{*)m!d9(RyStQwY*Xc*v{IA)
+zek-+PLMv8kiC$@?vWBsFxb2nyZ7Y=#rm#{2UTJ2f-cM3C@uZ4BVWlRuuu}7fQeCq9
+zWiKoB$;;kWYE)7SD|P%AFDvy%RZA-sI`rnPRQ$^=tyEc}FDtb(issP0d~;T6aiX%l
+z!aw(Ir6yg+N==d^u3OWZl`5+I8?4lwYg$^VoxD#g^)BCvm3s4bUsmeuYHw4J#kX#y
+zCh<P3)ZMqU+41V?mR70@@54%UzFqQvR$tdj-PH`*m*bVa^>}%6D>cd6N_{-!##Tz#
+zky@#NKZBL}0IbxLV5R2&%z4LvnI*-5k%Ga5+w)B%49o-w1A}hg!HiHJ#@ht}VBn>F
+z2ZVt^WdeMx%L5XXi>tv9-Qyht=9f}teQw!Ltj|47)+b+})~CdjwGOOLu55jt{8_R-
+zr1c;S%q$uP<{1u!yyP86?D+)Qyqso%V8WZY@tfYB@(Km>$YAeKFjfc!Lky6eSSV^5
+z(7G3iw1=3qUQOkd2u6q~F_`wbg(e)y64sAvvXGX}O|db?DU2aRhB-5cMuxGfM2D%>
+z$S{SttEQ74$^)&MXD0@qn!SsX+54FUhgr=DZLIIy4;I1QM<n5VnC%Nchg+3I?;+;T
+zo)4+4b3Op-G8!vpGrgt0mP1u-@H?sXB@_7K3v{kNKuq9TYJ}yAX~xNexWt4ux>$UP
+z>7o?&$BGRhRAHIMLz>ndCMjusL2fS7L?o@4vRNcbO16Y+i6y*WvV?2F5++)6HtR)#
+zfu-Oqsn{5js#}@@UOf>n8$);{45QOzEqbC2F@{n_Afn1ZJmaN0qYbO5N$f_(I*bbl
+znBYU`(iw^38d3u36P#)iHIKYx9yd#-a4nd}LDW1pJ<}}dLNgKz`5En4_jWO5t@|T9
+z-X$ZsmKe#{Td))Y(ESvQIgVfy9+T^8jZ=0)<Sy0;Jne*=?tp#JU1-8>bZEc&JW*$_
+z(q_obv2wsG2?;qNn8ceQFCgjTB&l$}92;pY9xG%JD(&b?KQ;|SFr~dvGWOj>Qc9CG
+zB|lO5tt9#keMjmpiPq(BlI-Y}=ZMgFkvKwfV=NdetLPGHO0C$GX5UIP?Riczr6iM7
+zK4}+hQ>Rm#N}Fk-Tw>%{W%GW%gEj96+PntRyg98k=am6e^4(PO#sc0718kCH3ZtK+
+z(<@eC3O~8irzu=}r_vMxSBn&$=H&rw1cNoS5^D&U&{2oC$+@?wgwxHf;hjzIPRZ7A
+z%mBsQu+h@S)Bcb%2HdG=@Xk`L{iRyp<DfPXhL1=<NhXmM8r=-ywmX!KJ-xJfz?xiz
+zRm5^$?~ljHKXIGp<~$=?MPl8ETBThp$E?XStB|`biCLpL<82}*pZQZJQoB_?Y<AGM
+ziG1U6*+d?6_%M-QY+)u+{Jgn|eDHDEL>>bZSt^^zDQ8+Ykx2A5k&lkKo{5}1rWF%8
+zq2EoJ$freb6WM5JW+J(MbO=lpy-noT2A?K!r=gjNboKqOnaC^O-@J)@$FGHne4^lb
+zCh~{T$`QR{`=2tArT>E_a?<ElOynfLW+rk(q(TiWxBuTWk)49QP2@>iGZQ&0R@n(E
+z=S`c)QeQf~Zy!3e7uasvL{7AMo5+JPzD(r2@0y#)s83rnkwv|4Xd;h3>(fLg$M`al
+zrrtEuo6r7v6RC<(Ht$<oTQ!kBoAYQdD!Ko&K24<l*_I}9)hM4P@~Kg+n8@s2t(eG9
+zR(RW=QKMQnk=;i5Fp*t)DdxtU6+TVm>5)E6<f#Z+y`d{^U?TO+Ag&&%Z0r$Rnw!W{
+zZxgvF;?J7Msz72Qe>e`G55t_Xa8T?j{$V$s7meY-L4vfKnEi{|si1Z~3wN3}K){6b
+z0b)+Xxx;uM=3eQGN1$*%0qAr5#gQhD5b5Agh?67J$f3wE1%ueU6R_2C9;iAc{z^Nq
+zKW8JQL<q@@3%M~5S7~f+j-C@V@cWq&aA4FUv^P(n3Vi@6r`B^6H>?p-WcQS)%JJW>
+zJlM0X#jkd_qnZl2gA@V;f$hb4F}RR3$E89>`$J3)EgI63WK1Xs$=j>TkAx`z?BuLm
+zi0LgcG!r(PCLZk--*DXSNRGATN8fn0rRzi1mdkfEZ_DYKf4MCqkKa^V{?qE+mLrEZ
+zYs(YgG;7QLJ(}9mV)faU7owZB<tyJbYs=H!uiKX4*4El`^fA(wSu4SHdk<W<myU5P
+z;$Z%x%xhajy*3lIVd!4Mg5lt8B=q2&c`Wo`A#n<b+H`ke(FcD%Mx89;3cx$h7E%cR
+z87;&)!<034E(t>zDSKvHjxo=SDr*mk%_vq-2NF$uhD>5!*8js4Tj?YsVUwQuWSGJg
+z>LAA?qy=pZZx)tt2VlEVWI_T)4o>*2jnB35E6~>ERI@r1!3jq;33mz$X?Q|NPa-Nx
+zmD-1vEcgC0z%}LiS>e>38!A6Wtwbp#WgqF*B1&Nw!(~gy=1~esXL^KO>zvIT2|-!O
+zmr&2Fh(jS)8a;IHk+ptPxI*GQpo&~t-(cdX6^W!<?R>6`H+HD3TAe2J%_b>mVRCNH
+z3a-FLI-B$Yi(A;iKnl(diL2mOsHC-mu>`(6R9EoNvgn0HBzj@06uqzrq8BE>7Y&?_
+zJRs2vlj%1Spo5!00JX({ih&@TK95ZZ6mFL``_RVvMu=iqgu&xfYq~1B=KE#TKkE-a
+zA&_AS4P=-rxr{|LkYTPOkYN!{1jpoa3yjZNbJk*9Hb`m9+iOW~HIQKu1Tq{>0~wac
+z&w`iq!i9MUGF&0GnxG}I45bZX2xnMC!x^S=QaD2!n#7S~;SYZe%d@6AzUk{5&+!hs
+zm2>>w-0RNqz@xtBc;mLFIlhq2@%!aDe(3A#&hfcRz2~@lNb7U_;E?Og@z2BlzBzt4
+zr{x@<Hl&p~J}FEwkP36W=Xm%KpL0B5$j#01+RlH&9Pj_{8_n_4OKvd7QwA&Nc-{Nn
+zbNv4Q{v6*k$oCxo{E~8xf80sYHP;sZe>cao8yeXh&%%G=Ii7!r<0y|_oRSn@kNqOx
+zjf`-lpGXsPw7^t(&}8SU?ZOdz`hKKZOnvN_Bp8+lQT{;OeC>4Gk^+G|dp>v@w;l#>
+z<A~?zn1MoojX&WI8Z%hX<3AkfC&hzM$U_}rh8^(;)#AYl{y2x;f0_=Pb$Fx|q#wsE
+zB^)6{;2@%ROA!@^n20Fs(I5Ooh4dZa%MmUQ%_L=6cG%L7=N%W*_gf}b_(vtUdAYp9
+zw~@@Oz&5nVY*wUWLUrzyHVgaMaR2;asL56(5RfYLVJH*P@Dvg8VQ$WGPVmPq745S5
+z+xaR82V)L)@O$v+K4C)f|D+^`2gO>P4^_}y0l=K-7wvKwPsAGc07q#RC){EXLYHV`
+zg|H<-qS0j^iruj)KRHOyh)NEwk(OsUK_$Nwi&b)XHB2zQn69zT$>VZ!LJ6a}F&x6P
+z^I`UMn|<9qWQ$-rnSiV94ic>TR)=E}{ukn>RKDf$n4~Q+RK1nl2%~T9LZQ3A!!ce;
+z_=c1aj*z19+ekt?Uq}<6;rD_6?Bs^IZ2bCYR|WqrSIL)37uJf!KnICkJr(CCSA*w)
+zCJzGe#zN20=)IK*p`c!@i$nGHi9nU^@AebRZ5lCsHEt(}1r28n9Qk8Bu<_U7ExK)|
+zMx#DvSJ?a=4tQy&7UZ3K@tkZ&r)tvyz$^_gU#>a`>wBW$j#}sBas~XmqA}NcMXj@@
+z`q2;1JM#hnt`$XCdRdWLm#2cz94JVa_me;TG11a(f)%NB`5j;jEGO4rm)8dWHSGAg
+z_PEModZG0ln1`I`FV2g^HSG=}_t7IAH4rp*9cUWZfsA<y3aG}4wINuS7Y_2J7_#RM
+zNUcMx<7}$2ba_`)atvA$e>OK}na&CvsnN$JHeE8oYa~wH#lJOTeXt6~ZbOLpJDRW%
+z@SV>Cf?YemQkP#1YY{dlcJ>FgoD^uHEr-(o!9IwNDaeJ!6OA?-(ZrrD@L#-6-GBwq
+zlM{dFCCc3>2og<x8EarOEJoy4D&BIIyJUezNnoad)R5`j8f3)9CIT&P`gu4paS)BX
+z1*Y99&@~IF-c6+YS?!yZzI1vb?orZ2DbPeIF081g0Cg~IG#3P84Xeuoig~gDrpOE%
+zV0~Z%O!-W+M4$V#id(vCoV#?h%ErIzeg}_j6@%IPawCg4LE;;=$G`EIr9&#-Zp;Os
+zZ(ai?UtRti5QjJ2Y5hZ`Td^4aPAL_Q#o`6)RZX_mAr#|(b<YIAi?VYn{Es9Ah6dVR
+z*XVK27NG%BkyRkt_dYS*Cby)2Kku%4YXj@LAyU`vvyuID&z4!V=YIYLV?BsY>R=1x
+zAR0mnwR|L!u_^L}Y(H$)erX_*=GSejMg9WS)33qwhL(K+{2Iv=Jl&UdX@#%^|IX2|
+zj@xg+1<{Z4E+NhEd(J~FPhwwh@ISoGz(*;@-Tegp{S^Hmf<6)Tkc)o|7w>)t7psLH
+z!q$)O-S9T+BD^GS0}s!c@N6*ru5(Pl|B5-bf!~^=%qpDs+w+Ycs~aMH5>0t-0K8Af
+zr6!|J7FyZ9<WV8qy@RzE%p+rwb*~@po<NXbHx}8Ac?)>BKfBL_?t=uiB#Byz*h*Lj
+zNGc#6AUzk1W#1J^iXv?m8z`thQMvtw9j_}>TRK|5|HBLgLp);@s<;YMt;qWQHA#({
+zC86ZvEP5Be&O2@yjEij3j&vD@VnT-(kmxAI=)C}shXqDnjMJV=zNW0vy!WLVX&{)a
+zj~Y#RU#^iJ18CEFjTZLtT_Ziz=r=`;E?tpoblGQ(zP>_gG!z#(s%=w^D&CW7RHJT+
+z_p%YEg)<uGavG#sxu8}@1U8RcSgj%}P6Y#YdIP=ajH|WiJ+BlG;1n=@(^unk`6C-V
+zwA8^+s*$u6IuBeO38C0Ht-?(eAPi2%0DqfL=43B6q_cZdMg!fpDS_<LZ>B*b#DcjH
+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
+z%0D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
+F`ailwShWBE
+
+diff --git a/python/mozbuild/mozbuild/test/configure/common.py b/python/mozbuild/mozbuild/test/configure/common.py
+--- a/python/mozbuild/mozbuild/test/configure/common.py
++++ b/python/mozbuild/mozbuild/test/configure/common.py
+@@ -84,16 +84,17 @@ class ConfigureTestSandbox(ConfigureSand
+         paths = paths.keys()
+ 
+         environ = dict(environ)
+         if 'CONFIG_SHELL' not in environ:
+             environ['CONFIG_SHELL'] = mozpath.abspath('/bin/sh')
+             self._subprocess_paths[environ['CONFIG_SHELL']] = self.shell
+             paths.append(environ['CONFIG_SHELL'])
+         self._environ = copy.copy(environ)
++        self._subprocess_paths[mozpath.join(topsrcdir, 'build/win32/vswhere.exe')] = self.vswhere
+ 
+         vfs = ConfigureTestVFS(paths)
+ 
+         os_path = {
+             k: getattr(vfs, k) for k in dir(vfs) if not k.startswith('_')
+         }
+ 
+         os_path.update(self.OS.path.__dict__)
+@@ -210,16 +211,19 @@ class ConfigureTestSandbox(ConfigureSand
+         return stdout
+ 
+     def shell(self, stdin, args):
+         script = mozpath.abspath(args[0])
+         if script in self._subprocess_paths:
+             return self._subprocess_paths[script](stdin, args[1:])
+         return 127, '', 'File not found'
+ 
++    def vswhere(self, stdin, args):
++        return 0, '[]', ''
++
+ 
+ class BaseConfigureTest(unittest.TestCase):
+     HOST = 'x86_64-pc-linux-gnu'
+ 
+     def setUp(self):
+         self._cwd = os.getcwd()
+         os.chdir(topobjdir)
+ 
+

+ 71 - 0
mozilla-esr52/patches/1318143-2.patch

@@ -0,0 +1,71 @@
+
+# HG changeset patch
+# User Ted Mielczarek <ted@mielczarek.org>
+# Date 1492706624 14400
+# Node ID 93d41c6f2a14d0c557828fcdd505c47e71fa9fbb
+# Parent  311336b5377de438e6e71e4ad4eca6b18da2b37c
+bug 1318143 - add a --with-visual-studio-version to choose which VS version configure chooses when multiple versions are installed. r=gps
+
+MozReview-Commit-ID: C6IoZJNHR4G
+
+diff --git a/build/moz.configure/toolchain.configure b/build/moz.configure/toolchain.configure
+--- a/build/moz.configure/toolchain.configure
++++ b/build/moz.configure/toolchain.configure
+@@ -436,37 +436,52 @@ def get_vc_paths(topsrcdir):
+         tools_version = open(os.path.join(path, r'VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt'), 'rb').read().strip()
+         tools_path = os.path.join(path, r'VC\Tools\MSVC', tools_version, r'bin\HostX64')
+         yield (Version(install['installationVersion']), {
+             'x64': [os.path.join(tools_path, 'x64')],
+             # The x64->x86 cross toolchain requires DLLs from the native x64 toolchain.
+             'x86': [os.path.join(tools_path, 'x86'), os.path.join(tools_path, 'x64')],
+         })
+ 
++option('--with-visual-studio-version', nargs=1,
++       choices=('2015', '2017'),
++       help='Select a specific Visual Studio version to use')
+ 
+-@depends(host, target, check_build_environment)
++@depends('--with-visual-studio-version')
++def vs_major_version(value):
++    if value:
++        return {'2015': 14,
++                '2017': 15}[value[0]]
++
++@depends(host, target, vs_major_version, check_build_environment, '--with-visual-studio-version')
+ @imports(_from='__builtin__', _import='sorted')
+ @imports(_from='operator', _import='itemgetter')
+ @imports('platform')
+-def vc_compiler_path(host, target, env):
++def vc_compiler_path(host, target, vs_major_version, env, vs_release_name):
+     if host.kernel != 'WINNT':
+         return
+     vc_target = {
+         'x86': 'x86',
+         'x86_64': 'x64',
+         'arm': 'arm',
+     }.get(target.cpu)
+     if vc_target is None:
+         return
+ 
+     all_versions = sorted(get_vc_paths(env.topsrcdir), key=itemgetter(0))
+     if not all_versions:
+         return
+-    # Choose the newest version.
+-    data = all_versions[-1][1]
++    if vs_major_version:
++        versions = [d for (v, d) in all_versions if v.major == vs_major_version]
++        if not versions:
++            die('Visual Studio %s could not be found!' % vs_release_name)
++        data = versions[0]
++    else:
++        # Choose the newest version.
++        data = all_versions[-1][1]
+     paths = data.get(vc_target)
+     if not paths:
+         return
+     return paths
+ 
+ 
+ @depends(vc_compiler_path)
+ @imports('os')
+

+ 51 - 0
mozilla-esr52/patches/1318189.patch

@@ -0,0 +1,51 @@
+
+# HG changeset patch
+# User Makoto Kato <m_kato@ga2.so-net.ne.jp>
+# Date 1479693350 -32400
+# Node ID 53a9ff4a083a2c790d25939a598ec8378e77abf4
+# Parent  5e87f33d7a227bbc74f04ed82c36e67ef734aa03
+Bug 1318189 - mach configure cannot detect MFC library path on VS2017. r=glandium
+
+VS2017's directory structure for mfc is the following.
+
+ Directory of C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\vc\Tools\msvc\14.10.24629\atlmfc\lib
+
+2016/11/21  13:57    <DIR>          .
+2016/11/21  13:57    <DIR>          ..
+2016/11/21  13:57    <DIR>          arm
+2016/11/21  14:00    <DIR>          x64
+2016/11/21  13:59    <DIR>          x86
+
+So this structure is changed, we cannot detect mfc when using VS2017.
+
+
+MozReview-Commit-ID: 2ft4stYPZbe
+
+diff --git a/build/moz.configure/windows.configure b/build/moz.configure/windows.configure
+--- a/build/moz.configure/windows.configure
++++ b/build/moz.configure/windows.configure
+@@ -330,18 +330,21 @@ def lib_path(target, vc_path, windows_sd
+     sdk_target = {
+         'x86': 'x86',
+         'x86_64': 'x64',
+         'arm': 'arm',
+     }.get(target.cpu)
+ 
+     atlmfc_dir = os.path.join(vc_path, 'atlmfc', 'lib', *vc_target)
+     if not os.path.isdir(atlmfc_dir):
+-        die('Cannot find the ATL/MFC libraries in the Visual C++ directory (%s). '
+-            'Please install them.' % vc_path)
++        # For Visual Studio 2017
++        atlmfc_dir = os.path.join(vc_path, 'atlmfc', 'lib', sdk_target)
++        if not os.path.isdir(atlmfc_dir):
++            die('Cannot find the ATL/MFC libraries in the Visual C++ directory '
++                '(%s). Please install them.' % vc_path)
+ 
+ 
+     libs = []
+     lib_env = os.environ.get('LIB')
+     if lib_env:
+         libs.append(lib_env)
+     libs.extend((
+         os.path.join(vc_path, 'lib', *vc_target),
+

+ 37 - 0
mozilla-esr52/patches/1318798.patch

@@ -0,0 +1,37 @@
+
+# HG changeset patch
+# User Richard Marti <richard.marti@gmail.com>
+# Date 1479568535 -3600
+# Node ID 9f8700acec463beb0f1d37bcd3946a69a152f7a3
+# Parent  f0f88a94e698007fa2cecf579e2077447aae0e0d
+Bug 1318798 - Remove config/external/nss/target in recurse.mk. r=ted
+
+MozReview-Commit-ID: 884NGQYXfQl
+
+diff --git a/config/recurse.mk b/config/recurse.mk
+--- a/config/recurse.mk
++++ b/config/recurse.mk
+@@ -160,21 +160,18 @@ build/clang-plugin/tests/target: build/c
+ endif
+ 
+ # Interdependencies that moz.build world don't know about yet for compilation.
+ # Note some others are hardcoded or "guessed" in recursivemake.py and emitter.py
+ ifeq ($(MOZ_WIDGET_TOOLKIT),gtk3)
+ toolkit/library/target: widget/gtk/mozgtk/gtk3/target
+ endif
+ ifdef MOZ_LDAP_XPCOM
+-ldap/target: config/external/nss/target mozglue/build/target
++ldap/target: security/target mozglue/build/target
+ toolkit/library/target: ldap/target
+ endif
+ ifeq ($(MOZ_REPLACE_MALLOC_LINKAGE),dummy library)
+ mozglue/build/target memory/replace/logalloc/replay/target: memory/replace/dummy/target
+ endif
+ endif
+-ifeq (,$(MOZ_SYSTEM_NSPR)$(MOZ_SYSTEM_NSS)$(MOZ_FOLD_LIBS))
+-config/external/nss/target: config/external/nspr/pr/target config/external/nspr/ds/target config/external/nspr/libc/target
+-endif
+ # Most things are built during compile (target/host), but some things happen during export
+ # Those need to depend on config/export for system wrappers.
+ $(addprefix build/unix/stdc++compat/,target host) build/clang-plugin/target: config/export
+

+ 104 - 0
mozilla-esr52/patches/1319959.patch

@@ -0,0 +1,104 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1479948435 -32400
+# Node ID 91160a3cae84a495cf083383110e10ce8640191a
+# Parent  a7389b4dca6380b2eac4020079a36a7dae317222
+Bug 1319959 - Set _topsrcdir, _objdir, MOZ_BUILD_ROOT and DIST from python configure. r=gps
+
+In some cases, on OSX, python's `os.path.realpath` and shell's `pwd -P`
+don't agree on the case of paths on case-insensitive filesystems.
+
+So make everyone agree by using the value from python configure.
+
+diff --git a/build/moz.configure/init.configure b/build/moz.configure/init.configure
+--- a/build/moz.configure/init.configure
++++ b/build/moz.configure/init.configure
+@@ -66,16 +66,24 @@ def check_build_environment(help, dist):
+     return result
+ 
+ set_config('TOPSRCDIR', delayed_getattr(check_build_environment, 'topsrcdir'))
+ set_config('TOPOBJDIR', delayed_getattr(check_build_environment, 'topobjdir'))
+ set_config('MOZ_BUILD_ROOT', delayed_getattr(check_build_environment,
+                                              'topobjdir'))
+ set_config('DIST', delayed_getattr(check_build_environment, 'dist'))
+ 
++add_old_configure_assignment(
++    '_topsrcdir', delayed_getattr(check_build_environment, 'topsrcdir'))
++add_old_configure_assignment(
++    '_objdir', delayed_getattr(check_build_environment, 'topobjdir'))
++add_old_configure_assignment(
++    'MOZ_BUILD_ROOT', delayed_getattr(check_build_environment, 'topobjdir'))
++add_old_configure_assignment(
++    'DIST', delayed_getattr(check_build_environment, 'dist'))
+ 
+ option(env='MOZ_AUTOMATION', help='Enable options for automated builds')
+ set_config('MOZ_AUTOMATION', depends_if('MOZ_AUTOMATION')(lambda x: True))
+ 
+ 
+ option(env='OLD_CONFIGURE', nargs=1, help='Path to the old configure script')
+ 
+ option(env='MOZ_CURRENT_PROJECT', nargs=1, help='Current build project')
+diff --git a/js/src/old-configure.in b/js/src/old-configure.in
+--- a/js/src/old-configure.in
++++ b/js/src/old-configure.in
+@@ -58,30 +58,20 @@ dnl ====================================
+ MISSING_X=
+ 
+ dnl Initialize the Pthread test variables early so they can be
+ dnl  overridden by each platform.
+ dnl ========================================================
+ USE_PTHREADS=
+ _PTHREAD_LDFLAGS=""
+ 
+-dnl Do not allow objdir == srcdir builds
+-dnl ==============================================================
+-_topsrcdir=`cd $srcdir; pwd -W 2>/dev/null || pwd -P`
+-_objdir=`pwd -P`
+-
+-MOZ_BUILD_ROOT=`pwd -W 2>/dev/null || pwd -P`
+-
+ MOZ_DEFAULT_COMPILER
+ 
+ if test -z "$JS_STANDALONE"; then
+   autoconfmk=autoconf-js.mk
+-  #DIST is exported from top-level configure
+-else
+-  DIST="$MOZ_BUILD_ROOT/dist"
+ fi
+ AC_SUBST(autoconfmk)
+ 
+ MOZ_ANDROID_NDK
+ 
+ if test -n "$gonkdir" ; then
+     LDFLAGS="-L$gonkdir/out/target/product/$GONK_PRODUCT/obj/lib -Wl,-rpath-link=$gonkdir/out/target/product/$GONK_PRODUCT/obj/lib --sysroot=$gonkdir/out/target/product/$GONK_PRODUCT/obj/ -llog $LDFLAGS"
+ fi
+diff --git a/old-configure.in b/old-configure.in
+--- a/old-configure.in
++++ b/old-configure.in
+@@ -75,24 +75,16 @@ dnl ====================================
+ MISSING_X=
+ 
+ dnl Initialize the Pthread test variables early so they can be
+ dnl  overridden by each platform.
+ dnl ========================================================
+ MOZ_USE_PTHREADS=
+ _PTHREAD_LDFLAGS=""
+ 
+-dnl Do not allow objdir == srcdir builds.
+-dnl ==============================================================
+-_topsrcdir=`cd \`dirname $0\`; pwd -W 2>/dev/null || pwd -P`
+-_objdir=`pwd -P`
+-
+-MOZ_BUILD_ROOT=`pwd -W 2>/dev/null || pwd -P`
+-DIST="$MOZ_BUILD_ROOT/dist"
+-
+ MOZ_DEFAULT_COMPILER
+ 
+ if test "$COMPILE_ENVIRONMENT"; then
+     MOZ_ANDROID_NDK
+ fi # COMPILE_ENVIRONMENT
+ 
+ if test -n "$gonkdir"; then
+     dnl export for js/src/configure. We can't pass the option down normally,
+

+ 54 - 0
mozilla-esr52/patches/1319971.patch

@@ -0,0 +1,54 @@
+
+# HG changeset patch
+# User David Major <dmajor@mozilla.com>
+# Date 1489025588 -46800
+# Node ID 261a33fad371b26e5343d0b31da2d18df0eff4a0
+# Parent  17cb305b2788e4c312562662b4f73e1b9199bfb5
+Bug 1319971: Re-work some static_asserts to get VS2017 compiling. r=luke
+
+VS2017 doesn't consider functions like Foo::offsetOfBar() to be constexpr, so it refuses to allow them in static_asserts.
+
+MozReview-Commit-ID: 3mYgnmEPIx0
+
+diff -r 17cb305b2788 js/src/ds/OrderedHashTable.h
+--- a/js/src/ds/OrderedHashTable.h	Mon Nov 21 11:14:44 2016 +0900
++++ b/js/src/ds/OrderedHashTable.h	Tue Aug 14 19:44:30 2018 +0200
+@@ -533,6 +533,8 @@
+         return offsetof(OrderedHashTable, data);
+     }
+     static constexpr size_t offsetOfDataElement() {
++        static_assert(offsetof(Data, element) == 0,
++                      "RangeFront and RangePopFront depend on offsetof(Data, element) being 0");
+         return offsetof(Data, element);
+     }
+     static constexpr size_t sizeofData() {
+diff -r 17cb305b2788 js/src/jit/CodeGenerator.cpp
+--- a/js/src/jit/CodeGenerator.cpp	Mon Nov 21 11:14:44 2016 +0900
++++ b/js/src/jit/CodeGenerator.cpp	Tue Aug 14 19:44:30 2018 +0200
+@@ -6238,7 +6238,7 @@
+     masm.loadPtr(Address(range, ValueMap::Range::offsetOfHashTable()), front);
+     masm.loadPtr(Address(front, ValueMap::offsetOfImplData()), front);
+ 
+-    static_assert(ValueMap::offsetOfImplDataElement() == 0, "offsetof(Data, element) is 0");
++    MOZ_ASSERT(ValueMap::offsetOfImplDataElement() == 0, "offsetof(Data, element) is 0");
+     static_assert(ValueMap::sizeofImplData() == 24, "sizeof(Data) is 24");
+     masm.mulBy3(i, i);
+     masm.lshiftPtr(Imm32(3), i);
+@@ -6252,7 +6252,7 @@
+     masm.loadPtr(Address(range, ValueSet::Range::offsetOfHashTable()), front);
+     masm.loadPtr(Address(front, ValueSet::offsetOfImplData()), front);
+ 
+-    static_assert(ValueSet::offsetOfImplDataElement() == 0, "offsetof(Data, element) is 0");
++    MOZ_ASSERT(ValueSet::offsetOfImplDataElement() == 0, "offsetof(Data, element) is 0");
+     static_assert(ValueSet::sizeofImplData() == 16, "sizeof(Data) is 16");
+     masm.lshiftPtr(Imm32(4), i);
+     masm.addPtr(i, front);
+@@ -6276,7 +6276,7 @@
+ 
+     // We can add sizeof(Data) to |front| to select the next element, because
+     // |front| and |range.ht.data[i]| point to the same location.
+-    static_assert(OrderedHashTable::offsetOfImplDataElement() == 0, "offsetof(Data, element) is 0");
++    MOZ_ASSERT(OrderedHashTable::offsetOfImplDataElement() == 0, "offsetof(Data, element) is 0");
+     masm.addPtr(Imm32(OrderedHashTable::sizeofImplData()), front);
+ 
+     masm.branchTestMagic(Assembler::NotEqual, Address(front, OrderedHashTable::offsetOfEntryKey()),

+ 173 - 0
mozilla-esr52/patches/1322025-1.patch

@@ -0,0 +1,173 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1485321958 -32400
+# Node ID 97c019e39b8f873f3884630f481251d20474360d
+# Parent  1ddaf704683d67a06d112251b586387bc26bf22c
+Bug 1322025 - Enforce --help requirement on indirect dependencies. r=chmanchester
+
+Bug 1313306 relaxed the --help dependency requirement in some cases, but
+while doing so, the requirement was also removed in other, unexpected
+cases. Specifically, the --help dependency ended up not being required
+on indirect dependencies that should have had it, had the --help
+dependency been explicit on the direct dependency.
+
+diff --git a/python/mozbuild/mozbuild/configure/__init__.py b/python/mozbuild/mozbuild/configure/__init__.py
+--- a/python/mozbuild/mozbuild/configure/__init__.py
++++ b/python/mozbuild/mozbuild/configure/__init__.py
+@@ -26,17 +26,16 @@ from mozbuild.configure.help import Help
+ from mozbuild.configure.util import (
+     ConfigureOutputHandler,
+     getpreferredencoding,
+     LineIO,
+ )
+ from mozbuild.util import (
+     exec_,
+     memoize,
+-    memoized_property,
+     ReadOnlyDict,
+     ReadOnlyNamespace,
+ )
+ 
+ import mozpack.path as mozpath
+ 
+ 
+ class ConfigureError(Exception):
+@@ -76,22 +75,24 @@ class DependsFunction(object):
+ 
+     @property
+     def sandboxed_dependencies(self):
+         return [
+             d.sandboxed if isinstance(d, DependsFunction) else d
+             for d in self.dependencies
+         ]
+ 
+-    @memoized_property
+-    def result(self):
+-        if self.when and not self.sandbox._value_for(self.when):
++    @memoize
++    def result(self, need_help_dependency=False):
++        if self.when and not self.sandbox._value_for(self.when,
++                                                     need_help_dependency):
+             return None
+ 
+-        resolved_args = [self.sandbox._value_for(d) for d in self.dependencies]
++        resolved_args = [self.sandbox._value_for(d, need_help_dependency)
++                         for d in self.dependencies]
+         return self.func(*resolved_args)
+ 
+     def __repr__(self):
+         return '<%s.%s %s(%s)>' % (
+             self.__class__.__module__,
+             self.__class__.__name__,
+             self.name,
+             ', '.join(repr(d) for d in self.dependencies),
+@@ -120,23 +121,24 @@ class CombinedDependsFunction(DependsFun
+             if (isinstance(d, DependsFunction) and
+                 sandbox._help_option in d.dependencies):
+                 flatten_deps.insert(0, sandbox._help_option)
+                 break
+ 
+         super(CombinedDependsFunction, self).__init__(
+             sandbox, wrapper, flatten_deps)
+ 
+-    @memoized_property
+-    def result(self):
++    @memoize
++    def result(self, need_help_dependency=False):
+         # Ignore --help for the combined result
+         deps = self.dependencies
+         if deps[0] == self.sandbox._help_option:
+             deps = deps[1:]
+-        resolved_args = [self.sandbox._value_for(d) for d in deps]
++        resolved_args = [self.sandbox._value_for(d, need_help_dependency)
++                         for d in deps]
+         return self.func(*resolved_args)
+ 
+     def __eq__(self, other):
+         return (isinstance(other, self.__class__) and
+                 self.func == other.func and
+                 set(self.dependencies) == set(other.dependencies))
+ 
+     def __ne__(self, other):
+@@ -411,17 +413,17 @@ class ConfigureSandbox(dict):
+         elif isinstance(obj, Option):
+             return self._value_for_option(obj)
+ 
+         assert False
+ 
+     @memoize
+     def _value_for_depends(self, obj, need_help_dependency=False):
+         assert not inspect.isgeneratorfunction(obj.func)
+-        return obj.result
++        return obj.result(need_help_dependency)
+ 
+     @memoize
+     def _value_for_option(self, option):
+         implied = {}
+         for implied_option in self._implied_options[:]:
+             if implied_option.name not in (option.name, option.env):
+                 continue
+             self._implied_options.remove(implied_option)
+diff --git a/python/mozbuild/mozbuild/test/configure/test_configure.py b/python/mozbuild/mozbuild/test/configure/test_configure.py
+--- a/python/mozbuild/mozbuild/test/configure/test_configure.py
++++ b/python/mozbuild/mozbuild/test/configure/test_configure.py
+@@ -347,17 +347,17 @@ class TestConfigure(unittest.TestCase):
+                 def bar():
+                     return sys
+                 return bar
+             bar = foo()'''),
+             sandbox
+         )
+ 
+         with self.assertRaises(NameError) as e:
+-            sandbox._depends[sandbox['bar']].result
++            sandbox._depends[sandbox['bar']].result()
+ 
+         self.assertEquals(e.exception.message,
+                           "global name 'sys' is not defined")
+ 
+     def test_apply_imports(self):
+         imports = []
+ 
+         class CountApplyImportsSandbox(ConfigureSandbox):
+diff --git a/python/mozbuild/mozbuild/test/configure/test_lint.py b/python/mozbuild/mozbuild/test/configure/test_lint.py
+--- a/python/mozbuild/mozbuild/test/configure/test_lint.py
++++ b/python/mozbuild/mozbuild/test/configure/test_lint.py
+@@ -109,16 +109,35 @@ class TestLint(unittest.TestCase):
+ 
+                 include(foo)
+             '''):
+                 self.lint_test()
+ 
+         self.assertEquals(e.exception.message,
+                           "Missing @depends for `foo`: '--help'")
+ 
++        with self.assertRaises(ConfigureError) as e:
++            with self.moz_configure('''
++                option('--foo', help='foo')
++                @depends('--foo')
++                @imports('os')
++                def foo(value):
++                    return value
++
++                @depends(foo)
++                def bar(value):
++                    return value
++
++                include(bar)
++            '''):
++                self.lint_test()
++
++        self.assertEquals(e.exception.message,
++                          "Missing @depends for `foo`: '--help'")
++
+         # There is a default restricted `os` module when there is no explicit
+         # @imports, and it's fine to use it without a dependency on --help.
+         with self.moz_configure('''
+             option('--foo', help='foo')
+             @depends('--foo')
+             def foo(value):
+                 os
+                 return value
+

+ 78 - 0
mozilla-esr52/patches/1322025-2.patch

@@ -0,0 +1,78 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1485322654 -32400
+# Node ID 42f5b6502a6414392cce5098bfe3c6b6b7fc8032
+# Parent  97c019e39b8f873f3884630f481251d20474360d
+Bug 1322025 - Enforce --help requirement on option's when argument. r=chmanchester
+
+Options with a `when` argument (either directly, or inherited through
+only_when() or an include) require --help per _value_for_option, but
+that code path is not exercised during a lint pass.
+
+With this change, along the previous one, we now correctly detect that
+bug 1316957 was not supposed to work as is.
+
+diff --git a/python/mozbuild/mozbuild/configure/lint.py b/python/mozbuild/mozbuild/configure/lint.py
+--- a/python/mozbuild/mozbuild/configure/lint.py
++++ b/python/mozbuild/mozbuild/configure/lint.py
+@@ -109,16 +109,23 @@ class LintSandbox(ConfigureSandbox):
+                         % (obj.name, arg.name, arg.name))
+         elif ((self._help or need_help_dependency) and
+               self._missing_help_dependency(obj)):
+             raise ConfigureError("Missing @depends for `%s`: '--help'" %
+                                  obj.name)
+         return super(LintSandbox, self)._value_for_depends(
+             obj, need_help_dependency)
+ 
++    def option_impl(self, *args, **kwargs):
++        result = super(LintSandbox, self).option_impl(*args, **kwargs)
++        when = self._conditions.get(result)
++        if when:
++            self._value_for(when, need_help_dependency=True)
++        return result
++
+     def unwrap(self, func):
+         glob = func.func_globals
+         while func in self._wrapped:
+             if isinstance(func.func_globals, SandboxedGlobal):
+                 glob = func.func_globals
+             func = self._wrapped[func]
+         return func, glob
+ 
+diff --git a/python/mozbuild/mozbuild/test/configure/test_lint.py b/python/mozbuild/mozbuild/test/configure/test_lint.py
+--- a/python/mozbuild/mozbuild/test/configure/test_lint.py
++++ b/python/mozbuild/mozbuild/test/configure/test_lint.py
+@@ -128,16 +128,31 @@ class TestLint(unittest.TestCase):
+ 
+                 include(bar)
+             '''):
+                 self.lint_test()
+ 
+         self.assertEquals(e.exception.message,
+                           "Missing @depends for `foo`: '--help'")
+ 
++        with self.assertRaises(ConfigureError) as e:
++            with self.moz_configure('''
++                option('--foo', help='foo')
++                @depends('--foo')
++                @imports('os')
++                def foo(value):
++                    return value
++
++                option('--bar', help='bar', when=foo)
++            '''):
++                self.lint_test()
++
++        self.assertEquals(e.exception.message,
++                          "Missing @depends for `foo`: '--help'")
++
+         # There is a default restricted `os` module when there is no explicit
+         # @imports, and it's fine to use it without a dependency on --help.
+         with self.moz_configure('''
+             option('--foo', help='foo')
+             @depends('--foo')
+             def foo(value):
+                 os
+                 return value
+

+ 208 - 0
mozilla-esr52/patches/1322025-3.patch

@@ -0,0 +1,208 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1485329523 -32400
+# Node ID 175dabab373b0f584beedfa768612743e264aa9a
+# Parent  42f5b6502a6414392cce5098bfe3c6b6b7fc8032
+Bug 1322025 - Make DependsFunction.func less public. r=chmanchester
+
+We're going to change the function signature for CombinedDependsFunction,
+so make it visible in the API that the function member is not meant to
+be used directly. The linter still does, though, because it needs to
+look in their guts.
+
+At the same time, avoid setting DependsFunction names via the function
+name itself, because in upcoming changes, it will not be modifiable in
+some cases.
+
+diff --git a/python/mozbuild/mozbuild/configure/__init__.py b/python/mozbuild/mozbuild/configure/__init__.py
+--- a/python/mozbuild/mozbuild/configure/__init__.py
++++ b/python/mozbuild/mozbuild/configure/__init__.py
+@@ -46,54 +46,61 @@ class SandboxDependsFunction(object):
+     '''Sandbox-visible representation of @depends functions.'''
+     def __call__(self, *arg, **kwargs):
+         raise ConfigureError('The `%s` function may not be called'
+                              % self.__name__)
+ 
+ 
+ class DependsFunction(object):
+     __slots__ = (
+-        'func', 'dependencies', 'when', 'sandboxed', 'sandbox', '_result')
++        '_func', '_name', 'dependencies', 'when', 'sandboxed', 'sandbox',
++        '_result')
+ 
+     def __init__(self, sandbox, func, dependencies, when=None):
+         assert isinstance(sandbox, ConfigureSandbox)
+-        self.func = func
++        assert not inspect.isgeneratorfunction(func)
++        self._func = func
++        self._name = func.__name__
+         self.dependencies = dependencies
+         self.sandboxed = wraps(func)(SandboxDependsFunction())
+         self.sandbox = sandbox
+         self.when = when
+         sandbox._depends[self.sandboxed] = self
+ 
+         # Only @depends functions with a dependency on '--help' are executed
+         # immediately. Everything else is queued for later execution.
+         if sandbox._help_option in dependencies:
+             sandbox._value_for(self)
+         elif not sandbox._help:
+             sandbox._execution_queue.append((sandbox._value_for, (self,)))
+ 
+     @property
+     def name(self):
+-        return self.func.__name__
++        return self._name
++
++    @name.setter
++    def name(self, value):
++        self._name = value
+ 
+     @property
+     def sandboxed_dependencies(self):
+         return [
+             d.sandboxed if isinstance(d, DependsFunction) else d
+             for d in self.dependencies
+         ]
+ 
+     @memoize
+     def result(self, need_help_dependency=False):
+         if self.when and not self.sandbox._value_for(self.when,
+                                                      need_help_dependency):
+             return None
+ 
+         resolved_args = [self.sandbox._value_for(d, need_help_dependency)
+                          for d in self.dependencies]
+-        return self.func(*resolved_args)
++        return self._func(*resolved_args)
+ 
+     def __repr__(self):
+         return '<%s.%s %s(%s)>' % (
+             self.__class__.__module__,
+             self.__class__.__name__,
+             self.name,
+             ', '.join(repr(d) for d in self.dependencies),
+         )
+@@ -103,17 +110,17 @@ class CombinedDependsFunction(DependsFun
+     def __init__(self, sandbox, func, dependencies):
+         @memoize
+         @wraps(func)
+         def wrapper(*args):
+             return func(args)
+ 
+         flatten_deps = []
+         for d in dependencies:
+-            if isinstance(d, CombinedDependsFunction) and d.func == wrapper:
++            if isinstance(d, CombinedDependsFunction) and d._func == wrapper:
+                 for d2 in d.dependencies:
+                     if d2 not in flatten_deps:
+                         flatten_deps.append(d2)
+             elif d not in flatten_deps:
+                 flatten_deps.append(d)
+ 
+         # Automatically add a --help dependency if one of the dependencies
+         # depends on it.
+@@ -129,21 +136,21 @@ class CombinedDependsFunction(DependsFun
+     @memoize
+     def result(self, need_help_dependency=False):
+         # Ignore --help for the combined result
+         deps = self.dependencies
+         if deps[0] == self.sandbox._help_option:
+             deps = deps[1:]
+         resolved_args = [self.sandbox._value_for(d, need_help_dependency)
+                          for d in deps]
+-        return self.func(*resolved_args)
++        return self._func(*resolved_args)
+ 
+     def __eq__(self, other):
+         return (isinstance(other, self.__class__) and
+-                self.func == other.func and
++                self._func == other._func and
+                 set(self.dependencies) == set(other.dependencies))
+ 
+     def __ne__(self, other):
+         return not self == other
+ 
+ class SandboxedGlobal(dict):
+     '''Identifiable dict type for use as function global'''
+ 
+@@ -386,17 +393,17 @@ class ConfigureSandbox(dict):
+ 
+         elif (not isinstance(value, SandboxDependsFunction) and
+                 value not in self._templates and
+                 not (inspect.isclass(value) and issubclass(value, Exception))):
+             raise KeyError('Cannot assign `%s` because it is neither a '
+                            '@depends nor a @template' % key)
+ 
+         if isinstance(value, SandboxDependsFunction):
+-            self._depends[value].func.__name__ = key
++            self._depends[value].name = key
+ 
+         return super(ConfigureSandbox, self).__setitem__(key, value)
+ 
+     def _resolve(self, arg, need_help_dependency=True):
+         if isinstance(arg, SandboxDependsFunction):
+             return self._value_for_depends(self._depends[arg],
+                                            need_help_dependency)
+         return arg
+@@ -412,17 +419,16 @@ class ConfigureSandbox(dict):
+ 
+         elif isinstance(obj, Option):
+             return self._value_for_option(obj)
+ 
+         assert False
+ 
+     @memoize
+     def _value_for_depends(self, obj, need_help_dependency=False):
+-        assert not inspect.isgeneratorfunction(obj.func)
+         return obj.result(need_help_dependency)
+ 
+     @memoize
+     def _value_for_option(self, option):
+         implied = {}
+         for implied_option in self._implied_options[:]:
+             if implied_option.name not in (option.name, option.env):
+                 continue
+diff --git a/python/mozbuild/mozbuild/configure/lint.py b/python/mozbuild/mozbuild/configure/lint.py
+--- a/python/mozbuild/mozbuild/configure/lint.py
++++ b/python/mozbuild/mozbuild/configure/lint.py
+@@ -35,17 +35,17 @@ class LintSandbox(ConfigureSandbox):
+ 
+         for dep in self._depends.itervalues():
+             self._check_dependencies(dep)
+ 
+     def _check_dependencies(self, obj):
+         if isinstance(obj, CombinedDependsFunction) or obj in (self._always,
+                                                                self._never):
+             return
+-        func, glob = self.unwrap(obj.func)
++        func, glob = self.unwrap(obj._func)
+         loc = '%s:%d' % (func.func_code.co_filename,
+                          func.func_code.co_firstlineno)
+         func_args = inspect.getargspec(func)
+         if func_args.keywords:
+             raise ConfigureError(
+                 '%s: Keyword arguments are not allowed in @depends functions'
+                 % loc
+             )
+@@ -75,17 +75,17 @@ class LintSandbox(ConfigureSandbox):
+ 
+     def _missing_help_dependency(self, obj):
+         if isinstance(obj, CombinedDependsFunction):
+             return False
+         if isinstance(obj, DependsFunction):
+             if (self._help_option in obj.dependencies or
+                 obj in (self._always, self._never)):
+                 return False
+-            func, glob = self.unwrap(obj.func)
++            func, glob = self.unwrap(obj._func)
+             # We allow missing --help dependencies for functions that:
+             # - don't use @imports
+             # - don't have a closure
+             # - don't use global variables
+             if func in self._imports or func.func_closure:
+                 return True
+             for op, arg in disassemble_as_iter(func):
+                 if op in ('LOAD_GLOBAL', 'STORE_GLOBAL'):
+

+ 125 - 0
mozilla-esr52/patches/1322025-4.patch

@@ -0,0 +1,125 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1485330629 -32400
+# Node ID 0b17ca34cb2e7988105ec52d90ea0f92ab996448
+# Parent  175dabab373b0f584beedfa768612743e264aa9a
+Bug 1322025 - Don't wrap the combination function in CombinedDependsFunction. r=chmanchester
+
+Several things were wrong with the wrapping:
+- the equality test on functions was actually comparing the memoized
+  functions, which have a type memoize, which inherits from dict. So
+  they weren't comparing actual functions, but the dict used to store
+  the cache of their invocation.
+- each CombinedDependsFunction created for the same combination function
+  used a different wrapped function, so even if the dict problem wasn't
+  there, the equality test still wouldn't work, except if the function
+  wrapping itself was memoized.
+- the memoization was not particularly useful.
+
+Also, for upcoming changes, we'd actually like the combination function to
+take an iterable instead of a variable argument list, so that items of
+the iterable can be skipped.
+
+diff --git a/python/mozbuild/mozbuild/configure/__init__.py b/python/mozbuild/mozbuild/configure/__init__.py
+--- a/python/mozbuild/mozbuild/configure/__init__.py
++++ b/python/mozbuild/mozbuild/configure/__init__.py
+@@ -103,54 +103,49 @@ class DependsFunction(object):
+             self.__class__.__name__,
+             self.name,
+             ', '.join(repr(d) for d in self.dependencies),
+         )
+ 
+ 
+ class CombinedDependsFunction(DependsFunction):
+     def __init__(self, sandbox, func, dependencies):
+-        @memoize
+-        @wraps(func)
+-        def wrapper(*args):
+-            return func(args)
+-
+         flatten_deps = []
+         for d in dependencies:
+-            if isinstance(d, CombinedDependsFunction) and d._func == wrapper:
++            if isinstance(d, CombinedDependsFunction) and d._func is func:
+                 for d2 in d.dependencies:
+                     if d2 not in flatten_deps:
+                         flatten_deps.append(d2)
+             elif d not in flatten_deps:
+                 flatten_deps.append(d)
+ 
+         # Automatically add a --help dependency if one of the dependencies
+         # depends on it.
+         for d in flatten_deps:
+             if (isinstance(d, DependsFunction) and
+                 sandbox._help_option in d.dependencies):
+                 flatten_deps.insert(0, sandbox._help_option)
+                 break
+ 
+         super(CombinedDependsFunction, self).__init__(
+-            sandbox, wrapper, flatten_deps)
++            sandbox, func, flatten_deps)
+ 
+     @memoize
+     def result(self, need_help_dependency=False):
+         # Ignore --help for the combined result
+         deps = self.dependencies
+         if deps[0] == self.sandbox._help_option:
+             deps = deps[1:]
+         resolved_args = [self.sandbox._value_for(d, need_help_dependency)
+                          for d in deps]
+-        return self._func(*resolved_args)
++        return self._func(resolved_args)
+ 
+     def __eq__(self, other):
+         return (isinstance(other, self.__class__) and
+-                self._func == other._func and
++                self._func is other._func and
+                 set(self.dependencies) == set(other.dependencies))
+ 
+     def __ne__(self, other):
+         return not self == other
+ 
+ class SandboxedGlobal(dict):
+     '''Identifiable dict type for use as function global'''
+ 
+diff --git a/python/mozbuild/mozbuild/test/configure/test_configure.py b/python/mozbuild/mozbuild/test/configure/test_configure.py
+--- a/python/mozbuild/mozbuild/test/configure/test_configure.py
++++ b/python/mozbuild/mozbuild/test/configure/test_configure.py
+@@ -867,16 +867,35 @@ class TestConfigure(unittest.TestCase):
+         '''):
+             with self.assertRaises(ConfigureError) as e:
+                 self.get_config()
+ 
+             self.assertEquals(e.exception.message,
+                               '@depends function needs the same `when` as '
+                               'options it depends on')
+ 
++        with self.moz_configure('''
++            @depends(when=True)
++            def always():
++                return True
++            @depends(when=True)
++            def always2():
++                return True
++            with only_when(always2):
++                option('--with-foo', help='foo', when=always)
++                # include() triggers resolution of its dependencies, and their
++                # side effects.
++                include(depends('--with-foo', when=always)(lambda x: x))
++                # The sandbox should figure that the `when` here is
++                # appropriate. Bad behavior in CombinedDependsFunction.__eq__
++                # made this fail in the past.
++                set_config('FOO', depends('--with-foo', when=always)(lambda x: x))
++        '''):
++            self.get_config()
++
+     def test_include_failures(self):
+         with self.assertRaises(ConfigureError) as e:
+             with self.moz_configure('include("../foo.configure")'):
+                 self.get_config()
+ 
+         self.assertEquals(
+             e.exception.message,
+             'Cannot include `%s` because it is not in a subdirectory of `%s`'
+

+ 53 - 0
mozilla-esr52/patches/1322025-5.patch

@@ -0,0 +1,53 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1485331803 -32400
+# Node ID 5e9a5b5829d161f9b50ed3b9165772425f3d5511
+# Parent  0b17ca34cb2e7988105ec52d90ea0f92ab996448
+Bug 1322025 - Don't automatically add --help dependencies to CombinedDependsFunctions. r=chmanchester
+
+Adding those dependencies, retrospectively, only worked around the poor
+handling of --help requirements by the linter, that we fixed a few
+commits ago. This is now not necessary anymore.
+
+diff --git a/python/mozbuild/mozbuild/configure/__init__.py b/python/mozbuild/mozbuild/configure/__init__.py
+--- a/python/mozbuild/mozbuild/configure/__init__.py
++++ b/python/mozbuild/mozbuild/configure/__init__.py
+@@ -112,35 +112,23 @@ class CombinedDependsFunction(DependsFun
+         for d in dependencies:
+             if isinstance(d, CombinedDependsFunction) and d._func is func:
+                 for d2 in d.dependencies:
+                     if d2 not in flatten_deps:
+                         flatten_deps.append(d2)
+             elif d not in flatten_deps:
+                 flatten_deps.append(d)
+ 
+-        # Automatically add a --help dependency if one of the dependencies
+-        # depends on it.
+-        for d in flatten_deps:
+-            if (isinstance(d, DependsFunction) and
+-                sandbox._help_option in d.dependencies):
+-                flatten_deps.insert(0, sandbox._help_option)
+-                break
+-
+         super(CombinedDependsFunction, self).__init__(
+             sandbox, func, flatten_deps)
+ 
+     @memoize
+     def result(self, need_help_dependency=False):
+-        # Ignore --help for the combined result
+-        deps = self.dependencies
+-        if deps[0] == self.sandbox._help_option:
+-            deps = deps[1:]
+         resolved_args = [self.sandbox._value_for(d, need_help_dependency)
+-                         for d in deps]
++                         for d in self.dependencies]
+         return self._func(resolved_args)
+ 
+     def __eq__(self, other):
+         return (isinstance(other, self.__class__) and
+                 self._func is other._func and
+                 set(self.dependencies) == set(other.dependencies))
+ 
+     def __ne__(self, other):
+

+ 156 - 0
mozilla-esr52/patches/1322025-6.patch

@@ -0,0 +1,156 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1485333753 -32400
+# Node ID 9c02acca893d374375778cd49f9ff542c16b91c4
+# Parent  5e9a5b5829d161f9b50ed3b9165772425f3d5511
+Bug 1322025 - Allow to combine two DependsFunctions with "|". r=chmanchester
+
+Ideally, it would have been better if it were "or", but it's not
+possible to override "or" in python ; __or__ is for "|".
+
+This does feel magic, but it's also shorter than adding something like
+@depends_any(), and while we're only adding "|" as of this change, we
+can add other operations such as "&" in the future, or __getattr__ for
+things like milestone.is_nightly.
+
+An alternative form in moz.configure could require the @depends function
+to be called, e.g. "a() | b()" instead of "a | b", but I'm not
+particularly convinced that one is less magic than the other.
+
+This feature is hooked up such that b is not resolved if a is true,
+although in practice, it will still be resolved in Sandbox.run... but
+not when --help is passed. In the long run, the forced resolution of
+@depends functions will be removed from Sandbox.run.
+
+diff --git a/python/mozbuild/mozbuild/configure/__init__.py b/python/mozbuild/mozbuild/configure/__init__.py
+--- a/python/mozbuild/mozbuild/configure/__init__.py
++++ b/python/mozbuild/mozbuild/configure/__init__.py
+@@ -39,33 +39,42 @@ import mozpack.path as mozpath
+ 
+ 
+ class ConfigureError(Exception):
+     pass
+ 
+ 
+ class SandboxDependsFunction(object):
+     '''Sandbox-visible representation of @depends functions.'''
++    def __init__(self, unsandboxed):
++        self._or = unsandboxed.__or__
++
+     def __call__(self, *arg, **kwargs):
+         raise ConfigureError('The `%s` function may not be called'
+                              % self.__name__)
+ 
++    def __or__(self, other):
++        if not isinstance(other, SandboxDependsFunction):
++            raise ConfigureError('Can only do binary arithmetic operations '
++                                 'with another @depends function.')
++        return self._or(other).sandboxed
++
+ 
+ class DependsFunction(object):
+     __slots__ = (
+         '_func', '_name', 'dependencies', 'when', 'sandboxed', 'sandbox',
+         '_result')
+ 
+     def __init__(self, sandbox, func, dependencies, when=None):
+         assert isinstance(sandbox, ConfigureSandbox)
+         assert not inspect.isgeneratorfunction(func)
+         self._func = func
+         self._name = func.__name__
+         self.dependencies = dependencies
+-        self.sandboxed = wraps(func)(SandboxDependsFunction())
++        self.sandboxed = wraps(func)(SandboxDependsFunction(self))
+         self.sandbox = sandbox
+         self.when = when
+         sandbox._depends[self.sandboxed] = self
+ 
+         # Only @depends functions with a dependency on '--help' are executed
+         # immediately. Everything else is queued for later execution.
+         if sandbox._help_option in dependencies:
+             sandbox._value_for(self)
+@@ -100,16 +109,33 @@ class DependsFunction(object):
+     def __repr__(self):
+         return '<%s.%s %s(%s)>' % (
+             self.__class__.__module__,
+             self.__class__.__name__,
+             self.name,
+             ', '.join(repr(d) for d in self.dependencies),
+         )
+ 
++    def __or__(self, other):
++        if isinstance(other, SandboxDependsFunction):
++            other = self.sandbox._depends.get(other)
++        assert isinstance(other, DependsFunction)
++        assert self.sandbox is other.sandbox
++        return CombinedDependsFunction(self.sandbox, self.first_true,
++                                       (self, other))
++
++    @staticmethod
++    def first_true(iterable):
++        # Like the builtin any(), but returns the first element that is true,
++        # instead of True. If none are true, returns the last element.
++        for i in iterable:
++            if i:
++                return i
++        return i
++
+ 
+ class CombinedDependsFunction(DependsFunction):
+     def __init__(self, sandbox, func, dependencies):
+         flatten_deps = []
+         for d in dependencies:
+             if isinstance(d, CombinedDependsFunction) and d._func is func:
+                 for d2 in d.dependencies:
+                     if d2 not in flatten_deps:
+diff --git a/python/mozbuild/mozbuild/test/configure/test_configure.py b/python/mozbuild/mozbuild/test/configure/test_configure.py
+--- a/python/mozbuild/mozbuild/test/configure/test_configure.py
++++ b/python/mozbuild/mozbuild/test/configure/test_configure.py
+@@ -1282,11 +1282,45 @@ class TestConfigure(unittest.TestCase):
+                               '--foo is not available in this configuration')
+ 
+         # And similarly doesn't fail when the condition is true.
+         with self.moz_configure('''
+             imply_option('--foo', True)
+         ''' + moz_configure):
+             self.get_config(['--enable-when'])
+ 
++    def test_depends_or(self):
++        with self.moz_configure('''
++            option('--foo', nargs=1, help='foo')
++            @depends('--foo')
++            def foo(value):
++                return value or None
++
++            option('--bar', nargs=1, help='bar')
++            @depends('--bar')
++            def bar(value):
++                return value
++
++            set_config('FOOBAR', foo | bar)
++        '''):
++            config = self.get_config()
++            self.assertEqual(config, {
++                'FOOBAR': NegativeOptionValue(),
++            })
++
++            config = self.get_config(['--foo=foo'])
++            self.assertEqual(config, {
++                'FOOBAR': PositiveOptionValue(('foo',)),
++            })
++
++            config = self.get_config(['--bar=bar'])
++            self.assertEqual(config, {
++                'FOOBAR': PositiveOptionValue(('bar',)),
++            })
++
++            config = self.get_config(['--foo=foo', '--bar=bar'])
++            self.assertEqual(config, {
++                'FOOBAR': PositiveOptionValue(('foo',)),
++            })
++
+ 
+ if __name__ == '__main__':
+     main()
+

+ 132 - 0
mozilla-esr52/patches/1322025-7.patch

@@ -0,0 +1,132 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1485334456 -32400
+# Node ID c78a57144263224e409204ee3ab43fdc305a6b9f
+# Parent  9c02acca893d374375778cd49f9ff542c16b91c4
+Bug 1322025 - Provide variants of host and target that depend on --help. r=chmanchester
+
+We want to avoid giving --help dependencies to host and target, so that
+they we don't spawn config.guess and config.sub when running configure
+--help, and don't need to reach out to the which module to find a
+suitable shell to execute them.
+
+So, when --help is given, we return a fake host/target namespace, and
+avoid the config.guess/config.sub-invoking code being executed.
+
+Then, by giving the --help option to the linter, it can properly find
+that the config.guess/config.sub-invoking code doesn't need the
+dependency on --help.
+
+This effectively unbreaks configure --help after bug 1313306.
+
+diff --git a/build/moz.configure/init.configure b/build/moz.configure/init.configure
+--- a/build/moz.configure/init.configure
++++ b/build/moz.configure/init.configure
+@@ -412,16 +412,33 @@ def split_triplet(triplet):
+         raw_cpu=cpu,
+         raw_os=os,
+         # Toolchains, most notably for cross compilation may use cpu-os
+         # prefixes.
+         toolchain='%s-%s' % (cpu, os),
+     )
+ 
+ 
++# This defines a fake target/host namespace for when running with --help
++@depends('--help')
++def help_host_target(help):
++    if help:
++        return namespace(
++            alias='unknown-unknown-unknown',
++            cpu='unknown',
++            bitness='unknown',
++            kernel='unknown',
++            os='unknown',
++            endianness='unknown',
++            raw_cpu='unknown',
++            raw_os='unknown',
++            toolchain='unknown-unknown',
++        )
++
++
+ @imports('subprocess')
+ def config_sub(shell, triplet):
+     config_sub = os.path.join(os.path.dirname(__file__), '..',
+                               'autoconf', 'config.sub')
+     return subprocess.check_output([shell, config_sub, triplet]).strip()
+ 
+ 
+ @depends('--host', shell)
+@@ -432,24 +449,28 @@ def host(value, shell):
+         config_guess = os.path.join(os.path.dirname(__file__), '..',
+                                     'autoconf', 'config.guess')
+         host = subprocess.check_output([shell, config_guess]).strip()
+     else:
+         host = value[0]
+ 
+     return split_triplet(config_sub(shell, host))
+ 
++host = help_host_target | host
++
+ 
+ @depends('--target', host, shell)
+ @checking('for target system type', lambda t: t.alias)
+ def target(value, host, shell):
+     if not value:
+         return host
+     return split_triplet(config_sub(shell, value[0]))
+ 
++target = help_host_target | target
++
+ 
+ @depends(host, target)
+ @checking('whether cross compiling')
+ def cross_compiling(host, target):
+     return host != target
+ 
+ set_config('CROSS_COMPILE', cross_compiling)
+ set_define('CROSS_COMPILE', cross_compiling)
+diff --git a/python/mozbuild/mozbuild/configure/__init__.py b/python/mozbuild/mozbuild/configure/__init__.py
+--- a/python/mozbuild/mozbuild/configure/__init__.py
++++ b/python/mozbuild/mozbuild/configure/__init__.py
+@@ -143,18 +143,18 @@ class CombinedDependsFunction(DependsFun
+             elif d not in flatten_deps:
+                 flatten_deps.append(d)
+ 
+         super(CombinedDependsFunction, self).__init__(
+             sandbox, func, flatten_deps)
+ 
+     @memoize
+     def result(self, need_help_dependency=False):
+-        resolved_args = [self.sandbox._value_for(d, need_help_dependency)
+-                         for d in self.dependencies]
++        resolved_args = (self.sandbox._value_for(d, need_help_dependency)
++                         for d in self.dependencies)
+         return self._func(resolved_args)
+ 
+     def __eq__(self, other):
+         return (isinstance(other, self.__class__) and
+                 self._func is other._func and
+                 set(self.dependencies) == set(other.dependencies))
+ 
+     def __ne__(self, other):
+diff --git a/python/mozbuild/mozbuild/test/configure/lint.py b/python/mozbuild/mozbuild/test/configure/lint.py
+--- a/python/mozbuild/mozbuild/test/configure/lint.py
++++ b/python/mozbuild/mozbuild/test/configure/lint.py
+@@ -52,14 +52,14 @@ class Lint(unittest.TestCase):
+     def tearDown(self):
+         os.chdir(self._curdir)
+ 
+     def lint(self, project):
+         sandbox = LintSandbox({
+             'OLD_CONFIGURE': os.path.join(topsrcdir, 'old-configure'),
+             'MOZCONFIG': os.path.join(os.path.dirname(test_path), 'data',
+                                       'empty_mozconfig'),
+-        }, ['--enable-project=%s' % project])
++        }, ['--enable-project=%s' % project, '--help'])
+         sandbox.run(os.path.join(topsrcdir, 'moz.configure'))
+ 
+ 
+ if __name__ == '__main__':
+     main()
+

+ 83 - 0
mozilla-esr52/patches/1323901-1.patch

@@ -0,0 +1,83 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1482442083 -32400
+# Node ID 21e27f6e2770e71e8d3ccae37d334f1e8c5c7af0
+# Parent  d23e21a03ce2cb665afd5a63da6180dda0fd6a4b
+Bug 1323901 - Force `which` to use lowercase extensions on Windows. r=cmanchester+432261
+
+diff --git a/build/moz.configure/util.configure b/build/moz.configure/util.configure
+--- a/build/moz.configure/util.configure
++++ b/build/moz.configure/util.configure
+@@ -135,29 +135,46 @@ normalize_path = normalize_path()
+ 
+ # Locates the given program using which, or returns the given path if it
+ # exists.
+ # The `paths` parameter may be passed to search the given paths instead of
+ # $PATH.
+ @imports(_from='which', _import='which')
+ @imports(_from='which', _import='WhichError')
+ @imports('itertools')
++@imports('sys')
+ @imports(_from='os', _import='pathsep')
++@imports(_from='os', _import='environ')
+ def find_program(file, paths=None):
++    # The following snippet comes from `which` itself, with a slight
++    # modification to use lowercase extensions, because it's confusing rustup
++    # (on top of making results not really appealing to the eye).
++
++    # Windows has the concept of a list of extensions (PATHEXT env var).
++    if sys.platform.startswith("win"):
++        exts = [e.lower()
++                for e in environ.get("PATHEXT", "").split(pathsep)]
++        # If '.exe' is not in exts then obviously this is Win9x and
++        # or a bogus PATHEXT, then use a reasonable default.
++	if '.exe' not in exts:
++            exts = ['.com', '.exe', '.bat']
++    else:
++        exts = None
++
+     try:
+         if is_absolute_or_relative(file):
+             return normalize_path(which(os.path.basename(file),
+-                                        [os.path.dirname(file)]))
++                                        [os.path.dirname(file)], exts=exts))
+         if paths:
+             if not isinstance(paths, (list, tuple)):
+                 die("Paths provided to find_program must be a list of strings, "
+                     "not %r", paths)
+             paths = list(itertools.chain(
+                 *(p.split(pathsep) for p in paths if p)))
+-        return normalize_path(which(file, path=paths))
++        return normalize_path(which(file, path=paths, exts=exts))
+     except WhichError:
+         return None
+ 
+ 
+ @imports('os')
+ @imports('subprocess')
+ @imports(_from='mozbuild.configure.util', _import='LineIO')
+ @imports(_from='tempfile', _import='mkstemp')
+diff --git a/python/mozbuild/mozbuild/test/configure/common.py b/python/mozbuild/mozbuild/test/configure/common.py
+--- a/python/mozbuild/mozbuild/test/configure/common.py
++++ b/python/mozbuild/mozbuild/test/configure/common.py
+@@ -170,17 +170,17 @@ class ConfigureTestSandbox(ConfigureSand
+                 self.value = ''
+ 
+         return Buffer()
+ 
+     def GetShortPathNameW(self, path_in, path_out, length):
+         path_out.value = fake_short_path(path_in)
+         return length
+ 
+-    def which(self, command, path=None):
++    def which(self, command, path=None, exts=None):
+         for parent in (path or self._search_path):
+             c = mozpath.abspath(mozpath.join(parent, command))
+             for candidate in (c, ensure_exe_extension(c)):
+                 if self.imported_os.path.exists(candidate):
+                     return candidate
+         raise WhichError()
+ 
+     def Popen(self, args, stdin=None, stdout=None, stderr=None, **kargs):
+

+ 31 - 0
mozilla-esr52/patches/1323901-2.patch

@@ -0,0 +1,31 @@
+
+# HG changeset patch
+# User Carsten "Tomcat" Book <cbook@mozilla.com>
+# Date 1482913771 -3600
+# Node ID 536b05a23fa07042378f5459ab638870ebb0889c
+# Parent  21e27f6e2770e71e8d3ccae37d334f1e8c5c7af0
+Bug 1323901 - Bustage fix from glandium
+
+diff --git a/build/moz.configure/util.configure b/build/moz.configure/util.configure
+--- a/build/moz.configure/util.configure
++++ b/build/moz.configure/util.configure
+@@ -149,17 +149,17 @@ def find_program(file, paths=None):
+     # (on top of making results not really appealing to the eye).
+ 
+     # Windows has the concept of a list of extensions (PATHEXT env var).
+     if sys.platform.startswith("win"):
+         exts = [e.lower()
+                 for e in environ.get("PATHEXT", "").split(pathsep)]
+         # If '.exe' is not in exts then obviously this is Win9x and
+         # or a bogus PATHEXT, then use a reasonable default.
+-	if '.exe' not in exts:
++        if '.exe' not in exts:
+             exts = ['.com', '.exe', '.bat']
+     else:
+         exts = None
+ 
+     try:
+         if is_absolute_or_relative(file):
+             return normalize_path(which(os.path.basename(file),
+                                         [os.path.dirname(file)], exts=exts))
+

+ 195 - 0
mozilla-esr52/patches/1335666.patch

@@ -0,0 +1,195 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1485933929 -32400
+# Node ID 35967a21613ea7f0a6aca96a4042d7a2d8fdcccf
+# Parent  1b1fc1efce0ec95e111ac3b2183abf0ba14db83a
+Bug 1335666 - Remove @depends_when. r=chmanchester
+
+In bug 1296530, we made @depends take a when argument, it can now replace
+all uses of @depends_when.
+
+diff --git a/build/moz.configure/compilers-util.configure b/build/moz.configure/compilers-util.configure
+--- a/build/moz.configure/compilers-util.configure
++++ b/build/moz.configure/compilers-util.configure
+@@ -38,17 +38,17 @@ def compiler_class(compiler):
+ 
+             if check_msg:
+                 def checking_fn(fn):
+                     return checking(check_msg)(fn)
+             else:
+                 def checking_fn(fn):
+                     return fn
+ 
+-            @depends_when(self, dependable(flags), extra_toolchain_flags, when=when)
++            @depends(self, dependable(flags), extra_toolchain_flags, when=when)
+             @checking_fn
+             def func(compiler, flags, extra_flags):
+                 flags = flags or []
+                 flags += extra_flags or []
+                 flags.append('-c')
+ 
+                 if try_invoke_compiler(
+                     compiler.wrapper + [compiler.compiler] + compiler.flags,
+diff --git a/build/moz.configure/headers.configure b/build/moz.configure/headers.configure
+--- a/build/moz.configure/headers.configure
++++ b/build/moz.configure/headers.configure
+@@ -69,21 +69,21 @@ have_perf_event_h = check_header('linux/
+                                  when=building_linux)
+ 
+ js_option('--with-linux-headers',
+           help='location where the Linux kernel headers can be found',
+           nargs=1)
+ 
+ passed_linux_header_flags = depends_if('--with-linux-headers')(lambda v: ['-I%s' % v[0]])
+ 
+-@depends_when(try_compile(includes=['asm/unistd.h'],
+-                          body='return sizeof(__NR_perf_event_open);',
+-                          flags=passed_linux_header_flags,
+-                          check_msg='for perf_event_open system call'),
+-              when=have_perf_event_h)
++@depends(try_compile(includes=['asm/unistd.h'],
++                     body='return sizeof(__NR_perf_event_open);',
++                     flags=passed_linux_header_flags,
++                     check_msg='for perf_event_open system call'),
++         when=have_perf_event_h)
+ def have_perf_event_open(have_perf_event_open):
+     if have_perf_event_open:
+         return True
+ 
+ set_config('HAVE_LINUX_PERF_EVENT_H', have_perf_event_open)
+ 
+ @depends(passed_linux_header_flags, have_perf_event_open)
+ def linux_headers_includes(passed_linux_header_flags, have_perf_event_open):
+diff --git a/build/moz.configure/pkg.configure b/build/moz.configure/pkg.configure
+--- a/build/moz.configure/pkg.configure
++++ b/build/moz.configure/pkg.configure
+@@ -35,29 +35,29 @@ def pkg_check_modules(var, package_desc,
+     if isinstance(package_desc, (tuple, list)):
+         package_desc = ' '.join(package_desc)
+     package_desc = dependable(package_desc)
+ 
+     @depends(when, '--enable-compile-environment')
+     def when_and_compile_environment(when, compile_environment):
+         return when and compile_environment
+ 
+-    @depends_when(pkg_config, pkg_config_version,
+-                  when=when_and_compile_environment)
++    @depends(pkg_config, pkg_config_version,
++             when=when_and_compile_environment)
+     def check_pkg_config(pkg_config, version):
+         min_version = '0.9.0'
+         if pkg_config is None:
+             die("*** The pkg-config script could not be found. Make sure it is\n"
+                 "*** in your path, or set the PKG_CONFIG environment variable\n"
+                 "*** to the full path to pkg-config.")
+         if version < min_version:
+             die("*** Your version of pkg-config is too old. You need version %s or newer.",
+                 min_version)
+ 
+-    @depends_when(pkg_config, package_desc, when=when_and_compile_environment)
++    @depends(pkg_config, package_desc, when=when_and_compile_environment)
+     @imports('subprocess')
+     @imports('sys')
+     @imports(_from='mozbuild.configure.util', _import='LineIO')
+     def package(pkg_config, package_desc):
+         # package_desc may start as a depends function, so we can't use
+         # @checking here.
+         log.info("checking for %s... " % package_desc)
+         with log.queue_debug():
+@@ -69,29 +69,29 @@ def pkg_check_modules(var, package_desc,
+             except subprocess.CalledProcessError as e:
+                 log.info("no")
+                 log_writer = log.warning if allow_missing else log.error
+                 with LineIO(lambda l: log_writer(l)) as o:
+                     o.write(e.output)
+                 if not allow_missing:
+                     sys.exit(1)
+ 
+-    @depends_when(pkg_config, package_desc, when=package)
++    @depends(pkg_config, package_desc, when=package)
+     @checking('%s_CFLAGS' % var, callback=lambda t: ' '.join(t))
+     def pkg_cflags(pkg_config, package_desc):
+         flags = check_cmd_output(pkg_config, '--cflags', package_desc)
+         return tuple(flags.split())
+ 
+-    @depends_when(pkg_config, package_desc, when=package)
++    @depends(pkg_config, package_desc, when=package)
+     @checking('%s_LIBS' % var, callback=lambda t: ' '.join(t))
+     def pkg_libs(pkg_config, package_desc):
+         libs = check_cmd_output(pkg_config, '--libs', package_desc)
+         # Remove evil flags like -Wl,--export-dynamic
+         return tuple(libs.replace('-Wl,--export-dynamic', '').split())
+ 
+-    @depends_when(pkg_cflags, pkg_libs, when=package)
++    @depends(pkg_cflags, pkg_libs, when=package)
+     def pkg_info(cflags, libs):
+         return namespace(cflags=cflags, libs=libs)
+ 
+     set_config('%s_CFLAGS' % var, pkg_cflags)
+     set_config('%s_LIBS' % var, pkg_libs)
+ 
+     return pkg_info
+diff --git a/build/moz.configure/util.configure b/build/moz.configure/util.configure
+--- a/build/moz.configure/util.configure
++++ b/build/moz.configure/util.configure
+@@ -394,36 +394,16 @@ def depends_if(*args):
+     def decorator(func):
+         @depends(*args)
+         def wrapper(*args):
+             if any(arg for arg in args):
+                 return func(*args)
+         return wrapper
+     return decorator
+ 
+-# Like @depends_if, but a distinguished value passed as a keyword argument
+-# "when" is truth tested instead of every argument. This value is not passed
+-# to the function if it is called.
+-@template
+-def depends_when(*args, **kwargs):
+-    if not len(kwargs) == 1 and kwargs.get('when'):
+-        die('depends_when requires a single keyword argument, "when"')
+-    when = kwargs['when']
+-    if not when:
+-        return depends(*args)
+-
+-    def decorator(fn):
+-        @depends(when, *args)
+-        def wrapper(val, *args):
+-            if val:
+-                return fn(*args)
+-        return wrapper
+-    return decorator
+-
+-
+ # Hacks related to old-configure
+ # ==============================
+ 
+ @dependable
+ def old_configure_assignments():
+     return []
+ 
+ @dependable
+diff --git a/js/ffi.configure b/js/ffi.configure
+--- a/js/ffi.configure
++++ b/js/ffi.configure
+@@ -21,17 +21,17 @@ system_ffi = pkg_check_modules('MOZ_FFI'
+                                when=use_system_ffi)
+ 
+ building_ffi = depends(system_ffi)(lambda v: v is None)
+ 
+ set_config('MOZ_SYSTEM_FFI', depends_if(system_ffi)(lambda _: True))
+ add_old_configure_assignment('MOZ_SYSTEM_FFI', depends_if(system_ffi)(lambda _: True))
+ 
+ # Target selection, based on ffi/configure.ac.
+-@depends_when(target, when=building_ffi)
++@depends(target, when=building_ffi)
+ def ffi_target(target):
+     if target.cpu not in ('x86', 'x86_64', 'arm', 'aarch64'):
+         die('Building libffi from the tree is not supported on this platform. '
+             'Use --with-system-ffi instead.')
+ 
+     if target.os == 'WINNT':
+         target_dir = 'x86'
+         if target.cpu == 'x86_64':
+

+ 119 - 0
mozilla-esr52/patches/1343781.patch

@@ -0,0 +1,119 @@
+
+# HG changeset patch
+# User Edmund Wong <ewong@pw-wspx.org>
+# Date 1489027835 -28800
+# Node ID ef165ee587eff6802a2be666d4926a3585093dc5
+# Parent  e58b83fd06a9b138bdfaadbbc117edefcc687293
+Bug 1343781 - Ensure MozconfigLoader uses the right topsrcdir. r=glandium
+
+diff --git a/build/moz.configure/init.configure b/build/moz.configure/init.configure
+--- a/build/moz.configure/init.configure
++++ b/build/moz.configure/init.configure
+@@ -84,25 +84,38 @@ option(env='MOZ_AUTOMATION', help='Enabl
+ set_config('MOZ_AUTOMATION', depends_if('MOZ_AUTOMATION')(lambda x: True))
+ 
+ 
+ option(env='OLD_CONFIGURE', nargs=1, help='Path to the old configure script')
+ 
+ option(env='MOZ_CURRENT_PROJECT', nargs=1, help='Current build project')
+ option(env='MOZCONFIG', nargs=1, help='Mozconfig location')
+ 
++option('--with-external-source-dir', env='EXTERNAL_SOURCE_DIR', nargs=1,
++       help='External directory containing additional build files')
++
++@depends('--with-external-source-dir')
++def external_source_dir(value):
++    if value:
++        return value[0]
++
++set_config('EXTERNAL_SOURCE_DIR', external_source_dir)
++add_old_configure_assignment('EXTERNAL_SOURCE_DIR', external_source_dir)
++
+ # Read user mozconfig
+ # ==============================================================
+ # Note: the dependency on --help is only there to always read the mozconfig,
+ # even when --help is passed. Without this dependency, the function wouldn't
+ # be called when --help is passed, and the mozconfig wouldn't be read.
+ @depends('MOZ_CURRENT_PROJECT', 'MOZCONFIG', 'OLD_CONFIGURE',
+-         check_build_environment, '--help')
++         check_build_environment, '--with-external-source-dir',
++         '--help')
+ @imports(_from='mozbuild.mozconfig', _import='MozconfigLoader')
+-def mozconfig(current_project, mozconfig, old_configure, build_env, help):
++def mozconfig(current_project, mozconfig, old_configure, build_env,
++              external_source_dir, help):
+     if not old_configure:
+         die('The OLD_CONFIGURE environment variable must be set')
+ 
+     # Don't read the mozconfig for the js configure (yay backwards
+     # compatibility)
+     # While the long term goal is that js and top-level use the same configure
+     # and the same overall setup, including the possibility to use mozconfigs,
+     # figuring out what we want to do wrt mozconfig vs. command line and
+@@ -115,17 +128,20 @@ def mozconfig(current_project, mozconfig
+     # Unfortunately, there is no direct way to tell whether the running
+     # configure is the js configure. The indirect way is to look at the
+     # OLD_CONFIGURE path, which points to js/src/old-configure.
+     # I expect we'll have figured things out for mozconfigs well before
+     # old-configure dies.
+     if os.path.dirname(os.path.abspath(old_configure[0])).endswith('/js/src'):
+         return {'path': None}
+ 
+-    loader = MozconfigLoader(build_env.topsrcdir)
++    topsrcdir = build_env.topsrcdir
++    if external_source_dir:
++        topsrcdir = external_source_dir[0]
++    loader = MozconfigLoader(topsrcdir)
+     current_project = current_project[0] if current_project else None
+     mozconfig = mozconfig[0] if mozconfig else None
+     mozconfig = loader.find_mozconfig(env={'MOZCONFIG': mozconfig})
+     mozconfig = loader.read_mozconfig(mozconfig, moz_build_app=current_project)
+ 
+     return mozconfig
+ 
+ set_config('MOZCONFIG', depends(mozconfig)(lambda m: m['path']))
+@@ -627,43 +643,32 @@ imply_option('--enable-project', applica
+ def default_project(build_env, help):
+     if build_env.topobjdir.endswith('/js/src'):
+         return 'js'
+     return 'browser'
+ 
+ option('--enable-project', nargs=1, default=default_project,
+        help='Project to build')
+ 
+-option('--with-external-source-dir', env='EXTERNAL_SOURCE_DIR', nargs=1,
+-       help='External directory containing additional build files')
+-
+ @depends('--enable-project', '--with-external-source-dir',
+          check_build_environment, '--help')
+ @imports(_from='os.path', _import='exists')
+ def include_project_configure(project, external_source_dir, build_env, help):
+     if not project:
+         die('--enable-project is required.')
+ 
+     base_dir = build_env.topsrcdir
+     if external_source_dir:
+         base_dir = os.path.join(base_dir, external_source_dir[0])
+ 
+     path = os.path.join(base_dir, project[0], 'moz.configure')
+     if not exists(path):
+         die('Cannot find project %s', project[0])
+     return path
+ 
+-@depends('--with-external-source-dir')
+-def external_source_dir(value):
+-    if value:
+-        return value[0]
+-
+-set_config('EXTERNAL_SOURCE_DIR', external_source_dir)
+-add_old_configure_assignment('EXTERNAL_SOURCE_DIR', external_source_dir)
+-
+ 
+ @depends(include_project_configure, check_build_environment, '--help')
+ def build_project(include_project_configure, build_env, help):
+     ret = os.path.dirname(os.path.relpath(include_project_configure,
+                                           build_env.topsrcdir))
+     return ret
+ 
+ set_config('MOZ_BUILD_APP', build_project)
+

+ 121 - 0
mozilla-esr52/patches/1354510.patch

@@ -0,0 +1,121 @@
+
+# HG changeset patch
+# User Petr Sumbera <petr.sumbera@oracle.com>
+# Date 1491894092 25200
+# Node ID d99f00376b25222c2b811fac11e5a1ce02b9a7b2
+# Parent  8d1fa7f8f12b83c2bb09907be8a0cb1a08738fd1
+Bug 1354510 - Firefox build should recognize Solaris. r=glandium
+
+diff -r 8d1fa7f8f12b build/moz.configure/init.configure
+--- a/build/moz.configure/init.configure	Thu Mar 09 10:50:35 2017 +0800
++++ b/build/moz.configure/init.configure	Mon Aug 13 20:55:18 2018 +0200
+@@ -360,6 +360,8 @@
+         canonical_os = canonical_kernel = 'NetBSD'
+     elif os.startswith('openbsd'):
+         canonical_os = canonical_kernel = 'OpenBSD'
++    elif os.startswith('solaris'):
++        canonical_os = canonical_kernel = 'SunOS'
+     else:
+         die('Unknown OS: %s' % os)
+ 
+@@ -615,6 +617,13 @@
+ 
+ set_define('XP_LINUX', target_is_linux)
+ 
++@depends(target)
++def target_is_solaris(target):
++    if target.kernel == 'SunOS':
++        return True
++
++set_define('XP_SOLARIS', target_is_solaris)
++
+ # The application/project to build
+ # ==============================================================
+ option('--enable-application', nargs=1, env='MOZ_BUILD_APP',
+diff -r 8d1fa7f8f12b ipc/chromium/chromium-config.mozbuild
+--- a/ipc/chromium/chromium-config.mozbuild	Thu Mar 09 10:50:35 2017 +0800
++++ b/ipc/chromium/chromium-config.mozbuild	Mon Aug 13 20:55:18 2018 +0200
+@@ -41,6 +41,9 @@
+     if CONFIG['OS_ARCH'] == 'Darwin':
+         DEFINES['OS_MACOSX'] = 1
+ 
++    elif CONFIG['OS_ARCH'] == 'SunOS':
++        DEFINES['OS_SOLARIS'] = 1
++
+     elif CONFIG['OS_ARCH'] == 'DragonFly':
+         DEFINES.update({
+             'OS_DRAGONFLY': 1,
+diff -r 8d1fa7f8f12b ipc/chromium/src/build/build_config.h
+--- a/ipc/chromium/src/build/build_config.h	Thu Mar 09 10:50:35 2017 +0800
++++ b/ipc/chromium/src/build/build_config.h	Mon Aug 13 20:55:18 2018 +0200
+@@ -32,6 +32,8 @@
+ #define OS_NETBSD 1
+ #elif defined(__OpenBSD__)
+ #define OS_OPENBSD 1
++#elif defined(__sun__)
++#define OS_SOLARIS 1
+ #elif defined(_WIN32)
+ #define OS_WIN 1
+ #else
+@@ -47,7 +49,7 @@
+ 
+ // For access to standard POSIX features, use OS_POSIX instead of a more
+ // specific macro.
+-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD)
++#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_BSD) || defined(OS_SOLARIS)
+ #define OS_POSIX 1
+ #endif
+ 
+diff -r 8d1fa7f8f12b python/mozbuild/mozbuild/configure/constants.py
+--- a/python/mozbuild/mozbuild/configure/constants.py	Thu Mar 09 10:50:35 2017 +0800
++++ b/python/mozbuild/mozbuild/configure/constants.py	Mon Aug 13 20:55:18 2018 +0200
+@@ -24,6 +24,7 @@
+     'NetBSD',
+     'OpenBSD',
+     'OSX',
++    'SunOS',
+     'WINNT',
+ )
+ 
+@@ -35,6 +36,7 @@
+     'Linux',
+     'NetBSD',
+     'OpenBSD',
++    'SunOS',
+     'WINNT',
+ )
+ 
+@@ -97,6 +99,7 @@
+     'Linux': '__linux__',
+     'NetBSD': '__NetBSD__',
+     'OpenBSD': '__OpenBSD__',
++    'SunOS': '__sun__',
+     'WINNT': '_WIN32 || __CYGWIN__',
+ }
+ 
+diff -r 8d1fa7f8f12b toolkit/crashreporter/moz.build
+--- a/toolkit/crashreporter/moz.build	Thu Mar 09 10:50:35 2017 +0800
++++ b/toolkit/crashreporter/moz.build	Mon Aug 13 20:55:18 2018 +0200
+@@ -96,10 +96,6 @@
+         '/toolkit/crashreporter/google-breakpad/src/common/android/include',
+     ]
+ 
+-if CONFIG['OS_ARCH'] == 'SunOS':
+-    # there's no define for this normally
+-    DEFINES['XP_SOLARIS'] = True
+-
+ DEFINES['UNICODE'] = True
+ DEFINES['_UNICODE'] = True
+ 
+diff -r 8d1fa7f8f12b xpcom/ds/nsMathUtils.h
+--- a/xpcom/ds/nsMathUtils.h	Thu Mar 09 10:50:35 2017 +0800
++++ b/xpcom/ds/nsMathUtils.h	Mon Aug 13 20:55:18 2018 +0200
+@@ -11,7 +11,7 @@
+ #include <cmath>
+ #include <float.h>
+ 
+-#ifdef SOLARIS
++#if defined(XP_SOLARIS)
+ #include <ieeefp.h>
+ #endif
+ 

+ 57 - 0
mozilla-esr52/patches/1356493.patch

@@ -0,0 +1,57 @@
+
+# HG changeset patch
+# User Bob Owen <bobowencode@gmail.com>
+# Date 1500384092 -3600
+# Node ID 2099738eda6f4f5c8f9c84d6c9f1ba02bdb5cf4a
+# Parent  73a5be6013ce71f8ef17792215e4060b4069874a
+Bug 1356493 - Add the SDK version number to the bin path for Windows 10 SDK v10.0.15063.0 and above. r=glandium, a=NPOTB DONTBUILD
+
+This patch also works for the current preview SDK v10.0.16232.0.
+
+diff --git a/build/moz.configure/windows.configure b/build/moz.configure/windows.configure
+--- a/build/moz.configure/windows.configure
++++ b/build/moz.configure/windows.configure
+@@ -358,35 +358,38 @@ def lib_path(target, c_compiler, vc_path
+     os.environ['LIB'] = libs
+     return libs
+ 
+ set_config('LIB', lib_path)
+ 
+ 
+ option(env='MT', nargs=1, help='Path to the Microsoft Manifest Tool')
+ 
+-@depends(valid_windows_sdk_dir)
++@depends(valid_windows_sdk_dir, valid_ucrt_sdk_dir)
+ @imports(_from='os', _import='environ')
+ @imports('platform')
+-def sdk_bin_path(valid_windows_sdk_dir):
++def sdk_bin_path(valid_windows_sdk_dir, valid_ucrt_sdk_dir):
+     if not valid_windows_sdk_dir:
+         return
+ 
+     vc_host = {
+         'x86': 'x86',
+         'AMD64': 'x64',
+     }.get(platform.machine())
+ 
++    # From version 10.0.15063.0 onwards the bin path contains the version number.
++    versioned_bin = ('bin' if valid_ucrt_sdk_dir.version < '10.0.15063.0'
++                     else os.path.join('bin', str(valid_ucrt_sdk_dir.version)))
+     result = [
+         environ['PATH'],
+-        os.path.join(valid_windows_sdk_dir.path, 'bin', vc_host)
++        os.path.join(valid_windows_sdk_dir.path, versioned_bin, vc_host)
+     ]
+     if vc_host == 'x64':
+         result.append(
+-            os.path.join(valid_windows_sdk_dir.path, 'bin', 'x86'))
++            os.path.join(valid_windows_sdk_dir.path, versioned_bin, 'x86'))
+     return result
+ 
+ 
+ mt = check_prog('MT', ('mt.exe',), input='MT',
+                 paths=sdk_bin_path)
+ 
+ 
+ # Check that MT is not something unexpected like "magnetic tape manipulation
+

+ 54 - 0
mozilla-esr52/patches/1358215.patch

@@ -0,0 +1,54 @@
+
+# HG changeset patch
+# User Ted Mielczarek <ted@mielczarek.org>
+# Date 1494273704 14400
+# Node ID 17670f6aeeae11dde7258edecf1373829fca9979
+# Parent  b4ee518bc8793bd0dc789b2413ace547244894e4
+bug 1358215 - add MOZ_PHOTON_ANIMATIONS config var/define, default enabled on nightly. r=chmanchester
+
+MozReview-Commit-ID: JBdo2ppiJOP
+
+diff -r b4ee518bc879 build/moz.configure/init.configure
+--- a/build/moz.configure/init.configure	Tue Apr 11 00:01:32 2017 -0700
++++ b/build/moz.configure/init.configure	Mon Aug 13 21:18:41 2018 +0200
+@@ -699,11 +699,15 @@
+                      is_nightly=is_nightly,
+                      is_release_or_beta=is_release_or_beta)
+ 
++@depends(milestone)
++def is_nightly(milestone):
++    return milestone.is_nightly
++
+ set_config('GRE_MILESTONE', delayed_getattr(milestone, 'version'))
+-set_config('NIGHTLY_BUILD', delayed_getattr(milestone, 'is_nightly'))
+-set_define('NIGHTLY_BUILD', delayed_getattr(milestone, 'is_nightly'))
++set_config('NIGHTLY_BUILD', is_nightly)
++set_define('NIGHTLY_BUILD', is_nightly)
+ add_old_configure_assignment('NIGHTLY_BUILD',
+-                             delayed_getattr(milestone, 'is_nightly'))
++                             is_nightly)
+ set_config('RELEASE_OR_BETA', delayed_getattr(milestone, 'is_release_or_beta'))
+ set_define('RELEASE_OR_BETA', delayed_getattr(milestone, 'is_release_or_beta'))
+ add_old_configure_assignment('RELEASE_OR_BETA',
+diff -r b4ee518bc879 toolkit/moz.configure
+--- a/toolkit/moz.configure	Tue Apr 11 00:01:32 2017 -0700
++++ b/toolkit/moz.configure	Mon Aug 13 21:18:41 2018 +0200
+@@ -509,6 +509,18 @@
+              help='Enable Android History instead of Places',
+              set_as_define=True)
+ 
++option(env='MOZ_PHOTON_ANIMATIONS',
++       help='Enable Photon UI animations',
++       default=is_nightly)
++
++@depends('MOZ_PHOTON_ANIMATIONS')
++def photon_animations(value):
++    if value:
++        return bool(value)
++
++set_config('MOZ_PHOTON_ANIMATIONS', photon_animations)
++set_define('MOZ_PHOTON_ANIMATIONS', photon_animations)
++
+ @depends('MOZ_PLACES', 'MOZ_ANDROID_HISTORY')
+ def check_places_and_android_history(places, android_history):
+     if places and android_history:

+ 32 - 0
mozilla-esr52/patches/1360631.patch

@@ -0,0 +1,32 @@
+
+# HG changeset patch
+# User Frank-Rainer Grahl <frgrahl@gmx.net>
+# Date 1493538000 14400
+# Node ID d338de5e37ecb849f80a27b101a53cce917e6bd6
+# Parent  8528bf8f2ecfa90a451ba3e74c7426a3f3596212
+Bug 1360631 - Fix VS2015 x86 cross compiling using start-shell.bat. r=ted
+
+diff --git a/build/moz.configure/toolchain.configure b/build/moz.configure/toolchain.configure
+--- a/build/moz.configure/toolchain.configure
++++ b/build/moz.configure/toolchain.configure
+@@ -423,17 +423,18 @@ def get_vc_paths(topsrcdir):
+         version = Version(install['installationVersion'])
+         # Skip anything older than VS2015.
+         if version < '14':
+             continue
+         path = install['installationPath']
+ 
+         yield (Version(install['installationVersion']), {
+             'x64': [os.path.join(path, r'VC\bin\amd64')],
+-            'x86': [os.path.join(path, r'VC\bin\amd64_x86')],
++            # The x64->x86 cross toolchain requires DLLs from the native x64 toolchain.
++            'x86': [os.path.join(path, r'VC\bin\amd64_x86'), os.path.join(path, r'VC\bin\amd64')],
+         })
+     # Then VS2017 and newer.
+     for install in vswhere(['-requires', 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64']):
+         path = install['installationPath']
+         tools_version = open(os.path.join(path, r'VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt'), 'rb').read().strip()
+         tools_path = os.path.join(path, r'VC\Tools\MSVC', tools_version, r'bin\HostX64')
+         yield (Version(install['installationVersion']), {
+             'x64': [os.path.join(tools_path, 'x64')],
+

+ 56 - 0
mozilla-esr52/patches/1362303.patch

@@ -0,0 +1,56 @@
+
+# HG changeset patch
+# User Stephen A Pohl <spohl.mozilla.bugs@gmail.com>
+# Date 1520360514 18000
+# Node ID 7a6bc227dc03ad3cfa268cb4b6349d191b46baf5
+# Parent  07fad8b0b417d9ae8580f23d697172a3735b546b
+Bug 1362303: Avoid crashes when dragging on macOS due to failed allocations of large shmem segments. r=glandium
+
+diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp
+--- a/dom/base/nsContentUtils.cpp
++++ b/dom/base/nsContentUtils.cpp
+@@ -8493,16 +8493,17 @@ GetSurfaceDataImpl(mozilla::gfx::DataSou
+   if (!aSurface->Map(mozilla::gfx::DataSourceSurface::MapType::READ, &map)) {
+     return GetSurfaceDataContext::NullValue();
+   }
+ 
+   mozilla::gfx::IntSize size = aSurface->GetSize();
+   mozilla::CheckedInt32 requiredBytes =
+     mozilla::CheckedInt32(map.mStride) * mozilla::CheckedInt32(size.height);
+   if (!requiredBytes.isValid()) {
++    aSurface->Unmap();
+     return GetSurfaceDataContext::NullValue();
+   }
+ 
+   size_t maxBufLen = requiredBytes.value();
+   mozilla::gfx::SurfaceFormat format = aSurface->GetFormat();
+ 
+   // Surface data handling is totally nuts. This is the magic one needs to
+   // know to access the data.
+diff --git a/ipc/glue/SharedMemoryBasic_mach.mm b/ipc/glue/SharedMemoryBasic_mach.mm
+--- a/ipc/glue/SharedMemoryBasic_mach.mm
++++ b/ipc/glue/SharedMemoryBasic_mach.mm
+@@ -547,19 +547,21 @@ SharedMemoryBasic::Create(size_t size)
+   memory_object_size_t memoryObjectSize = round_page(size);
+ 
+   kr = mach_make_memory_entry_64(mach_task_self(),
+                                  &memoryObjectSize,
+                                  address,
+                                  VM_PROT_DEFAULT,
+                                  &mPort,
+                                  MACH_PORT_NULL);
+-  if (kr != KERN_SUCCESS) {
++  if (kr != KERN_SUCCESS || memoryObjectSize < round_page(size)) {
+     LOG_ERROR("Failed to make memory entry (%zu bytes). %s (%x)\n",
+               size, mach_error_string(kr), kr);
++    CloseHandle();
++    mach_vm_deallocate(mach_task_self(), address, round_page(size));
+     return false;
+   }
+ 
+   mMemory = toPointer(address);
+   Mapped(size);
+   return true;
+ }
+ 
+

+ 44 - 0
mozilla-esr52/patches/1362872.patch

@@ -0,0 +1,44 @@
+
+# HG changeset patch
+# User Makoto Kato <m_kato@ga2.so-net.ne.jp>
+# Date 1494225104 -32400
+# Node ID baad8a03819fa6e8f89503826016bb6907dd4740
+# Parent  d20789b15aa721de6ba901db9d37e21274777263
+Bug 1362872 - Use mbcs encoding for vswhere output. r=gps
+
+We add vswhere.exe to support VS2017.  But the description output of this command is localized, so it causes UnicodeDecodeError.
+
+So we should use 'mbcs' encoding for this output on Windows platform. And for minor languages, we should also use replace to avoid decode error.
+
+test_toolchain_configure.py calls vc_compiler_path without correct host.kernel, so we should check current python platform.
+
+
+MozReview-Commit-ID: AkryAzrgSzs
+
+diff --git a/build/moz.configure/toolchain.configure b/build/moz.configure/toolchain.configure
+--- a/build/moz.configure/toolchain.configure
++++ b/build/moz.configure/toolchain.configure
+@@ -408,19 +408,21 @@ def check_compiler(compiler, language, t
+         target_endianness=info.endianness,
+         flags=flags,
+     )
+ 
+ 
+ @imports(_from='__builtin__', _import='open')
+ @imports('json')
+ @imports('subprocess')
++@imports('sys')
+ def get_vc_paths(topsrcdir):
+     def vswhere(args):
+-        return json.loads(subprocess.check_output([os.path.join(topsrcdir, 'build/win32/vswhere.exe'), '-format', 'json'] + args))
++        encoding = 'mbcs' if sys.platform == 'win32' else 'utf-8'
++        return json.loads(subprocess.check_output([os.path.join(topsrcdir, 'build/win32/vswhere.exe'), '-format', 'json'] + args).decode(encoding, 'replace'))
+ 
+     # Can't pass -requires with -legacy, so query each separately.
+     # Legacy versions first (VS2015)
+     for install in vswhere(['-legacy', '-version', '[14.0,15.0)']):
+         version = Version(install['installationVersion'])
+         # Skip anything older than VS2015.
+         if version < '14':
+             continue
+

+ 161 - 0
mozilla-esr52/patches/1363585.patch

@@ -0,0 +1,161 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1494383722 -32400
+# Node ID 044e5f0f2a748b99352374cc29748bda2fa0a33f
+# Parent  05142d06f6e9c84f9a8df2cebcb3cbc9a3bbc7b6
+Bug 1363585 - Forbid boolean operations on @depends functions.  r=chmanchester
+
+Doing something like "not foo" when foo is a @depends function is never
+going to do what the user expects, while not necessarily leading to an
+error (like, when used in set_config).
+
+It is better to have an error in those cases where it's expected not to
+work, at the expense of making templates a little more verbose, rather
+than silently do something the user is not expecting.
+
+diff --git a/build/moz.configure/checks.configure b/build/moz.configure/checks.configure
+--- a/build/moz.configure/checks.configure
++++ b/build/moz.configure/checks.configure
+@@ -90,17 +90,17 @@ def checking(what, callback=None):
+ #   check_prog('PROG', ('a', 'b'))
+ # This will look for 'a' or 'b' in $PATH, and set_config PROG to the one
+ # it can find. If PROG is already set from the environment or command line,
+ # use that value instead.
+ @template
+ @imports(_from='mozbuild.shellutil', _import='quote')
+ def check_prog(var, progs, what=None, input=None, allow_missing=False,
+                paths=None):
+-    if input:
++    if input is not None:
+         # Wrap input with type checking and normalization.
+         @depends(input)
+         def input(value):
+             if not value:
+                 return
+             if isinstance(value, str):
+                 return (value,)
+             if isinstance(value, (tuple, list)) and len(value) == 1:
+diff --git a/build/moz.configure/compile-checks.configure b/build/moz.configure/compile-checks.configure
+--- a/build/moz.configure/compile-checks.configure
++++ b/build/moz.configure/compile-checks.configure
+@@ -40,17 +40,18 @@ def try_compile(includes=None, body='', 
+ #   used.
+ # - `flags` are the flags to be passed to the compiler, in addition to `-c`.
+ # - `includes` are additional includes, as file names, to appear before the
+ #   header checked for.
+ # - `when` is a depends function that if present will make performing the check
+ #   conditional on the value of that function.
+ @template
+ def check_header(header, language='C++', flags=None, includes=None, when=None):
+-    when = when or always
++    if when is None:
++        when = always
+ 
+     if includes:
+         includes = includes[:]
+     else:
+         includes = []
+     includes.append(header)
+ 
+     have_header = try_compile(includes=includes, language=language, flags=flags,
+@@ -92,22 +93,23 @@ def warnings_cxxflags():
+ #   are tested.
+ # - `when` (optional) is a @depends function or option name conditioning
+ #   when the warning flag is wanted.
+ # - `check`, when not set, skips checking whether the flag is supported and
+ #   adds it to the list of warning flags unconditionally. This is only meant
+ #   for add_gcc_warning().
+ @template
+ def check_and_add_gcc_warning(warning, compiler=None, when=None, check=True):
+-    if compiler:
++    if compiler is not None:
+         compilers = (compiler,)
+     else:
+         compilers = (c_compiler, cxx_compiler)
+ 
+-    when = when or always
++    if when is None:
++        when = always
+ 
+     for c in compilers:
+         assert c in (c_compiler, cxx_compiler)
+         lang, warnings_flags = {
+             c_compiler: ('C', warnings_cflags),
+             cxx_compiler: ('C++', warnings_cxxflags),
+         }[c]
+ 
+diff --git a/build/moz.configure/toolchain.configure b/build/moz.configure/toolchain.configure
+--- a/build/moz.configure/toolchain.configure
++++ b/build/moz.configure/toolchain.configure
+@@ -560,19 +560,20 @@ def compiler(language, host_or_target, c
+     When `host_or_target` is `host`, `other_compiler` is the result of the
+     `compiler` template for the same `language` for `target`.
+     When `host_or_target` is `host` and the language is 'C++',
+     `other_c_compiler` is the result of the `compiler` template for the
+     language 'C' for `target`.
+     '''
+     assert host_or_target in (host, target)
+     assert language in ('C', 'C++')
+-    assert language == 'C' or c_compiler
+-    assert host_or_target == target or other_compiler
+-    assert language == 'C' or host_or_target == target or other_c_compiler
++    assert language == 'C' or c_compiler is not None
++    assert host_or_target == target or other_compiler is not None
++    assert language == 'C' or host_or_target == target or \
++        other_c_compiler is not None
+ 
+     host_or_target_str = {
+         host: 'host',
+         target: 'target',
+     }[host_or_target]
+ 
+     var = {
+         ('C', target): 'CC',
+@@ -614,17 +615,20 @@ def compiler(language, host_or_target, c
+     # Derive the host compiler from the corresponding target compiler when no
+     # explicit compiler was given and we're not cross compiling. For the C++
+     # compiler, though, prefer to derive from the host C compiler when it
+     # doesn't match the target C compiler.
+     # As a special case, since clang supports all kinds of targets in the same
+     # executable, when cross compiling with clang, default to the same compiler
+     # as the target compiler, resetting flags.
+     if host_or_target == host:
+-        args = (c_compiler, other_c_compiler) if other_c_compiler else ()
++        if other_c_compiler is not None:
++            args = (c_compiler, other_c_compiler)
++        else:
++            args = ()
+ 
+         @depends(provided_compiler, other_compiler, cross_compiling, *args)
+         def provided_compiler(value, other_compiler, cross_compiling, *args):
+             if value:
+                 return value
+             c_compiler, other_c_compiler = args if args else (None, None)
+             if not cross_compiling and c_compiler == other_c_compiler:
+                 return other_compiler
+diff --git a/python/mozbuild/mozbuild/configure/__init__.py b/python/mozbuild/mozbuild/configure/__init__.py
+--- a/python/mozbuild/mozbuild/configure/__init__.py
++++ b/python/mozbuild/mozbuild/configure/__init__.py
+@@ -52,16 +52,20 @@ class SandboxDependsFunction(object):
+                              % self.__name__)
+ 
+     def __or__(self, other):
+         if not isinstance(other, SandboxDependsFunction):
+             raise ConfigureError('Can only do binary arithmetic operations '
+                                  'with another @depends function.')
+         return self._or(other).sandboxed
+ 
++    def __nonzero__(self):
++        raise ConfigureError(
++            'Cannot do boolean operations on @depends functions.')
++
+ 
+ class DependsFunction(object):
+     __slots__ = (
+         '_func', '_name', 'dependencies', 'when', 'sandboxed', 'sandbox',
+         '_result')
+ 
+     def __init__(self, sandbox, func, dependencies, when=None):
+         assert isinstance(sandbox, ConfigureSandbox)
+

+ 81 - 0
mozilla-esr52/patches/1363811-1.patch

@@ -0,0 +1,81 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1495001382 -32400
+# Node ID fb362996cf3f35784ae240639d15823b931ee39f
+# Parent  8b602649e6737c56519eb2753122696020b8096b
+Bug 1363811 - Change TestConfigure.test_depends_or to test more cases. r=cmanchester+432261
+
+Also, test the results match what a normal "or" of the returned values
+would be. This makes it clearer how the feature is meant to work.
+
+diff --git a/python/mozbuild/mozbuild/test/configure/test_configure.py b/python/mozbuild/mozbuild/test/configure/test_configure.py
+--- a/python/mozbuild/mozbuild/test/configure/test_configure.py
++++ b/python/mozbuild/mozbuild/test/configure/test_configure.py
+@@ -1287,40 +1287,45 @@ class TestConfigure(unittest.TestCase):
+         ''' + moz_configure):
+             self.get_config(['--enable-when'])
+ 
+     def test_depends_or(self):
+         with self.moz_configure('''
+             option('--foo', nargs=1, help='foo')
+             @depends('--foo')
+             def foo(value):
+-                return value or None
++                return value or 0
+ 
+             option('--bar', nargs=1, help='bar')
+             @depends('--bar')
+             def bar(value):
++                return value or ''
++
++            option('--baz', nargs=1, help='baz')
++            @depends('--baz')
++            def baz(value):
+                 return value
+ 
+             set_config('FOOBAR', foo | bar)
++            set_config('FOOBARBAZ', foo | bar | baz)
+         '''):
+-            config = self.get_config()
+-            self.assertEqual(config, {
+-                'FOOBAR': NegativeOptionValue(),
+-            })
+-
+-            config = self.get_config(['--foo=foo'])
+-            self.assertEqual(config, {
+-                'FOOBAR': PositiveOptionValue(('foo',)),
+-            })
+-
+-            config = self.get_config(['--bar=bar'])
+-            self.assertEqual(config, {
+-                'FOOBAR': PositiveOptionValue(('bar',)),
+-            })
+-
+-            config = self.get_config(['--foo=foo', '--bar=bar'])
+-            self.assertEqual(config, {
+-                'FOOBAR': PositiveOptionValue(('foo',)),
+-            })
++            for foo_opt, foo_value in (
++                ('',  0),
++                ('--foo=foo', PositiveOptionValue(('foo',)))
++            ):
++                for bar_opt, bar_value in (
++                    ('', ''),
++                    ('--bar=bar', PositiveOptionValue(('bar',)))
++                ):
++                    for baz_opt, baz_value in (
++                        ('', NegativeOptionValue()),
++                        ('--baz=baz', PositiveOptionValue(('baz',)))
++                    ):
++                        config = self.get_config(
++                            [x for x in (foo_opt, bar_opt, baz_opt) if x])
++                        self.assertEqual(config, {
++                            'FOOBAR': foo_value or bar_value,
++                            'FOOBARBAZ': foo_value or bar_value or baz_value,
++                        })
+ 
+ 
+ if __name__ == '__main__':
+     main()
+

+ 42 - 0
mozilla-esr52/patches/1363811-2.patch

@@ -0,0 +1,42 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1495001808 -32400
+# Node ID aaad9077771908cdebf92459f016407ea846da84
+# Parent  fb362996cf3f35784ae240639d15823b931ee39f
+Bug 1363811 - Modify the name of the DependsFunction.__or__ implementation method. r=cmanchester+432261
+
+Like the test change, it makes the intent clearer.
+
+diff --git a/python/mozbuild/mozbuild/configure/__init__.py b/python/mozbuild/mozbuild/configure/__init__.py
+--- a/python/mozbuild/mozbuild/configure/__init__.py
++++ b/python/mozbuild/mozbuild/configure/__init__.py
+@@ -118,23 +118,23 @@ class DependsFunction(object):
+             ', '.join(repr(d) for d in self.dependencies),
+         )
+ 
+     def __or__(self, other):
+         if isinstance(other, SandboxDependsFunction):
+             other = self.sandbox._depends.get(other)
+         assert isinstance(other, DependsFunction)
+         assert self.sandbox is other.sandbox
+-        return CombinedDependsFunction(self.sandbox, self.first_true,
++        return CombinedDependsFunction(self.sandbox, self.or_impl,
+                                        (self, other))
+ 
+     @staticmethod
+-    def first_true(iterable):
+-        # Like the builtin any(), but returns the first element that is true,
+-        # instead of True. If none are true, returns the last element.
++    def or_impl(iterable):
++        # Applies "or" to all the items of iterable.
++        # e.g. if iterable contains a, b and c, returns `a or b or c`.
+         for i in iterable:
+             if i:
+                 return i
+         return i
+ 
+ 
+ class CombinedDependsFunction(DependsFunction):
+     def __init__(self, sandbox, func, dependencies):
+

+ 148 - 0
mozilla-esr52/patches/1363811-3.patch

@@ -0,0 +1,148 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1495002446 -32400
+# Node ID d517e034c9535cf3444a5ccd19bcf640f2db3b3c
+# Parent  aaad9077771908cdebf92459f016407ea846da84
+Bug 1363811 - Allow to combine two DependsFunctions with "&". r=cmanchester+432261
+
+Similar to how they can be combined with "|", we now allow using "&".
+As for "|", it would have been better if it were "and", but it's not
+possible to override "and" in python ; __and__ is for "&".
+
+diff --git a/python/mozbuild/mozbuild/configure/__init__.py b/python/mozbuild/mozbuild/configure/__init__.py
+--- a/python/mozbuild/mozbuild/configure/__init__.py
++++ b/python/mozbuild/mozbuild/configure/__init__.py
+@@ -41,27 +41,34 @@ import mozpack.path as mozpath
+ class ConfigureError(Exception):
+     pass
+ 
+ 
+ class SandboxDependsFunction(object):
+     '''Sandbox-visible representation of @depends functions.'''
+     def __init__(self, unsandboxed):
+         self._or = unsandboxed.__or__
++        self._and = unsandboxed.__and__
+ 
+     def __call__(self, *arg, **kwargs):
+         raise ConfigureError('The `%s` function may not be called'
+                              % self.__name__)
+ 
+     def __or__(self, other):
+         if not isinstance(other, SandboxDependsFunction):
+             raise ConfigureError('Can only do binary arithmetic operations '
+                                  'with another @depends function.')
+         return self._or(other).sandboxed
+ 
++    def __and__(self, other):
++        if not isinstance(other, SandboxDependsFunction):
++            raise ConfigureError('Can only do binary arithmetic operations '
++                                 'with another @depends function.')
++        return self._and(other).sandboxed
++
+     def __nonzero__(self):
+         raise ConfigureError(
+             'Cannot do boolean operations on @depends functions.')
+ 
+ 
+ class DependsFunction(object):
+     __slots__ = (
+         '_func', '_name', 'dependencies', 'when', 'sandboxed', 'sandbox',
+@@ -130,16 +137,33 @@ class DependsFunction(object):
+     def or_impl(iterable):
+         # Applies "or" to all the items of iterable.
+         # e.g. if iterable contains a, b and c, returns `a or b or c`.
+         for i in iterable:
+             if i:
+                 return i
+         return i
+ 
++    def __and__(self, other):
++        if isinstance(other, SandboxDependsFunction):
++            other = self.sandbox._depends.get(other)
++        assert isinstance(other, DependsFunction)
++        assert self.sandbox is other.sandbox
++        return CombinedDependsFunction(self.sandbox, self.and_impl,
++                                       (self, other))
++
++    @staticmethod
++    def and_impl(iterable):
++        # Applies "and" to all the items of iterable.
++        # e.g. if iterable contains a, b and c, returns `a and b and c`.
++        for i in iterable:
++            if not i:
++                return i
++        return i
++
+ 
+ class CombinedDependsFunction(DependsFunction):
+     def __init__(self, sandbox, func, dependencies):
+         flatten_deps = []
+         for d in dependencies:
+             if isinstance(d, CombinedDependsFunction) and d._func is func:
+                 for d2 in d.dependencies:
+                     if d2 not in flatten_deps:
+diff --git a/python/mozbuild/mozbuild/test/configure/test_configure.py b/python/mozbuild/mozbuild/test/configure/test_configure.py
+--- a/python/mozbuild/mozbuild/test/configure/test_configure.py
++++ b/python/mozbuild/mozbuild/test/configure/test_configure.py
+@@ -1282,50 +1282,54 @@ class TestConfigure(unittest.TestCase):
+                               '--foo is not available in this configuration')
+ 
+         # And similarly doesn't fail when the condition is true.
+         with self.moz_configure('''
+             imply_option('--foo', True)
+         ''' + moz_configure):
+             self.get_config(['--enable-when'])
+ 
+-    def test_depends_or(self):
++    def test_depends_binary_ops(self):
+         with self.moz_configure('''
+             option('--foo', nargs=1, help='foo')
+             @depends('--foo')
+             def foo(value):
+                 return value or 0
+ 
+             option('--bar', nargs=1, help='bar')
+             @depends('--bar')
+             def bar(value):
+                 return value or ''
+ 
+             option('--baz', nargs=1, help='baz')
+             @depends('--baz')
+             def baz(value):
+                 return value
+ 
+-            set_config('FOOBAR', foo | bar)
+-            set_config('FOOBARBAZ', foo | bar | baz)
++            set_config('FOOorBAR', foo | bar)
++            set_config('FOOorBARorBAZ', foo | bar | baz)
++            set_config('FOOandBAR', foo & bar)
++            set_config('FOOandBARandBAZ', foo & bar & baz)
+         '''):
+             for foo_opt, foo_value in (
+                 ('',  0),
+                 ('--foo=foo', PositiveOptionValue(('foo',)))
+             ):
+                 for bar_opt, bar_value in (
+                     ('', ''),
+                     ('--bar=bar', PositiveOptionValue(('bar',)))
+                 ):
+                     for baz_opt, baz_value in (
+                         ('', NegativeOptionValue()),
+                         ('--baz=baz', PositiveOptionValue(('baz',)))
+                     ):
+                         config = self.get_config(
+                             [x for x in (foo_opt, bar_opt, baz_opt) if x])
+                         self.assertEqual(config, {
+-                            'FOOBAR': foo_value or bar_value,
+-                            'FOOBARBAZ': foo_value or bar_value or baz_value,
++                            'FOOorBAR': foo_value or bar_value,
++                            'FOOorBARorBAZ': foo_value or bar_value or baz_value,
++                            'FOOandBAR': foo_value and bar_value,
++                            'FOOandBARandBAZ': foo_value and bar_value and baz_value,
+                         })
+ 
+ 
+ if __name__ == '__main__':
+     main()
+

+ 191 - 0
mozilla-esr52/patches/1363811-4.patch

@@ -0,0 +1,191 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1495004941 -32400
+# Node ID 01aa12b787b2b5851462f0e37cc9866cffe7f180
+# Parent  d517e034c9535cf3444a5ccd19bcf640f2db3b3c
+Bug 1363811 - Allow "direct" access to namespace attributes from DependsFunctions. r=cmanchester+432261
+
+To make things simpler in configure code, as well as to allow the linter
+to skip bugging about some --help dependencies, we make the following
+work:
+
+    something.some_attr
+
+where the result is equivalent to, currently:
+
+    delayed_getattr(something, 'some_attr')
+
+diff --git a/python/mozbuild/mozbuild/configure/__init__.py b/python/mozbuild/mozbuild/configure/__init__.py
+--- a/python/mozbuild/mozbuild/configure/__init__.py
++++ b/python/mozbuild/mozbuild/configure/__init__.py
+@@ -42,16 +42,17 @@ class ConfigureError(Exception):
+     pass
+ 
+ 
+ class SandboxDependsFunction(object):
+     '''Sandbox-visible representation of @depends functions.'''
+     def __init__(self, unsandboxed):
+         self._or = unsandboxed.__or__
+         self._and = unsandboxed.__and__
++        self._getattr = unsandboxed.__getattr__
+ 
+     def __call__(self, *arg, **kwargs):
+         raise ConfigureError('The `%s` function may not be called'
+                              % self.__name__)
+ 
+     def __or__(self, other):
+         if not isinstance(other, SandboxDependsFunction):
+             raise ConfigureError('Can only do binary arithmetic operations '
+@@ -59,16 +60,19 @@ class SandboxDependsFunction(object):
+         return self._or(other).sandboxed
+ 
+     def __and__(self, other):
+         if not isinstance(other, SandboxDependsFunction):
+             raise ConfigureError('Can only do binary arithmetic operations '
+                                  'with another @depends function.')
+         return self._and(other).sandboxed
+ 
++    def __getattr__(self, key):
++        return self._getattr(key).sandboxed
++
+     def __nonzero__(self):
+         raise ConfigureError(
+             'Cannot do boolean operations on @depends functions.')
+ 
+ 
+ class DependsFunction(object):
+     __slots__ = (
+         '_func', '_name', 'dependencies', 'when', 'sandboxed', 'sandbox',
+@@ -154,16 +158,29 @@ class DependsFunction(object):
+     def and_impl(iterable):
+         # Applies "and" to all the items of iterable.
+         # e.g. if iterable contains a, b and c, returns `a and b and c`.
+         for i in iterable:
+             if not i:
+                 return i
+         return i
+ 
++    def __getattr__(self, key):
++        if key.startswith('_'):
++            return super(DependsFunction, self).__getattr__(key)
++        # Our function may return None or an object that simply doesn't have
++        # the wanted key. In that case, just return None.
++        return TrivialDependsFunction(
++            self.sandbox, lambda x: getattr(x, key, None), [self], self.when)
++
++
++class TrivialDependsFunction(DependsFunction):
++    '''Like a DependsFunction, but the linter won't expect it to have a
++    dependency on --help ever.'''
++
+ 
+ class CombinedDependsFunction(DependsFunction):
+     def __init__(self, sandbox, func, dependencies):
+         flatten_deps = []
+         for d in dependencies:
+             if isinstance(d, CombinedDependsFunction) and d._func is func:
+                 for d2 in d.dependencies:
+                     if d2 not in flatten_deps:
+diff --git a/python/mozbuild/mozbuild/configure/lint.py b/python/mozbuild/mozbuild/configure/lint.py
+--- a/python/mozbuild/mozbuild/configure/lint.py
++++ b/python/mozbuild/mozbuild/configure/lint.py
+@@ -8,16 +8,17 @@ import inspect
+ from functools import wraps
+ from StringIO import StringIO
+ from . import (
+     CombinedDependsFunction,
+     ConfigureError,
+     ConfigureSandbox,
+     DependsFunction,
+     SandboxedGlobal,
++    TrivialDependsFunction,
+ )
+ from .lint_util import disassemble_as_iter
+ from mozbuild.util import memoize
+ 
+ 
+ class LintSandbox(ConfigureSandbox):
+     def __init__(self, environ=None, argv=None, stdout=None, stderr=None):
+         out = StringIO()
+@@ -69,17 +70,17 @@ class LintSandbox(ConfigureSandbox):
+                     else:
+                         dep = dep.option
+                     raise ConfigureError(
+                         '%s: The dependency on `%s` is unused.'
+                         % (loc, dep)
+                     )
+ 
+     def _missing_help_dependency(self, obj):
+-        if isinstance(obj, CombinedDependsFunction):
++        if isinstance(obj, (CombinedDependsFunction, TrivialDependsFunction)):
+             return False
+         if isinstance(obj, DependsFunction):
+             if (self._help_option in obj.dependencies or
+                 obj in (self._always, self._never)):
+                 return False
+             func, glob = self.unwrap(obj._func)
+             # We allow missing --help dependencies for functions that:
+             # - don't use @imports
+diff --git a/python/mozbuild/mozbuild/test/configure/test_configure.py b/python/mozbuild/mozbuild/test/configure/test_configure.py
+--- a/python/mozbuild/mozbuild/test/configure/test_configure.py
++++ b/python/mozbuild/mozbuild/test/configure/test_configure.py
+@@ -1325,11 +1325,57 @@ class TestConfigure(unittest.TestCase):
+                             [x for x in (foo_opt, bar_opt, baz_opt) if x])
+                         self.assertEqual(config, {
+                             'FOOorBAR': foo_value or bar_value,
+                             'FOOorBARorBAZ': foo_value or bar_value or baz_value,
+                             'FOOandBAR': foo_value and bar_value,
+                             'FOOandBARandBAZ': foo_value and bar_value and baz_value,
+                         })
+ 
++    def test_depends_getattr(self):
++        with self.moz_configure('''
++            @imports(_from='mozbuild.util', _import='ReadOnlyNamespace')
++            def namespace(**kwargs):
++                return ReadOnlyNamespace(**kwargs)
++
++            option('--foo', nargs=1, help='foo')
++            @depends('--foo')
++            def foo(value):
++                return value
++
++            option('--bar', nargs=1, help='bar')
++            @depends('--bar')
++            def bar(value):
++                return value or None
++
++            @depends(foo, bar)
++            def foobar(foo, bar):
++                return namespace(foo=foo, bar=bar)
++
++            set_config('FOO', foobar.foo)
++            set_config('BAR', foobar.bar)
++            set_config('BAZ', foobar.baz)
++        '''):
++            config = self.get_config()
++            self.assertEqual(config, {
++                'FOO': NegativeOptionValue(),
++            })
++
++            config = self.get_config(['--foo=foo'])
++            self.assertEqual(config, {
++                'FOO': PositiveOptionValue(('foo',)),
++            })
++
++            config = self.get_config(['--bar=bar'])
++            self.assertEqual(config, {
++                'FOO': NegativeOptionValue(),
++                'BAR': PositiveOptionValue(('bar',)),
++            })
++
++            config = self.get_config(['--foo=foo', '--bar=bar'])
++            self.assertEqual(config, {
++                'FOO': PositiveOptionValue(('foo',)),
++                'BAR': PositiveOptionValue(('bar',)),
++            })
++
+ 
+ if __name__ == '__main__':
+     main()
+

+ 264 - 0
mozilla-esr52/patches/1363811-5.patch

@@ -0,0 +1,264 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1495005214 -32400
+# Node ID 6d99c685aea3eb5433729a7ac9b5d2c63b6a1d5b
+# Parent  34fba311fd700b2b1598f6ccb3295aaa57721a17
+Bug 1363811 - Replace all uses of delayed_getattr(a, 'b') with a.b. r=cmanchester+432261
+
+And remove delayed_getattr.
+
+diff -r 34fba311fd70 build/moz.configure/init.configure
+--- a/build/moz.configure/init.configure	Wed May 17 16:09:01 2017 +0900
++++ b/build/moz.configure/init.configure	Mon Aug 13 21:22:00 2018 +0200
+@@ -65,20 +65,19 @@
+ 
+     return result
+ 
+-set_config('TOPSRCDIR', delayed_getattr(check_build_environment, 'topsrcdir'))
+-set_config('TOPOBJDIR', delayed_getattr(check_build_environment, 'topobjdir'))
+-set_config('MOZ_BUILD_ROOT', delayed_getattr(check_build_environment,
+-                                             'topobjdir'))
+-set_config('DIST', delayed_getattr(check_build_environment, 'dist'))
++set_config('TOPSRCDIR', check_build_environment.topsrcdir)
++set_config('TOPOBJDIR', check_build_environment.topobjdir)
++set_config('MOZ_BUILD_ROOT', check_build_environment.topobjdir)
++set_config('DIST', check_build_environment.dist)
+ 
+ add_old_configure_assignment(
+-    '_topsrcdir', delayed_getattr(check_build_environment, 'topsrcdir'))
++    '_topsrcdir', check_build_environment.topsrcdir)
+ add_old_configure_assignment(
+-    '_objdir', delayed_getattr(check_build_environment, 'topobjdir'))
++    '_objdir', check_build_environment.topobjdir)
+ add_old_configure_assignment(
+-    'MOZ_BUILD_ROOT', delayed_getattr(check_build_environment, 'topobjdir'))
++    'MOZ_BUILD_ROOT', check_build_environment.topobjdir)
+ add_old_configure_assignment(
+-    'DIST', delayed_getattr(check_build_environment, 'dist'))
++    'DIST', check_build_environment.dist)
+ 
+ option(env='MOZ_AUTOMATION', help='Enable options for automated builds')
+ set_config('MOZ_AUTOMATION', depends_if('MOZ_AUTOMATION')(lambda x: True))
+@@ -540,21 +539,20 @@
+         INTEL_ARCHITECTURE=target.cpu in ('x86', 'x86_64') or None,
+     )
+ 
+-set_config('OS_TARGET', delayed_getattr(target_variables, 'OS_TARGET'))
++set_config('OS_TARGET', target_variables.OS_TARGET)
+ add_old_configure_assignment('OS_TARGET',
+-                             delayed_getattr(target_variables, 'OS_TARGET'))
+-set_config('OS_ARCH', delayed_getattr(target_variables, 'OS_ARCH'))
++                             target_variables.OS_TARGET)
++set_config('OS_ARCH', target_variables.OS_ARCH)
+ add_old_configure_assignment('OS_ARCH',
+-                             delayed_getattr(target_variables, 'OS_ARCH'))
+-set_config('OS_TEST', delayed_getattr(target_variables, 'OS_TEST'))
++                             target_variables.OS_ARCH)
++set_config('OS_TEST', target_variables.OS_TEST)
+ add_old_configure_assignment('OS_TEST',
+-                             delayed_getattr(target_variables, 'OS_TEST'))
+-set_config('CPU_ARCH', delayed_getattr(target, 'cpu'))
+-add_old_configure_assignment('CPU_ARCH', delayed_getattr(target, 'cpu'))
+-set_config('INTEL_ARCHITECTURE', delayed_getattr(target_variables,
+-                                                 'INTEL_ARCHITECTURE'))
+-set_config('TARGET_CPU', delayed_getattr(target, 'raw_cpu'))
+-set_config('TARGET_OS', delayed_getattr(target, 'raw_os'))
++                             target_variables.OS_TEST)
++set_config('CPU_ARCH', target.cpu)
++add_old_configure_assignment('CPU_ARCH', target.cpu)
++set_config('INTEL_ARCHITECTURE', target_variables.INTEL_ARCHITECTURE)
++set_config('TARGET_CPU', target.raw_cpu)
++set_config('TARGET_OS', target.raw_os)
+ 
+ 
+ @depends(host)
+@@ -567,10 +565,10 @@
+         HOST_OS_ARCH=os_arch,
+     )
+ 
+-set_config('HOST_CPU_ARCH', delayed_getattr(host, 'cpu'))
+-set_config('HOST_OS_ARCH', delayed_getattr(host_variables, 'HOST_OS_ARCH'))
++set_config('HOST_CPU_ARCH', host.cpu)
++set_config('HOST_OS_ARCH', host_variables.HOST_OS_ARCH)
+ add_old_configure_assignment('HOST_OS_ARCH',
+-                             delayed_getattr(host_variables, 'HOST_OS_ARCH'))
++                             host_variables.HOST_OS_ARCH)
+ 
+ @depends(target)
+ def target_is_windows(target):
+@@ -703,15 +701,15 @@
+ def is_nightly(milestone):
+     return milestone.is_nightly
+ 
+-set_config('GRE_MILESTONE', delayed_getattr(milestone, 'version'))
++set_config('GRE_MILESTONE', milestone.version)
+ set_config('NIGHTLY_BUILD', is_nightly)
+ set_define('NIGHTLY_BUILD', is_nightly)
+ add_old_configure_assignment('NIGHTLY_BUILD',
+                              is_nightly)
+-set_config('RELEASE_OR_BETA', delayed_getattr(milestone, 'is_release_or_beta'))
+-set_define('RELEASE_OR_BETA', delayed_getattr(milestone, 'is_release_or_beta'))
++set_config('RELEASE_OR_BETA', milestone.is_release_or_beta)
++set_define('RELEASE_OR_BETA', milestone.is_release_or_beta)
+ add_old_configure_assignment('RELEASE_OR_BETA',
+-                             delayed_getattr(milestone, 'is_release_or_beta'))
++                             milestone.is_release_or_beta)
+ 
+ # The app update channel is 'default' when not supplied. The value is used in
+ # the application's confvars.sh (and is made available to a project specific
+diff -r 34fba311fd70 build/moz.configure/keyfiles.configure
+--- a/build/moz.configure/keyfiles.configure	Wed May 17 16:09:01 2017 +0900
++++ b/build/moz.configure/keyfiles.configure	Mon Aug 13 21:22:00 2018 +0200
+@@ -64,5 +64,5 @@
+ 
+ 
+     name = desc.upper().replace(' ', '_')
+-    set_config('MOZ_%s_CLIENTID' % name, delayed_getattr(content, 'id'))
+-    set_config('MOZ_%s_KEY' % name, delayed_getattr(content, 'secret'))
++    set_config('MOZ_%s_CLIENTID' % name, content.id)
++    set_config('MOZ_%s_KEY' % name, content.secret)
+diff -r 34fba311fd70 build/moz.configure/toolchain.configure
+--- a/build/moz.configure/toolchain.configure	Wed May 17 16:09:01 2017 +0900
++++ b/build/moz.configure/toolchain.configure	Mon Aug 13 21:22:00 2018 +0200
+@@ -27,9 +27,9 @@
+ # Until we move all the yasm consumers out of old-configure.
+ # bug 1257904
+ add_old_configure_assignment('_YASM_MAJOR_VERSION',
+-                             delayed_getattr(yasm_version, 'major'))
++                             yasm_version.major)
+ add_old_configure_assignment('_YASM_MINOR_VERSION',
+-                             delayed_getattr(yasm_version, 'minor'))
++                             yasm_version.minor)
+ 
+ @depends(yasm, target)
+ def yasm_asflags(yasm, target):
+@@ -606,7 +606,7 @@
+     # result from check_prog as CC/CXX/HOST_CC/HOST_CXX and b) have to let
+     # old-configure AC_SUBST it (because it's autoconf doing it, not us)
+     compiler = check_prog('_%s' % var, what=what, progs=default_compilers,
+-                          input=delayed_getattr(provided_compiler, 'compiler'),
++                          input=provided_compiler.compiler,
+                           paths=toolchain_search_path)
+ 
+     @depends(compiler, provided_compiler, compiler_wrapper, host_or_target)
+@@ -752,11 +752,11 @@
+     # old-configure to do some of its still existing checks.
+     if language == 'C':
+         set_config(
+-            '%s_TYPE' % var, delayed_getattr(valid_compiler, 'type'))
++            '%s_TYPE' % var, valid_compiler.type)
+         add_old_configure_assignment(
+-            '%s_TYPE' % var, delayed_getattr(valid_compiler, 'type'))
++            '%s_TYPE' % var, valid_compiler.type)
+         add_old_configure_assignment(
+-            '%s_VERSION' % var, delayed_getattr(valid_compiler, 'version'))
++            '%s_VERSION' % var, valid_compiler.version)
+ 
+     valid_compiler = compiler_class(valid_compiler)
+ 
+diff -r 34fba311fd70 build/moz.configure/util.configure
+--- a/build/moz.configure/util.configure	Wed May 17 16:09:01 2017 +0900
++++ b/build/moz.configure/util.configure	Mon Aug 13 21:22:00 2018 +0200
+@@ -366,27 +366,6 @@
+ never = dependable(False)
+ 
+ 
+-# Some @depends function return namespaces, and one could want to use one
+-# specific attribute from such a namespace as a "value" given to functions
+-# such as `set_config`. But those functions do not take immediate values.
+-# The `delayed_getattr` function allows access to attributes from the result
+-# of a @depends function in a non-immediate manner.
+-#   @depends('--option')
+-#   def option(value)
+-#       return namespace(foo=value)
+-#   set_config('FOO', delayed_getattr(option, 'foo')
+-@template
+-def delayed_getattr(func, key):
+-    @depends(func)
+-    def result(value):
+-        # The @depends function we're being passed may have returned
+-        # None, or an object that simply doesn't have the wanted key.
+-        # In that case, just return None.
+-        return getattr(value, key, None)
+-
+-    return result
+-
+-
+ # Like @depends, but the decorated function is only called if one of the
+ # arguments it would be called with has a positive value (bool(value) is True)
+ @template
+diff -r 34fba311fd70 build/moz.configure/windows.configure
+--- a/build/moz.configure/windows.configure	Wed May 17 16:09:01 2017 +0900
++++ b/build/moz.configure/windows.configure	Mon Aug 13 21:22:00 2018 +0200
+@@ -153,7 +153,7 @@
+ 
+ add_old_configure_assignment(
+     'WINDOWSSDKDIR',
+-    delayed_getattr(valid_windows_sdk_dir, 'path'))
++    valid_windows_sdk_dir.path)
+ add_old_configure_assignment(
+     'MOZ_WINSDK_MAXVER',
+     depends(valid_windows_sdk_dir)(
+diff -r 34fba311fd70 js/ffi.configure
+--- a/js/ffi.configure	Wed May 17 16:09:01 2017 +0900
++++ b/js/ffi.configure	Mon Aug 13 21:22:00 2018 +0200
+@@ -56,5 +56,5 @@
+         dir=target_dir
+     )
+ 
+-set_config('FFI_TARGET', delayed_getattr(ffi_target, 'name'))
+-set_config('FFI_TARGET_DIR', delayed_getattr(ffi_target, 'dir'))
++set_config('FFI_TARGET', ffi_target.name)
++set_config('FFI_TARGET_DIR', ffi_target.dir)
+diff -r 34fba311fd70 moz.configure
+--- a/moz.configure	Wed May 17 16:09:01 2017 +0900
++++ b/moz.configure	Mon Aug 13 21:22:00 2018 +0200
+@@ -89,11 +89,11 @@
+                          has_clone='0')
+ 
+ set_define('GTEST_OS_LINUX_ANDROID',
+-           delayed_getattr(linux_gtest_defines, 'os_linux_android'))
++           linux_gtest_defines.os_linux_android)
+ set_define('GTEST_USE_OWN_TR1_TUPLE',
+-           delayed_getattr(linux_gtest_defines, 'use_own_tr1_tuple'))
++           linux_gtest_defines.use_own_tr1_tuple)
+ set_define('GTEST_HAS_CLONE',
+-           delayed_getattr(linux_gtest_defines, 'has_clone'))
++           linux_gtest_defines.has_clone)
+ 
+ js_option('--enable-debug',
+           nargs='?',
+@@ -258,11 +258,11 @@
+     if target.os == 'GNU' and target.kernel == 'Linux':
+         return namespace(RPMBUILD=('rpmbuild',))
+ 
+-check_prog('DSYMUTIL', delayed_getattr(extra_programs, 'DSYMUTIL'),
++check_prog('DSYMUTIL', extra_programs.DSYMUTIL,
+            allow_missing=True)
+-check_prog('GENISOIMAGE', delayed_getattr(extra_programs, 'GENISOIMAGE'),
++check_prog('GENISOIMAGE', extra_programs.GENISOIMAGE,
+            allow_missing=True)
+-check_prog('RPMBUILD', delayed_getattr(extra_programs, 'RPMBUILD'),
++check_prog('RPMBUILD', extra_programs.RPMBUILD,
+            allow_missing=True)
+ 
+ option('--enable-system-hunspell',
+diff -r 34fba311fd70 toolkit/moz.configure
+--- a/toolkit/moz.configure	Wed May 17 16:09:01 2017 +0900
++++ b/toolkit/moz.configure	Mon Aug 13 21:22:00 2018 +0200
+@@ -332,11 +332,11 @@
+     if freetype2_combined_info:
+         return freetype2_combined_info
+ 
+-set_config('FT2_LIBS', delayed_getattr(ft2_info, 'libs'))
++set_config('FT2_LIBS', ft2_info.libs)
+ add_old_configure_assignment('FT2_LIBS',
+-                             delayed_getattr(ft2_info, 'libs'))
++                             ft2_info.libs)
+ add_old_configure_assignment('FT2_CFLAGS',
+-                             delayed_getattr(ft2_info, 'cflags'))
++                             ft2_info.cflags)
+ 
+ # Apple platform decoder support
+ # ==============================================================

+ 56 - 0
mozilla-esr52/patches/1363811-6.patch

@@ -0,0 +1,56 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1495010005 -32400
+# Node ID d4687badde12c0a092199c1f016906aebea1e5df
+# Parent  80840e846c7ddcc384f709910e1e28ab9e48a447
+Bug 1363811 - Replace is_nightly with milestone.is_nightly. r=cmanchester+432261
+
+And remove is_nightly.
+
+diff -r 80840e846c7d build/moz.configure/init.configure
+--- a/build/moz.configure/init.configure	Wed May 17 16:13:34 2017 +0900
++++ b/build/moz.configure/init.configure	Mon Aug 13 21:27:20 2018 +0200
+@@ -697,15 +697,10 @@
+                      is_nightly=is_nightly,
+                      is_release_or_beta=is_release_or_beta)
+ 
+-@depends(milestone)
+-def is_nightly(milestone):
+-    return milestone.is_nightly
+-
+ set_config('GRE_MILESTONE', milestone.version)
+-set_config('NIGHTLY_BUILD', is_nightly)
+-set_define('NIGHTLY_BUILD', is_nightly)
+-add_old_configure_assignment('NIGHTLY_BUILD',
+-                             is_nightly)
++set_config('NIGHTLY_BUILD', milestone.is_nightly)
++set_define('NIGHTLY_BUILD', milestone.is_nightly)
++add_old_configure_assignment('NIGHTLY_BUILD', milestone.is_nightly)
+ set_config('RELEASE_OR_BETA', milestone.is_release_or_beta)
+ set_define('RELEASE_OR_BETA', milestone.is_release_or_beta)
+ add_old_configure_assignment('RELEASE_OR_BETA',
+diff -r 80840e846c7d mobile/android/moz.configure
+--- a/mobile/android/moz.configure	Wed May 17 16:13:34 2017 +0900
++++ b/mobile/android/moz.configure	Mon Aug 13 21:27:20 2018 +0200
+@@ -39,7 +39,7 @@
+ 
+ project_flag('MOZ_ANDROID_CUSTOM_TABS',
+              help='Enable support for Android custom tabs',
+-             default=delayed_getattr(milestone, 'is_nightly'))
++             default=milestone.is_nightly)
+ 
+ # Enable the Switchboard A/B framework code.
+ # Note: The framework is always included in the app. This flag controls
+diff -r 80840e846c7d toolkit/moz.configure
+--- a/toolkit/moz.configure	Wed May 17 16:13:34 2017 +0900
++++ b/toolkit/moz.configure	Mon Aug 13 21:27:20 2018 +0200
+@@ -511,7 +511,7 @@
+ 
+ option(env='MOZ_PHOTON_ANIMATIONS',
+        help='Enable Photon UI animations',
+-       default=is_nightly)
++       default=milestone.is_nightly)
+ 
+ @depends('MOZ_PHOTON_ANIMATIONS')
+ def photon_animations(value):

+ 185 - 0
mozilla-esr52/patches/1364137.patch

@@ -0,0 +1,185 @@
+
+# HG changeset patch
+# User Bob Owen <bobowencode@gmail.com>
+# Date 1500719544 -3600
+# Node ID c2635cb28a2fb7de2bb03e85a3706cbe78f196b5
+# Parent  436dee8a429bc210409a2af030d24c186a8d6eac
+Bug 1364137 - Get both 32-bit and 64-bit registry values when searching for the Windows SDK. r=glandium, a=NPOTB
+
+The values that we need to find in the registry can be inconsistent across
+different installations, so we retrieve values from both views in our search
+for a valid SDK. This also ensures this works for 32-bit and 64-bit python.
+
+diff --git a/build/moz.configure/util.configure b/build/moz.configure/util.configure
+--- a/build/moz.configure/util.configure
++++ b/build/moz.configure/util.configure
+@@ -219,103 +219,124 @@ def unique_list(l):
+ # Windows.
+ # The `pattern` argument is a string starting with HKEY_ and giving the full
+ # "path" of the registry key to get the value for, with backslash separators.
+ # The string can contains wildcards ('*').
+ # The result of this functions is an enumerator yielding tuples for each
+ # match. Each of these tuples contains the key name matching wildcards
+ # followed by the value.
+ #
++# The `get_32_and_64_bit` argument is a boolean, if True then it will return the
++# values from the 32-bit and 64-bit registry views. This defaults to False,
++# which will return the view depending on the bitness of python.
++#
+ # Examples:
+ #   get_registry_values(r'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\'
+ #                       r'Windows Kits\Installed Roots\KitsRoot*')
+ #   yields e.g.:
+ #     ('KitsRoot81', r'C:\Program Files (x86)\Windows Kits\8.1\')
+ #     ('KitsRoot10', r'C:\Program Files (x86)\Windows Kits\10\')
+ #
+ #   get_registry_values(r'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\'
+ #                       r'Windows Kits\Installed Roots\KitsRoot8.1')
+ #   yields e.g.:
+ #     (r'C:\Program Files (x86)\Windows Kits\8.1\',)
+ #
+ #   get_registry_values(r'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\'
++#                       r'Windows Kits\Installed Roots\KitsRoot8.1',
++#                       get_32_and_64_bit=True)
++#   yields e.g.:
++#     (r'C:\Program Files (x86)\Windows Kits\8.1\',)
++#     (r'C:\Program Files\Windows Kits\8.1\',)
++#
++#   get_registry_values(r'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\'
+ #                       r'Windows Kits\*\KitsRoot*')
+ #   yields e.g.:
+ #     ('Installed Roots', 'KitsRoot81',
+ #      r'C:\Program Files (x86)\Windows Kits\8.1\')
+ #     ('Installed Roots', 'KitsRoot10',
+ #      r'C:\Program Files (x86)\Windows Kits\10\')
+ #
+ #   get_registry_values(r'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\'
+ #                       r'VisualStudio\VC\*\x86\*\Compiler')
+ #   yields e.g.:
+ #     ('19.0', 'arm', r'C:\...\amd64_arm\cl.exe')
+ #     ('19.0', 'x64', r'C:\...\amd64\cl.exe')
+ #     ('19.0', 'x86', r'C:\...\amd64_x86\cl.exe')
+ @imports(_import='_winreg', _as='winreg')
+ @imports(_from='__builtin__', _import='WindowsError')
+ @imports(_from='fnmatch', _import='fnmatch')
+-def get_registry_values(pattern):
++def get_registry_values(pattern, get_32_and_64_bit=False):
+     def enum_helper(func, key):
+         i = 0
+         while True:
+             try:
+                 yield func(key, i)
+             except WindowsError:
+                 break
+             i += 1
+ 
+-    def get_keys(key, pattern):
++    def get_keys(key, pattern, access_mask):
+         try:
+-            s = winreg.OpenKey(key, '\\'.join(pattern[:-1]))
++            s = winreg.OpenKey(key, '\\'.join(pattern[:-1]), 0, access_mask)
+         except WindowsError:
+             return
+         for k in enum_helper(winreg.EnumKey, s):
+             if fnmatch(k, pattern[-1]):
+                 try:
+-                    yield k, winreg.OpenKey(s, k)
++                    yield k, winreg.OpenKey(s, k, 0, access_mask)
+                 except WindowsError:
+                     pass
+ 
+-    def get_values(key, pattern):
++    def get_values(key, pattern, access_mask):
+         try:
+-            s = winreg.OpenKey(key, '\\'.join(pattern[:-1]))
++            s = winreg.OpenKey(key, '\\'.join(pattern[:-1]), 0, access_mask)
+         except WindowsError:
+             return
+         for k, v, t in enum_helper(winreg.EnumValue, s):
+             if fnmatch(k, pattern[-1]):
+                 yield k, v
+ 
+     def split_pattern(pattern):
+         subpattern = []
+         for p in pattern:
+             subpattern.append(p)
+             if '*' in p:
+                 yield subpattern
+                 subpattern = []
+         if subpattern:
+             yield subpattern
+ 
++    def get_all_values(keys, pattern, access_mask):
++        for i, p in enumerate(pattern):
++            next_keys = []
++            for base_key in keys:
++                matches = base_key[:-1]
++                base_key = base_key[-1]
++                if i == len(pattern) - 1:
++                    want_name = '*' in p[-1]
++                    for name, value in get_values(base_key, p, access_mask):
++                        yield matches + ((name, value) if want_name else (value,))
++                else:
++                    for name, k in get_keys(base_key, p, access_mask):
++                        next_keys.append(matches + (name, k))
++            keys = next_keys
++
+     pattern = pattern.split('\\')
+     assert pattern[0].startswith('HKEY_')
+     keys = [(getattr(winreg, pattern[0]),)]
+     pattern = list(split_pattern(pattern[1:]))
+-    for i, p in enumerate(pattern):
+-        next_keys = []
+-        for base_key in keys:
+-            matches = base_key[:-1]
+-            base_key = base_key[-1]
+-            if i == len(pattern) - 1:
+-                want_name = '*' in p[-1]
+-                for name, value in get_values(base_key, p):
+-                    yield matches + ((name, value) if want_name else (value,))
+-            else:
+-                for name, k in get_keys(base_key, p):
+-                    next_keys.append(matches + (name, k))
+-        keys = next_keys
++    if get_32_and_64_bit:
++        for match in get_all_values(keys, pattern, winreg.KEY_READ | winreg.KEY_WOW64_32KEY):
++            yield match
++        for match in get_all_values(keys, pattern, winreg.KEY_READ | winreg.KEY_WOW64_64KEY):
++            yield match
++    else:
++        for match in get_all_values(keys, pattern, winreg.KEY_READ):
++            yield match
+ 
+ 
+ @imports(_from='mozbuild.configure.util', _import='Version', _as='_Version')
+ def Version(v):
+     'A version number that can be compared usefully.'
+     return _Version(v)
+ 
+ # Denotes a deprecated option. Combines option() and @depends:
+diff --git a/build/moz.configure/windows.configure b/build/moz.configure/windows.configure
+--- a/build/moz.configure/windows.configure
++++ b/build/moz.configure/windows.configure
+@@ -28,19 +28,19 @@ option(env='WINDOWSSDKDIR', nargs=1,
+ 
+ @depends('WINDOWSSDKDIR', host)
+ def windows_sdk_dir(value, host):
+     if value:
+         return value
+     if host.kernel != 'WINNT':
+         return ()
+ 
+-    return tuple(x[1] for x in get_registry_values(
++    return set(x[1] for x in get_registry_values(
+         r'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots'
+-        r'\KitsRoot*'))
++        r'\KitsRoot*', get_32_and_64_bit=True))
+ 
+ # The Windows SDK 8.1 and 10 have different layouts. The former has
+ # $SDK/include/$subdir, while the latter has $SDK/include/$version/$subdir.
+ # The vcvars* scripts don't actually care about the version, they just take
+ # the last alphanumerically.
+ # The $SDK/lib directories always have version subdirectories, but while the
+ # versions match the one in $SDK/include for SDK 10, it's "winv6.3" for SDK
+ # 8.1.
+

+ 37 - 0
mozilla-esr52/patches/1370865.patch

@@ -0,0 +1,37 @@
+
+# HG changeset patch
+# User Masatoshi Kimura <VYV03354@nifty.ne.jp>
+# Date 1496667654 -32400
+# Node ID 9493b84ba6a07e575ab0be68f21e9586908021ae
+# Parent  b977e23d261c81568a53fabfaa8885566f76fe47
+Bug 1370865 - Suppress more MSVC warnings in gfx/angle. r=jgilbert
+
+MozReview-Commit-ID: D9HLvwCLRQn
+
+diff --git a/gfx/angle/src/libANGLE/moz.build b/gfx/angle/src/libANGLE/moz.build
+--- a/gfx/angle/src/libANGLE/moz.build
++++ b/gfx/angle/src/libANGLE/moz.build
+@@ -347,16 +347,22 @@ if CONFIG['GNU_CXX']:
+             '-Wno-unused-private-field',
+         ]
+     else:
+         CXXFLAGS += [
+             '-Wno-shadow-compatible-local',
+             '-Wno-shadow-local',
+         ]
+ 
++if CONFIG['_MSC_VER'] and not CONFIG['CLANG_CL']:
++    CXXFLAGS += [
++        '-wd4018', # '>' : signed/unsigned mismatch
++        '-wd4530', # C++ exception handler used, without /EHsc
++    ]
++
+ if CONFIG['MOZ_DIRECTX_SDK_PATH'] and not CONFIG['MOZ_HAS_WINSDK_WITH_D3D']:
+     LOCAL_INCLUDES += ['%' + '%s/include/' % CONFIG['MOZ_DIRECTX_SDK_PATH']]
+ 
+ DEFINES['_CRT_SECURE_NO_DEPRECATE'] = True
+ DEFINES['_HAS_EXCEPTIONS'] = 0
+ 
+ if not CONFIG['MOZ_DEBUG']:
+     DEFINES['_SECURE_SCL'] = 0
+

+ 206 - 0
mozilla-esr52/patches/1376057.patch

@@ -0,0 +1,206 @@
+
+# HG changeset patch
+# User Jeff Gilbert <jgilbert@mozilla.com>
+# Date 1490226191 25200
+# Node ID 37e047b6187f8a2cc9ce30268d42977e679db84e
+# Parent  7da6c99070996a8d0baa4013d4c0b515f8045fa2
+Bug 1376057 - Replace MSVC wrappers with std::exception::_Set_raise_handler. - r=froydnj
+
+MozReview-Commit-ID: MG5c4bzDlI
+
+
+diff --git a/config/msvc-stl-wrapper.template.h b/config/msvc-stl-wrapper.template.h
+--- a/config/msvc-stl-wrapper.template.h
++++ b/config/msvc-stl-wrapper.template.h
+@@ -14,22 +14,16 @@
+ 
+ // Include mozalloc after the STL header and all other headers it includes
+ // have been preprocessed.
+ #if !defined(MOZ_INCLUDE_MOZALLOC_H)
+ #  define MOZ_INCLUDE_MOZALLOC_H
+ #  define MOZ_INCLUDE_MOZALLOC_H_FROM_${HEADER}
+ #endif
+ 
+-// Code built with !_HAS_EXCEPTIONS calls std::_Throw(), but the win2k
+-// CRT doesn't export std::_Throw().  So we define it.
+-#ifndef mozilla_Throw_h
+-#  include "mozilla/throw_msvc.h"
+-#endif
+-
+ #ifdef _DEBUG
+ // From
+ //   http://msdn.microsoft.com/en-us/library/aa985982%28VS.80%29.aspx
+ // and
+ //   http://msdn.microsoft.com/en-us/library/aa985965%28VS.80%29.aspx
+ // there appear to be two types of STL container checking.  The
+ // former is enabled by -D_DEBUG (which is implied by -MDd or -MTd), and
+ // looks to be full generation/mutation checked iterators as done by
+diff --git a/memory/mozalloc/moz.build b/memory/mozalloc/moz.build
+--- a/memory/mozalloc/moz.build
++++ b/memory/mozalloc/moz.build
+@@ -12,20 +12,16 @@ EXPORTS.mozilla += [
+ ]
+ 
+ if CONFIG['WRAP_STL_INCLUDES']:
+     if CONFIG['GNU_CXX']:
+         EXPORTS.mozilla += ['throw_gcc.h']
+     elif CONFIG['_MSC_VER']:
+         DEFINES['_HAS_EXCEPTIONS'] = 0
+         if CONFIG['MOZ_MSVC_STL_WRAP_RAISE']:
+-            EXPORTS.mozilla += [
+-                'msvc_raise_wrappers.h',
+-                'throw_msvc.h',
+-            ]
+             SOURCES += [
+                 'msvc_raise_wrappers.cpp',
+             ]
+ 
+ if CONFIG['OS_TARGET'] == 'WINNT':
+     # Keep this file separate to avoid #include'ing windows.h everywhere.
+     SOURCES += [
+         'winheap.cpp',
+diff --git a/memory/mozalloc/msvc_raise_wrappers.cpp b/memory/mozalloc/msvc_raise_wrappers.cpp
+--- a/memory/mozalloc/msvc_raise_wrappers.cpp
++++ b/memory/mozalloc/msvc_raise_wrappers.cpp
+@@ -1,63 +1,21 @@
+ /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+  * vim: sw=4 ts=4 et :
+  */
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+  * License, v. 2.0. If a copy of the MPL was not distributed with this
+  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
+-#include <stdio.h>
+-
++#include <exception>
+ #include "mozalloc_abort.h"
+ 
+-__declspec(noreturn) static void abort_from_exception(const char* const which,
+-                                                      const char* const what);
+-static void
+-abort_from_exception(const char* const which,  const char* const what)
++static void __cdecl
++RaiseHandler(const std::exception& e)
+ {
+-    fprintf(stderr, "fatal: STL threw %s: ", which);
+-    mozalloc_abort(what);
+-}
+-
+-namespace std {
+-
+-// NB: user code is not supposed to touch the std:: namespace.  We're
+-// doing this after careful review because we want to define our own
+-// exception throwing semantics.  Don't try this at home!
+-
+-MFBT_API __declspec(noreturn) void
+-moz_Xinvalid_argument(const char* what)
+-{
+-    abort_from_exception("invalid_argument", what);
++    mozalloc_abort(e.what());
+ }
+ 
+-MFBT_API __declspec(noreturn) void
+-moz_Xlength_error(const char* what)
+-{
+-    abort_from_exception("length_error", what);
+-}
+-
+-MFBT_API __declspec(noreturn) void
+-moz_Xout_of_range(const char* what)
+-{
+-    abort_from_exception("out_of_range", what);
+-}
+-
+-MFBT_API __declspec(noreturn) void
+-moz_Xoverflow_error(const char* what)
+-{
+-    abort_from_exception("overflow_error", what);
+-}
+-
+-MFBT_API __declspec(noreturn) void
+-moz_Xruntime_error(const char* what)
+-{
+-    abort_from_exception("runtime_error", what);
+-}
+-
+-MFBT_API __declspec(noreturn) void
+-moz_Xbad_function_call()
+-{
+-    abort_from_exception("bad_function_call", "bad function call");
+-}
+-
+-} // namespace std
++static struct StaticScopeStruct final {
++    StaticScopeStruct() {
++        std::exception::_Set_raise_handler(RaiseHandler);
++    }
++} StaticScopeInvoke;
+diff --git a/memory/mozalloc/msvc_raise_wrappers.h b/memory/mozalloc/msvc_raise_wrappers.h
+deleted file mode 100644
+--- a/memory/mozalloc/msvc_raise_wrappers.h
++++ /dev/null
+@@ -1,41 +0,0 @@
+-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+- * vim: sw=4 ts=4 et :
+- */
+-/* This Source Code Form is subject to the terms of the Mozilla Public
+- * License, v. 2.0. If a copy of the MPL was not distributed with this
+- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+-
+-#ifndef mozilla_msvc_raise_wrappers_h
+-#define mozilla_msvc_raise_wrappers_h
+-
+-#ifdef _XSTDDEF_
+-#  error "Unable to wrap _RAISE(); CRT _RAISE() already defined"
+-#endif
+-#ifdef _XUTILITY_
+-#  error "Unable to wrap _X[exception](); CRT versions already declared"
+-#endif
+-#ifdef _FUNCTIONAL_
+-#  error "Unable to wrap _Xbad_function_call(); CRT version already declared"
+-#endif
+-
+-#include "mozilla/mozalloc_abort.h"
+-
+-// xutility will declare the following functions in the std namespace.
+-// We #define them to be named differently so we can ensure the exception
+-// throwing semantics of these functions work exactly the way we want, by
+-// defining our own versions in msvc_raise_wrappers.cpp.
+-#  define _Xinvalid_argument  moz_Xinvalid_argument
+-#  define _Xlength_error      moz_Xlength_error
+-#  define _Xout_of_range      moz_Xout_of_range
+-#  define _Xoverflow_error    moz_Xoverflow_error
+-#  define _Xruntime_error     moz_Xruntime_error
+-// used by <functional>
+-#  define _Xbad_function_call moz_Xbad_function_call
+-
+-#  include <xstddef>
+-#  include <xutility>
+-
+-#  undef _RAISE
+-#  define _RAISE(x) mozalloc_abort((x).what())
+-
+-#endif  // ifndef mozilla_msvc_raise_wrappers_h
+diff --git a/memory/mozalloc/throw_msvc.h b/memory/mozalloc/throw_msvc.h
+deleted file mode 100644
+--- a/memory/mozalloc/throw_msvc.h
++++ /dev/null
+@@ -1,17 +0,0 @@
+-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+- * vim: sw=4 ts=4 et :
+- */
+-/* This Source Code Form is subject to the terms of the Mozilla Public
+- * License, v. 2.0. If a copy of the MPL was not distributed with this
+- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+-
+-#ifndef mozilla_throw_msvc_h
+-#define mozilla_throw_msvc_h
+-
+-#if defined(MOZ_MSVC_STL_WRAP_RAISE)
+-#  include "msvc_raise_wrappers.h"
+-#else
+-#  error "Unknown STL wrapper tactic"
+-#endif
+-
+-#endif  // mozilla_throw_msvc_h
+

+ 27 - 0
mozilla-esr52/patches/1391547-DIASDK.patch

@@ -0,0 +1,27 @@
+
+# HG changeset patch
+# User Makoto Kato <m_kato@ga2.so-net.ne.jp>
+# Date 1503382567 -32400
+# Node ID 2a1d927227787a4aa6abf3401286d564a2dd4b7f
+# Parent  21ee1d9cf4d206bec71c165adb6ab6acf56ba254
+Bug 1391547 - DIA SDK is missing when using MSVS2017. r=ted.mielczarek
+
+MSVC path: C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.11.25503
+DIA SDK path: C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\DIA SDK
+
+dia_sdk_dir of windows.configure tries finding invalid path.
+
+MozReview-Commit-ID: KQDNA1tdpW2
+
+diff -r 21ee1d9cf4d2 build/moz.configure/windows.configure
+--- a/build/moz.configure/windows.configure	Thu Nov 02 11:10:39 2017 -0400
++++ b/build/moz.configure/windows.configure	Mon Aug 13 17:49:55 2018 +0200
+@@ -273,7 +273,7 @@
+         else:
+             # This would be easier if we had the installationPath that
+             # get_vc_paths works with, since 'DIA SDK' is relative to that.
+-             path = os.path.normpath(os.path.join(vc_path, r'..\..\..\..\..\..\..\DIA SDK'))
++            path = os.path.normpath(os.path.join(vc_path, r'..\..\..\..\DIA SDK'))
+         if isdir(path):
+             return path
+ 

+ 136 - 0
mozilla-esr52/patches/1403945.patch

@@ -0,0 +1,136 @@
+
+# HG changeset patch
+# User Milan Sreckovic <milan@mozilla.com>
+# Date 1506608470 14400
+# Node ID 9bd05768af69c88d44b84ffcaa9a2644d9a0a6ec
+# Parent  16b2013a1ff8344fad506199fde28118257a7a29
+Bug 1403945 - Add utility functions to recognize OS X 10.13. r=mstange, a=sledru
+
+MozReview-Commit-ID: Bw0jkyWrIzD
+
+diff --git a/widget/GfxDriverInfo.h b/widget/GfxDriverInfo.h
+--- a/widget/GfxDriverInfo.h
++++ b/widget/GfxDriverInfo.h
+@@ -53,16 +53,17 @@ enum class OperatingSystem {
+   OSX10_5,
+   OSX10_6,
+   OSX10_7,
+   OSX10_8,
+   OSX10_9,
+   OSX10_10,
+   OSX10_11,
+   OSX10_12,
++  OSX10_13,
+   Android,
+   Ios
+ };
+ 
+ enum VersionComparisonOp {
+   DRIVER_LESS_THAN,             // driver <  version
+   DRIVER_BUILD_ID_LESS_THAN,    // driver build id <  version
+   DRIVER_LESS_THAN_OR_EQUAL,    // driver <= version
+diff --git a/widget/GfxInfoBase.cpp b/widget/GfxInfoBase.cpp
+--- a/widget/GfxInfoBase.cpp
++++ b/widget/GfxInfoBase.cpp
+@@ -279,16 +279,18 @@ BlacklistOSToOperatingSystem(const nsASt
+   else if (os.EqualsLiteral("Darwin 13"))
+     return OperatingSystem::OSX10_9;
+   else if (os.EqualsLiteral("Darwin 14"))
+     return OperatingSystem::OSX10_10;
+   else if (os.EqualsLiteral("Darwin 15"))
+     return OperatingSystem::OSX10_11;
+   else if (os.EqualsLiteral("Darwin 16"))
+     return OperatingSystem::OSX10_12;
++  else if (os.EqualsLiteral("Darwin 17"))
++    return OperatingSystem::OSX10_13;
+   else if (os.EqualsLiteral("Android"))
+     return OperatingSystem::Android;
+   // For historical reasons, "All" in blocklist means "All Windows"
+   else if (os.EqualsLiteral("All"))
+     return OperatingSystem::Windows;
+ 
+   return OperatingSystem::Unknown;
+ }
+diff --git a/widget/cocoa/GfxInfo.mm b/widget/cocoa/GfxInfo.mm
+--- a/widget/cocoa/GfxInfo.mm
++++ b/widget/cocoa/GfxInfo.mm
+@@ -49,16 +49,18 @@ OSXVersionToOperatingSystem(uint32_t aOS
+       case 9:
+         return OperatingSystem::OSX10_9;
+       case 10:
+         return OperatingSystem::OSX10_10;
+       case 11:
+         return OperatingSystem::OSX10_11;
+       case 12:
+         return OperatingSystem::OSX10_12;
++      case 13:
++        return OperatingSystem::OSX10_13;
+     }
+   }
+ 
+   return OperatingSystem::Unknown;
+ }
+ // The following three functions are derived from Chromium code
+ static CFTypeRef SearchPortForProperty(io_registry_entry_t dspPort,
+                                        CFStringRef propertyName)
+diff --git a/widget/cocoa/nsCocoaFeatures.h b/widget/cocoa/nsCocoaFeatures.h
+--- a/widget/cocoa/nsCocoaFeatures.h
++++ b/widget/cocoa/nsCocoaFeatures.h
+@@ -16,16 +16,17 @@ class nsCocoaFeatures {
+ public:
+   static int32_t OSXVersion();
+   static int32_t OSXVersionMajor();
+   static int32_t OSXVersionMinor();
+   static int32_t OSXVersionBugFix();
+   static bool OnYosemiteOrLater();
+   static bool OnElCapitanOrLater();
+   static bool OnSierraOrLater();
++  static bool OnHighSierraOrLater();
+ 
+   static bool IsAtLeastVersion(int32_t aMajor, int32_t aMinor, int32_t aBugFix=0);
+ 
+   // These are utilities that do not change or depend on the value of mOSXVersion
+   // and instead just encapsulate the encoding algorithm.  Note that GetVersion
+   // actually adjusts to the lowest supported OS, so it will always return
+   // a "supported" version.  GetSystemVersion does not make any modifications.
+   static void GetSystemVersion(int &aMajor, int &aMinor, int &aBugFix);
+diff --git a/widget/cocoa/nsCocoaFeatures.mm b/widget/cocoa/nsCocoaFeatures.mm
+--- a/widget/cocoa/nsCocoaFeatures.mm
++++ b/widget/cocoa/nsCocoaFeatures.mm
+@@ -14,16 +14,17 @@
+ #define MAC_OS_X_VERSION_MASK      0x0000FFFF
+ #define MAC_OS_X_VERSION_10_0_HEX  0x00001000
+ #define MAC_OS_X_VERSION_10_7_HEX  0x00001070
+ #define MAC_OS_X_VERSION_10_8_HEX  0x00001080
+ #define MAC_OS_X_VERSION_10_9_HEX  0x00001090
+ #define MAC_OS_X_VERSION_10_10_HEX 0x000010A0
+ #define MAC_OS_X_VERSION_10_11_HEX 0x000010B0
+ #define MAC_OS_X_VERSION_10_12_HEX 0x000010C0
++#define MAC_OS_X_VERSION_10_13_HEX 0x000010D0
+ 
+ #include "nsCocoaFeatures.h"
+ #include "nsCocoaUtils.h"
+ #include "nsDebug.h"
+ #include "nsObjCExceptions.h"
+ 
+ #import <Cocoa/Cocoa.h>
+ 
+@@ -163,12 +164,18 @@ nsCocoaFeatures::OnElCapitanOrLater()
+ 
+ /* static */ bool
+ nsCocoaFeatures::OnSierraOrLater()
+ {
+     return (OSXVersion() >= MAC_OS_X_VERSION_10_12_HEX);
+ }
+ 
+ /* static */ bool
++nsCocoaFeatures::OnHighSierraOrLater()
++{
++    return (OSXVersion() >= MAC_OS_X_VERSION_10_13_HEX);
++}
++
++/* static */ bool
+ nsCocoaFeatures::IsAtLeastVersion(int32_t aMajor, int32_t aMinor, int32_t aBugFix)
+ {
+     return OSXVersion() >= GetVersion(aMajor, aMinor, aBugFix);
+ }

+ 95 - 0
mozilla-esr52/patches/1406380-385080.patch

@@ -0,0 +1,95 @@
+# HG changeset patch
+# User Tom Ritter <tom@mozilla.com>
+# Date 1507530996 18000
+#      Mon Oct 09 01:36:36 2017 -0500
+# Node ID 224eccf80d4732b148d9a3dbf83725dc2f347c24
+# Parent  0f1fe50759a02a9cdc3d9dcfe99cb5ac8db1ec63
+Bug 1406380 Fix -Wreorder warnings r=njn
+
+MozReview-Commit-ID: 7Zh2pvAMpXR
+
+diff -r 0f1fe50759a0 dom/gamepad/windows/WindowsGamepad.cpp
+--- a/dom/gamepad/windows/WindowsGamepad.cpp	Sun Apr 30 03:40:00 2017 -0400
++++ b/dom/gamepad/windows/WindowsGamepad.cpp	Tue Aug 14 11:37:06 2018 +0200
+@@ -139,10 +139,10 @@
+           uint32_t aNumButtons,
+           bool aHasDpad,
+           GamepadType aType) :
++    type(aType),
+     numAxes(aNumAxes),
+     numButtons(aNumButtons),
+     hasDpad(aHasDpad),
+-    type(aType),
+     present(true)
+   {
+     buttons.SetLength(numButtons);
+@@ -159,8 +159,8 @@
+ class XInputLoader {
+ public:
+   XInputLoader() : module(nullptr),
+-                   mXInputEnable(nullptr),
+-                   mXInputGetState(nullptr) {
++                   mXInputGetState(nullptr),
++                   mXInputEnable(nullptr) {
+     // xinput1_4.dll exists on Windows 8
+     // xinput9_1_0.dll exists on Windows 7 and Vista
+     // xinput1_3.dll shipped with the DirectX SDK
+@@ -280,14 +280,14 @@
+ 
+ class HIDLoader {
+ public:
+-  HIDLoader() : mModule(LoadLibraryW(L"hid.dll")),
+-                mHidD_GetProductString(nullptr),
++  HIDLoader() : mHidD_GetProductString(nullptr),
+                 mHidP_GetCaps(nullptr),
+                 mHidP_GetButtonCaps(nullptr),
+                 mHidP_GetValueCaps(nullptr),
+                 mHidP_GetUsages(nullptr),
+                 mHidP_GetUsageValue(nullptr),
+-                mHidP_GetScaledUsageValue(nullptr)
++                mHidP_GetScaledUsageValue(nullptr),
++                mModule(LoadLibraryW(L"hid.dll"))
+   {
+     if (mModule) {
+       mHidD_GetProductString = reinterpret_cast<decltype(HidD_GetProductString)*>(GetProcAddress(mModule, "HidD_GetProductString"));
+diff -r 0f1fe50759a0 dom/media/platforms/wmf/WMFVideoMFTManager.cpp
+--- a/dom/media/platforms/wmf/WMFVideoMFTManager.cpp	Sun Apr 30 03:40:00 2017 -0400
++++ b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp	Tue Aug 14 11:37:06 2018 +0200
+@@ -87,8 +87,8 @@
+   , mVideoStride(0)
+   , mImageSize(aConfig.mImage)
+   , mImageContainer(aImageContainer)
++  , mKnowsCompositor(aKnowsCompositor)
+   , mDXVAEnabled(aDXVAEnabled)
+-  , mKnowsCompositor(aKnowsCompositor)
+   , mNullOutputCount(0)
+   , mGotValidOutputAfterNullOutput(false)
+   , mGotExcessiveNullOutput(false)
+diff -r 0f1fe50759a0 dom/plugins/ipc/PluginModuleChild.cpp
+--- a/dom/plugins/ipc/PluginModuleChild.cpp	Sun Apr 30 03:40:00 2017 -0400
++++ b/dom/plugins/ipc/PluginModuleChild.cpp	Tue Aug 14 11:37:06 2018 +0200
+@@ -2085,7 +2085,9 @@
+ 
+ public:
+     explicit GetKeyStateTask(int aVirtKey, HANDLE aSemaphore, SHORT* aKeyState) :
+-        mVirtKey(aVirtKey), mSemaphore(aSemaphore), mKeyState(aKeyState)
++        mKeyState(aKeyState),
++        mVirtKey(aVirtKey),
++        mSemaphore(aSemaphore)
+     {}
+ 
+     NS_IMETHOD Run() override
+diff -r 0f1fe50759a0 dom/plugins/ipc/PluginUtilsWin.cpp
+--- a/dom/plugins/ipc/PluginUtilsWin.cpp	Sun Apr 30 03:40:00 2017 -0400
++++ b/dom/plugins/ipc/PluginUtilsWin.cpp	Tue Aug 14 11:37:06 2018 +0200
+@@ -48,8 +48,8 @@
+ {
+ public:
+   AudioNotification() :
+-      mRefCt(1)
+-    , mIsRegistered(false)
++      mIsRegistered(false)
++    , mRefCt(1)
+   {
+     HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),
+                                   NULL, CLSCTX_INPROC_SERVER,

+ 35 - 0
mozilla-esr52/patches/1407017-244f2649c736.patch

@@ -0,0 +1,35 @@
+
+# HG changeset patch
+# User David Major <dmajor@mozilla.com>
+# Date 1507565760 14400
+# Node ID 244f2649c736dc5dc9652f9ab839cd3dc25cd820
+# Parent  5e0a1d82ef670c537b7b5c60ba0f2606a9f04ef7
+Bug 1407017 - Make --with-visual-studio-version a js_option. r=ted
+
+diff --git a/build/moz.configure/toolchain.configure b/build/moz.configure/toolchain.configure
+--- a/build/moz.configure/toolchain.configure
++++ b/build/moz.configure/toolchain.configure
+@@ -504,19 +504,19 @@ def get_vc_paths(topsrcdir):
+         tools_version = open(os.path.join(path, r'VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt'), 'rb').read().strip()
+         tools_path = os.path.join(path, r'VC\Tools\MSVC', tools_version, r'bin\HostX64')
+         yield (Version(install['installationVersion']), {
+             'x64': [os.path.join(tools_path, 'x64')],
+             # The x64->x86 cross toolchain requires DLLs from the native x64 toolchain.
+             'x86': [os.path.join(tools_path, 'x86'), os.path.join(tools_path, 'x64')],
+         })
+ 
+-option('--with-visual-studio-version', nargs=1,
+-       choices=('2015', '2017'),
+-       help='Select a specific Visual Studio version to use')
++js_option('--with-visual-studio-version', nargs=1,
++          choices=('2015', '2017'),
++          help='Select a specific Visual Studio version to use')
+ 
+ @depends('--with-visual-studio-version')
+ def vs_major_version(value):
+     if value:
+         return {'2015': 14,
+                 '2017': 15}[value[0]]
+ 
+ @depends(host, target, vs_major_version, check_build_environment, '--with-visual-studio-version')
+

+ 283 - 0
mozilla-esr52/patches/1407678-vs2017toolchain-249.patch

@@ -0,0 +1,283 @@
+
+# HG changeset patch
+# User David Major <dmajor@mozilla.com>
+# Date 1509635439 14400
+# Node ID 3f56c67e2a2ab7404641d19dec37254c2523d475
+# Parent  5917b44a260da266922d1c5a011a38a9a0fa7711
+Bug 1407678 - Make windows_toolchain.py support VS2017. r=mshal DONTBUILD
+
+diff -r 5917b44a260d build/docs/toolchains.rst
+--- a/build/docs/toolchains.rst	Thu Nov 24 15:47:10 2016 +0900
++++ b/build/docs/toolchains.rst	Mon Aug 13 18:37:11 2018 +0200
+@@ -51,7 +51,7 @@
+ of mozilla-central, run something like the following to produce a ZIP
+ archive::
+ 
+-   $ ./mach python build/windows_toolchain.py create-zip vs2015u3
++   $ ./mach python build/windows_toolchain.py create-zip vs2017_15.4.2
+ 
+ The produced archive will be the argument to ``create-zip`` + ``.zip``.
+ 
+diff -r 5917b44a260d build/windows_toolchain.py
+--- a/build/windows_toolchain.py	Thu Nov 24 15:47:10 2016 +0900
++++ b/build/windows_toolchain.py	Mon Aug 13 18:37:11 2018 +0200
+@@ -24,96 +24,111 @@
+ )
+ import mozpack.path as mozpath
+ 
++SDK_RELEASE = '10.0.15063.0'
+ 
+-# mozpack.match patterns for files under "Microsoft Visual Studio 14.0".
+-VS_PATTERNS = [
+-    {
+-        'pattern': 'DIA SDK/bin/**',
+-        'ignore': (
+-            'DIA SDK/bin/arm/**',
+-        ),
+-    },
+-    {
+-        'pattern': 'DIA SDK/idl/**',
+-    },
+-    {
+-        'pattern': 'DIA SDK/include/**',
+-    },
++PATTERNS = [
+     {
+-        'pattern': 'DIA SDK/lib/**',
+-        'ignore': (
+-            'DIA SDK/lib/arm/**',
+-        ),
+-    },
+-    # ATL is needed by Breakpad.
+-    {
+-        'pattern': 'VC/atlmfc/include/**',
+-    },
+-    {
+-        'pattern': 'VC/atlmfc/lib/atls.*',
+-    },
+-    {
+-        'pattern': 'VC/atlmfc/lib/amd64/atls.*',
+-    },
+-    {
+-        'pattern': 'VC/bin/**',
+-        # We only care about compiling on amd64 for amd64 or x86 targets.
+-        'ignore': (
+-            'VC/bin/amd64_arm/**',
+-            'VC/bin/arm/**',
+-            'VC/bin/x86_arm/**',
+-            'VC/bin/x86_amd64/**',
+-        ),
+-    },
+-    {
+-        'pattern': 'VC/include/**',
++        'srcdir': '%(vs_path)s/DIA SDK',
++        'dstdir': 'DIA SDK',
++        'files': [
++            {
++                'pattern': 'bin/**',
++                'ignore': (
++                    'bin/arm/**',
++                ),
++            },
++            {
++                'pattern': 'idl/**',
++            },
++            {
++                'pattern': 'include/**',
++            },
++            {
++                'pattern': 'lib/**',
++                'ignore': (
++                    'lib/arm/**',
++                ),
++            },
++        ],
+     },
+     {
+-        'pattern': 'VC/lib/**',
+-        'ignore': (
+-            'VC/lib/arm/**',
+-            'VC/lib/onecore/**',
+-            'VC/lib/store/**',
+-        ),
+-    },
+-    {
+-        'pattern': 'VC/redist/x64/Microsoft.VC140.CRT/**',
+-    },
+-    {
+-        'pattern': 'VC/redist/x86/Microsoft.VC140.CRT/**',
+-    },
+-]
+-
+-SDK_RELEASE = '10.0.14393.0'
+-
+-# Files from the Windows 10 SDK to install.
+-SDK_PATTERNS = [
+-    {
+-        'pattern': 'bin/x64/**',
++        'srcdir': '%(vs_path)s/VC/Tools/MSVC/14.11.25503',
++        'dstdir': 'VC',
++        'files': [
++            # ATL is needed by Breakpad.
++            {
++                'pattern': 'atlmfc/include/**',
++            },
++            {
++                'pattern': 'atlmfc/lib/x86/atls.*',
++            },
++            {
++                'pattern': 'atlmfc/lib/x64/atls.*',
++            },
++            {
++                'pattern': 'bin/Hostx64/**',
++            },
++            # 32-bit PGO-instrumented builds require 32-bit pgort140.dll.
++            {
++                'pattern': 'bin/Hostx86/x86/pgort140.dll',
++            },
++            {
++                'pattern': 'include/**',
++            },
++            {
++                'pattern': 'lib/**',
++                'ignore': (
++                    'lib/onecore/**',
++                    'lib/x64/store/**',
++                    'lib/x86/store/**',
++                ),
++            },
++        ],
+     },
+     {
+-        'pattern': 'Include/%s/**' % SDK_RELEASE,
+-    },
+-    {
+-        'pattern': 'Lib/%s/ucrt/x64/**' % SDK_RELEASE,
+-    },
+-    {
+-        'pattern': 'Lib/%s/ucrt/x86/**' % SDK_RELEASE,
++        'srcdir': '%(vs_path)s/VC/Redist/MSVC/14.11.25325',
++        'dstdir': 'VC/redist',
++        'files': [
++            {
++                'pattern': 'x64/Microsoft.VC141.CRT/**',
++            },
++            {
++                'pattern': 'x86/Microsoft.VC141.CRT/**',
++            },
++        ],
+     },
+     {
+-        'pattern': 'Lib/%s/um/x64/**' % SDK_RELEASE,
+-    },
+-    {
+-        'pattern': 'Lib/%s/um/x86/**' % SDK_RELEASE,
+-    },
+-    {
+-        'pattern': 'Redist/D3D/**',
+-    },
+-    {
+-        'pattern': 'Redist/ucrt/DLLs/x64/**',
+-    },
+-    {
+-        'pattern': 'Redist/ucrt/DLLs/x86/**',
++        'srcdir': '%(sdk_path)s',
++        'dstdir': 'SDK',
++        'files': [
++            {
++                'pattern': 'bin/%s/x64/**' % SDK_RELEASE,
++            },
++            {
++                'pattern': 'Include/%s/**' % SDK_RELEASE,
++            },
++            {
++                'pattern': 'Lib/%s/ucrt/x64/**' % SDK_RELEASE,
++            },
++            {
++                'pattern': 'Lib/%s/ucrt/x86/**' % SDK_RELEASE,
++            },
++            {
++                'pattern': 'Lib/%s/um/x64/**' % SDK_RELEASE,
++            },
++            {
++                'pattern': 'Lib/%s/um/x86/**' % SDK_RELEASE,
++            },
++            {
++                'pattern': 'Redist/D3D/**',
++            },
++            {
++                'pattern': 'Redist/ucrt/DLLs/x64/**',
++            },
++            {
++                'pattern': 'Redist/ucrt/DLLs/x86/**',
++            },
++        ],
+     },
+ ]
+ 
+@@ -128,9 +143,9 @@
+         raise Exception('No "ProgramFiles(x86)" environment variable. '
+                         'Not running on 64-bit Windows?')
+ 
+-    vs_path = os.path.join(pf, 'Microsoft Visual Studio 14.0')
++    vs_path = os.path.join(pf, 'Microsoft Visual Studio', '2017', 'Community')
+     if not os.path.exists(vs_path):
+-        raise Exception('%s does not exist; Visual Studio 2015 not installed?' %
++        raise Exception('%s does not exist; Visual Studio 2017 not installed?' %
+                         vs_path)
+ 
+     sdk_path = os.path.join(pf, 'Windows Kits', '10')
+@@ -138,6 +153,11 @@
+         raise Exception('%s does not exist; Windows 10 SDK not installed?' %
+                         sdk_path)
+ 
++    sdk_fullver_path = os.path.join(sdk_path, 'Include', SDK_RELEASE)
++    if not os.path.exists(sdk_fullver_path):
++        raise Exception('%s does not exist; Wrong SDK version installed?' %
++                        sdk_fullver_path)
++
+     return vs_path, sdk_path
+ 
+ 
+@@ -149,22 +169,16 @@
+     """
+     vs_path, sdk_path = find_vs_paths()
+ 
+-    for entry in VS_PATTERNS:
+-        finder = FileFinder(vs_path, find_executables=False,
+-                            ignore=entry.get('ignore', []))
+-        for p, f in finder.find(entry['pattern']):
+-            assert p.startswith(('VC/', 'DIA SDK/'))
+-
+-            yield p.encode('utf-8'), f
+-
+-    for entry in SDK_PATTERNS:
+-        finder = FileFinder(sdk_path, find_executables=False,
+-                            ignore=entry.get('ignore', []))
+-        for p, f in finder.find(entry['pattern']):
+-            relpath = 'SDK/%s' % p
+-
+-            yield relpath.encode('utf-8'), f
+-
++    for entry in PATTERNS:
++        fullpath = entry['srcdir'] % {
++            'vs_path': vs_path,
++            'sdk_path': sdk_path,
++        }
++        for pattern in entry['files']:
++            finder = FileFinder(fullpath, ignore=pattern.get('ignore', []))
++            for p, f in finder.find(pattern['pattern']):
++                dstpath = '%s/%s' % (entry['dstdir'], p)
++                yield dstpath.encode('utf-8'), f
+ 
+ def resolve_files_and_hash(manifest):
+     """Resolve files and hash their data.
+@@ -203,7 +217,7 @@
+     if isinstance(prefix, unicode):
+         prefix = prefix.encode('utf-8')
+ 
+-    with JarWriter(file=zip_path, optimize=False, compress=5) as zip:
++    with JarWriter(file=zip_path, optimize=False, compress_level=5) as zip:
+         manifest = {}
+         for p, data, mode in resolve_files_and_hash(manifest):
+             print(p)

+ 30 - 0
mozilla-esr52/patches/1408695-VS2017constexpr.patch

@@ -0,0 +1,30 @@
+# HG changeset patch
+# User David Major <dmajor@mozilla.com>
+# Date 1508029745 14400
+#      Sat Oct 14 21:09:05 2017 -0400
+# Node ID 60d3df91ae2f1e724072d234e83b8b82edfc91cb
+# Parent  65ddb6ae0db065d392023efadde2655c396c79d9
+Bug 1408695 - Work around a VS2017 constexpr pointer math bug in HTMLTrackElement.cpp. r=gerald
+
+diff --git a/dom/html/HTMLTrackElement.cpp b/dom/html/HTMLTrackElement.cpp
+--- a/dom/html/HTMLTrackElement.cpp
++++ b/dom/html/HTMLTrackElement.cpp
+@@ -63,17 +63,17 @@ static constexpr nsAttrValue::EnumTable 
+   { "descriptions", static_cast<int16_t>(TextTrackKind::Descriptions) },
+   { "chapters", static_cast<int16_t>(TextTrackKind::Chapters) },
+   { "metadata", static_cast<int16_t>(TextTrackKind::Metadata) },
+   { nullptr, 0 }
+ };
+ 
+ // Invalid values are treated as "metadata" in ParseAttribute, but if no value
+ // at all is specified, it's treated as "subtitles" in GetKind
+-static constexpr const nsAttrValue::EnumTable* kKindTableInvalidValueDefault = &kKindTable[4];
++static const nsAttrValue::EnumTable* const kKindTableInvalidValueDefault = &kKindTable[4];
+ 
+ class WindowDestroyObserver final : public nsIObserver
+ {
+   NS_DECL_ISUPPORTS
+ 
+ public:
+   explicit WindowDestroyObserver(HTMLTrackElement* aElement, uint64_t aWinID)
+     : mTrackElement(aElement)

+ 24 - 0
mozilla-esr52/patches/1415470-part1-VS2017-a11y.patch

@@ -0,0 +1,24 @@
+
+# HG changeset patch
+# User Chris Peterson <cpeterson@mozilla.com>
+# Date 1510041293 28800
+# Node ID cec4f6e0be0020eac30ee723eb1ddf3641e54c06
+# Parent  43ee3613ca01d5d0d688bab3803a957fe18ace9d
+Bug 1415470 - a11y: Fix VS2017 initializer list order warnings. r=yzen
+
+Reorder DocAccessibleParent's and DocAccessibleChild's constructor initializer lists to fix these VS2017 warnings:
+
+a11y/DocAccessibleParent.h(32): warning C5038: data member 'mozilla::a11y::DocAccessibleParent::mShutdown' will be initialized after data member 'mozilla::a11y::DocAccessibleParent::mEmulatedWindowHandle'
+
+accessible/ipc/win/DocAccessibleChild.cpp(22): warning C5038: data member 'mozilla::a11y::DocAccessibleChild::mEmulatedWindowHandle' will be initialized after data member 'mozilla::a11y::DocAccessibleChild::mIsRemoteConstructed'
+
+MozReview-Commit-ID: 8flWtpe13ob
+
+diff -r 43ee3613ca01 accessible/ipc/win/DocAccessibleChild.cpp
+--- a/accessible/ipc/win/DocAccessibleChild.cpp	Mon Aug 13 17:51:06 2018 +0200
++++ b/accessible/ipc/win/DocAccessibleChild.cpp	Mon Aug 13 17:58:06 2018 +0200
+@@ -234,4 +234,3 @@
+ 
+ } // namespace a11y
+ } // namespace mozilla
+-

+ 151 - 0
mozilla-esr52/patches/1415470-part2-VS2017-version.patch

@@ -0,0 +1,151 @@
+
+# HG changeset patch
+# User Chris Peterson <cpeterson@mozilla.com>
+# Date 1510367093 28800
+# Node ID 819ad76c63771b74401946c31b136a37cffbf611
+# Parent  3f70b1d6de57a4bce95befff481fe75c0781878b
+Bug 1415470 - build: Remove always-true version check for VS >= 2015. r=glandium
+
+MozReview-Commit-ID: 1e4Xsw3U3LR
+
+diff -r 3f70b1d6de57 js/src/old-configure.in
+--- a/js/src/old-configure.in	Mon Nov 06 23:54:53 2017 -0800
++++ b/js/src/old-configure.in	Mon Aug 13 23:58:15 2018 +0200
+@@ -181,27 +181,24 @@
+         AC_DEFINE(_CRT_NONSTDC_NO_WARNINGS)
+         AC_DEFINE(_USE_MATH_DEFINES) # Otherwise MSVC's math.h doesn't #define M_PI.
+ 
+-        case "$CC_VERSION" in
+-        19*)
+-            _CC_SUITE=14
+-            MSVS_VERSION=2015
+-            MSVC_C_RUNTIME_DLL=vcruntime140.dll
+-            MSVC_CXX_RUNTIME_DLL=msvcp140.dll
++        _CC_SUITE=14
++        MSVS_VERSION=2015
++        MSVC_C_RUNTIME_DLL=vcruntime140.dll
++        MSVC_CXX_RUNTIME_DLL=msvcp140.dll
+ 
+-            # C5026: move constructor was implicitly defined as deleted
+-            CXXFLAGS="$CXXFLAGS -wd5026"
++        # C5026: move constructor was implicitly defined as deleted
++        CXXFLAGS="$CXXFLAGS -wd5026"
+ 
+-            # C5027: move assignment operator was implicitly defined as deleted
+-            CXXFLAGS="$CXXFLAGS -wd5027"
+-
+-            # -Zc:sizedDealloc- disables C++14 global sized deallocation (see bug 1160146)
+-            CXXFLAGS="$CXXFLAGS -Zc:sizedDealloc-"
++        # C5027: move assignment operator was implicitly defined as deleted
++        CXXFLAGS="$CXXFLAGS -wd5027"
+ 
+-            # Disable C++11 thread-safe statics due to crashes on XP (bug 1204752)
+-            # See https://connect.microsoft.com/VisualStudio/feedback/details/1789709/visual-c-2015-runtime-broken-on-windows-server-2003-c-11-magic-statics
+-            CXXFLAGS="$CXXFLAGS -Zc:threadSafeInit-"
+-            ;;
+-        esac
++        # -Zc:sizedDealloc- disables C++14 global sized deallocation (see bug 1160146)
++        CXXFLAGS="$CXXFLAGS -Zc:sizedDealloc-"
++
++        # Disable C++11 thread-safe statics due to crashes on XP (bug 1204752)
++        # See https://connect.microsoft.com/VisualStudio/feedback/details/1789709/visual-c-2015-runtime-broken-on-windows-server-2003-c-11-magic-statics
++        CXXFLAGS="$CXXFLAGS -Zc:threadSafeInit-"
++
+         AC_SUBST(MSVS_VERSION)
+         AC_SUBST(MSVC_C_RUNTIME_DLL)
+         AC_SUBST(MSVC_CXX_RUNTIME_DLL)
+diff -r 3f70b1d6de57 old-configure.in
+--- a/old-configure.in	Mon Nov 06 23:54:53 2017 -0800
++++ b/old-configure.in	Mon Aug 13 23:58:15 2018 +0200
+@@ -237,50 +237,47 @@
+         AC_DEFINE(_CRT_NONSTDC_NO_WARNINGS)
+         AC_DEFINE(_USE_MATH_DEFINES) # Otherwise MSVC's math.h doesn't #define M_PI.
+ 
+-        case "$CC_VERSION" in
+-        19*)
+-            _CC_SUITE=14
+-            MSVS_VERSION=2015
+-            MSVC_C_RUNTIME_DLL=vcruntime140.dll
+-            MSVC_CXX_RUNTIME_DLL=msvcp140.dll
+-
+-            MOZ_CHECK_HEADER(dia2.h, MSVC_HAS_DIA_SDK=1)
+-            if test -n "$MSVC_HAS_DIA_SDK"; then
+-                AC_DEFINE(MSVC_HAS_DIA_SDK)
+-            fi
+-
+-            # C5026: move constructor was implicitly defined as deleted
+-            CXXFLAGS="$CXXFLAGS -wd5026"
+-
+-            # C5027: move assignment operator was implicitly defined as deleted
+-            CXXFLAGS="$CXXFLAGS -wd5027"
+-
+-            # -Zc:sizedDealloc- disables C++14 global sized deallocation (see bug 1160146)
+-            CXXFLAGS="$CXXFLAGS -Zc:sizedDealloc-"
+-
+-            # Disable C++11 thread-safe statics due to crashes on XP (bug 1204752)
+-            # See https://connect.microsoft.com/VisualStudio/feedback/details/1789709/visual-c-2015-runtime-broken-on-windows-server-2003-c-11-magic-statics
+-            CXXFLAGS="$CXXFLAGS -Zc:threadSafeInit-"
+-
+-            # https://connect.microsoft.com/VisualStudio/feedback/details/888527/warnings-on-dbghelp-h
+-            # for dbghelp.h, imagehlp.h, and shobj.h
+-            # C4091: 'typedef ': ignored on left of '' when no variable is declared
+-            CFLAGS="$CFLAGS -wd4091"
+-            CXXFLAGS="$CXXFLAGS -wd4091"
+-
+-            # This is intended as a temporary hack to support building with VS2015.
+-            # 'noexcept' used with no exception handling mode specified;
+-            # termination on exception is not guaranteed. Specify /EHsc
+-            CXXFLAGS="$CXXFLAGS -wd4577"
+-
+-            if test -n "$WIN_UCRT_REDIST_DIR"; then
+-              if test ! -d "$WIN_UCRT_REDIST_DIR"; then
+-                AC_MSG_ERROR([Invalid Windows UCRT Redist directory: ${WIN_UCRT_REDIST_DIR}])
+-              fi
+-              WIN_UCRT_REDIST_DIR=`cd "$WIN_UCRT_REDIST_DIR" && pwd -W`
+-            fi
+-            ;;
+-        esac
++        _CC_SUITE=14
++        MSVS_VERSION=2015
++        MSVC_C_RUNTIME_DLL=vcruntime140.dll
++        MSVC_CXX_RUNTIME_DLL=msvcp140.dll
++
++        MOZ_CHECK_HEADER(dia2.h, MSVC_HAS_DIA_SDK=1)
++        if test -n "$MSVC_HAS_DIA_SDK"; then
++            AC_DEFINE(MSVC_HAS_DIA_SDK)
++        fi
++
++        # C5026: move constructor was implicitly defined as deleted
++        CXXFLAGS="$CXXFLAGS -wd5026"
++
++        # C5027: move assignment operator was implicitly defined as deleted
++        CXXFLAGS="$CXXFLAGS -wd5027"
++
++        # -Zc:sizedDealloc- disables C++14 global sized deallocation (see bug 1160146)
++        CXXFLAGS="$CXXFLAGS -Zc:sizedDealloc-"
++
++        # Disable C++11 thread-safe statics due to crashes on XP (bug 1204752)
++        # See https://connect.microsoft.com/VisualStudio/feedback/details/1789709/visual-c-2015-runtime-broken-on-windows-server-2003-c-11-magic-statics
++        CXXFLAGS="$CXXFLAGS -Zc:threadSafeInit-"
++
++        # https://connect.microsoft.com/VisualStudio/feedback/details/888527/warnings-on-dbghelp-h
++        # for dbghelp.h, imagehlp.h, and shobj.h
++        # C4091: 'typedef ': ignored on left of '' when no variable is declared
++        CFLAGS="$CFLAGS -wd4091"
++        CXXFLAGS="$CXXFLAGS -wd4091"
++
++        # This is intended as a temporary hack to support building with VS2015.
++        # 'noexcept' used with no exception handling mode specified;
++        # termination on exception is not guaranteed. Specify /EHsc
++        CXXFLAGS="$CXXFLAGS -wd4577"
++
++        if test -n "$WIN_UCRT_REDIST_DIR"; then
++          if test ! -d "$WIN_UCRT_REDIST_DIR"; then
++            AC_MSG_ERROR([Invalid Windows UCRT Redist directory: ${WIN_UCRT_REDIST_DIR}])
++          fi
++          WIN_UCRT_REDIST_DIR=`cd "$WIN_UCRT_REDIST_DIR" && pwd -W`
++        fi
++
+         AC_SUBST(MSVS_VERSION)
+         AC_SUBST(MSVC_HAS_DIA_SDK)
+         AC_SUBST(MSVC_C_RUNTIME_DLL)

+ 194 - 0
mozilla-esr52/patches/1415470-part3-VS2017-C5038.patch

@@ -0,0 +1,194 @@
+
+# HG changeset patch
+# User Chris Peterson <cpeterson@mozilla.com>
+# Date 1510113130 28800
+# Node ID 7e35281e0eafbc99ee94d182dfb11d4492f89120
+# Parent  80321751676ec9535c9ffa3f3b5abad08ecb64de
+Bug 1415470 - build: Enable VS2017 C5038 initializer list order warnings (like gcc -Wreorder). r=glandium
+
+C5038 is a new warning in VS2017, similar to gcc and clang's -Wreorder, which is enabled by -Wall. We should enable C5038 so Windows developers can see these warnings locally instead of when gcc and clang fail with warnings-as-errors on Try.
+
+https://blogs.msdn.microsoft.com/vcblog/2017/07/21/diagnostic-improvements-in-vs2017-15-3-0/
+
+We need to suppress C5038 warnings from Windows Runtime Library header files (wrl.h) included in ANGLE and widget/windows:
+
+z:\build\build\src\vs2017_15.4.2\SDK\Include\10.0.15063.0\winrt\wrl\wrappers\corewrappers.h(515): error C5038: data member 'Microsoft::WRL::Wrappers::Details::SyncLockWithStatusT<Microsoft::WRL::Wrappers::HandleTraits::SemaphoreTraits>::sync_' will be initialized after data member 'Microsoft::WRL::Wrappers::Details::SyncLockWithStatusT<Microsoft::WRL::Wrappers::HandleTraits::SemaphoreTraits>::status_'
+...
+
+And suppress C5038 warnings in upstream webrtc code:
+
+media/webrtc/trunk/webrtc/modules/video_capture/windows/BaseFilter.cpp(176): error C5038: data member 'mozilla::media::BaseFilter::mClsId' will be initialized after data member 'mozilla::media::BaseFilter::mState'
+media/webrtc/trunk/webrtc/modules/video_capture/windows/BasePin.cpp(169): error C5038: data member 'mozilla::media::BasePin::mFilter' will be initialized after data member 'mozilla::media::BasePin::mLock'
+media/webrtc/trunk/webrtc/modules/video_capture/windows/BasePin.cpp(170): error C5038: data member 'mozilla::media::BasePin::mLock' will be initialized after data member 'mozilla::media::BasePin::mName'
+media/webrtc/trunk/webrtc/modules/video_capture/windows/BasePin.cpp(172): error C5038: data member 'mozilla::media::BasePin::mDirection' will be initialized after data member 'mozilla::media::BasePin::mQualitySink'
+
+MozReview-Commit-ID: BMDVkvQXNoq
+
+diff --git a/gfx/angle/moz.build b/gfx/angle/moz.build
+--- a/gfx/angle/moz.build
++++ b/gfx/angle/moz.build
+@@ -134,16 +134,19 @@ if CONFIG['GNU_CXX']:
+             '-Wno-unused-private-field',
+         ]
+     else:
+         CXXFLAGS += [
+             '-Wno-shadow-compatible-local',
+             '-Wno-shadow-local',
+         ]
+ 
++if CONFIG['_MSC_VER']:
++    CXXFLAGS += ['-wd5038'] # C5038: initializer list order warnings
++
+ if CONFIG['MOZ_DIRECTX_SDK_PATH'] and not CONFIG['MOZ_HAS_WINSDK_WITH_D3D']:
+     LOCAL_INCLUDES += ['%' + '%s/include/' % CONFIG['MOZ_DIRECTX_SDK_PATH']]
+ 
+ DEFINES['_CRT_SECURE_NO_DEPRECATE'] = True
+ DEFINES['_HAS_EXCEPTIONS'] = 0
+ 
+ if not CONFIG['MOZ_DEBUG']:
+     DEFINES['_SECURE_SCL'] = 0
+diff --git a/gfx/angle/src/libANGLE/moz.build b/gfx/angle/src/libANGLE/moz.build
+--- a/gfx/angle/src/libANGLE/moz.build
++++ b/gfx/angle/src/libANGLE/moz.build
+@@ -352,16 +352,17 @@ if CONFIG['GNU_CXX']:
+             '-Wno-shadow-compatible-local',
+             '-Wno-shadow-local',
+         ]
+ 
+ if CONFIG['_MSC_VER'] and not CONFIG['CLANG_CL']:
+     CXXFLAGS += [
+         '-wd4018', # '>' : signed/unsigned mismatch
+         '-wd4530', # C++ exception handler used, without /EHsc
++        '-wd5038', # C5038: initializer list order warnings
+     ]
+ 
+ if CONFIG['MOZ_DIRECTX_SDK_PATH'] and not CONFIG['MOZ_HAS_WINSDK_WITH_D3D']:
+     LOCAL_INCLUDES += ['%' + '%s/include/' % CONFIG['MOZ_DIRECTX_SDK_PATH']]
+ 
+ DEFINES['_CRT_SECURE_NO_DEPRECATE'] = True
+ DEFINES['_HAS_EXCEPTIONS'] = 0
+ 
+diff --git a/gfx/angle/src/libGLESv2/moz.build b/gfx/angle/src/libGLESv2/moz.build
+--- a/gfx/angle/src/libGLESv2/moz.build
++++ b/gfx/angle/src/libGLESv2/moz.build
+@@ -34,16 +34,19 @@ if CONFIG['GNU_CXX']:
+             '-Wno-unused-private-field',
+         ]
+     else:
+         CXXFLAGS += [
+             '-Wno-shadow-compatible-local',
+             '-Wno-shadow-local',
+         ]
+ 
++if CONFIG['_MSC_VER']:
++    CXXFLAGS += ['-wd5038'] # C5038: initializer list order warnings
++
+ if CONFIG['MOZ_DIRECTX_SDK_PATH'] and not CONFIG['MOZ_HAS_WINSDK_WITH_D3D']:
+     LOCAL_INCLUDES += ['%' + '%s/include/' % CONFIG['MOZ_DIRECTX_SDK_PATH']]
+ 
+ DEFINES['_CRT_SECURE_NO_DEPRECATE'] = True
+ DEFINES['_HAS_EXCEPTIONS'] = 0
+ 
+ if not CONFIG['MOZ_DEBUG']:
+     DEFINES['_SECURE_SCL'] = 0
+diff --git a/js/src/old-configure.in b/js/src/old-configure.in
+--- a/js/src/old-configure.in
++++ b/js/src/old-configure.in
+@@ -176,16 +176,26 @@ case "$target" in
+         changequote([,])
+ 
+         _MSC_VER=`echo ${CC_VERSION} | cut -c 1-2,4-5`
+ 
+         AC_DEFINE(_CRT_SECURE_NO_WARNINGS)
+         AC_DEFINE(_CRT_NONSTDC_NO_WARNINGS)
+         AC_DEFINE(_USE_MATH_DEFINES) # Otherwise MSVC's math.h doesn't #define M_PI.
+ 
++        if test "$_MSC_VER" -ge "1910"; then # VS2017+
++            # C5038: Enable initializer list order warnings
++            # The -w1#### flag treats warning C#### as if it was a warning level
++            # 1 warning, and thus enables it because we enable /W3 warnings. We
++            # don't use -we#### because it would enable warning C#### but treat
++            # it as an error, even in third-party code.
++            # https://docs.microsoft.com/en-us/cpp/build/reference/compiler-option-warning-level
++            CXXFLAGS="$CXXFLAGS -w15038"
++        fi
++
+         _CC_SUITE=14
+         MSVS_VERSION=2015
+         MSVC_C_RUNTIME_DLL=vcruntime140.dll
+         MSVC_CXX_RUNTIME_DLL=msvcp140.dll
+ 
+         # C5026: move constructor was implicitly defined as deleted
+         CXXFLAGS="$CXXFLAGS -wd5026"
+ 
+diff --git a/media/webrtc/moz.build b/media/webrtc/moz.build
+--- a/media/webrtc/moz.build
++++ b/media/webrtc/moz.build
+@@ -94,17 +94,20 @@ if CONFIG['MOZ_WEBRTC_SIGNALING']:
+     GYP_DIRS['signaling'].sandbox_vars['ALLOW_COMPILER_WARNINGS'] = True
+     GYP_DIRS['signaling'].non_unified_sources += signaling_non_unified_sources
+ 
+     if CONFIG['_MSC_VER']:
+         # Avoid warnings from third-party code that we can not modify.
+         if CONFIG['CLANG_CL']:
+             CXXFLAGS += ['-Wno-invalid-source-encoding']
+         else:
+-            CXXFLAGS += ['-validate-charset-']
++            CXXFLAGS += [
++                '-validate-charset-',
++                '-wd5038', # C5038 initializer list order warnings
++            ]
+ 
+ if CONFIG['MOZ_WIDGET_TOOLKIT'] != 'gonk':
+     GYP_DIRS += ['trunk/testing']
+     GYP_DIRS['trunk/testing'].input = 'trunk/testing/gtest.gyp'
+     GYP_DIRS['trunk/testing'].variables = gyp_vars
+     # We allow warnings for third-party code that can be updated from upstream.
+     GYP_DIRS['trunk/testing'].sandbox_vars['ALLOW_COMPILER_WARNINGS'] = True
+     GYP_DIRS['trunk/testing'].non_unified_sources += webrtc_non_unified_sources
+diff --git a/old-configure.in b/old-configure.in
+--- a/old-configure.in
++++ b/old-configure.in
+@@ -242,16 +242,26 @@ case "$target" in
+         MSVC_C_RUNTIME_DLL=vcruntime140.dll
+         MSVC_CXX_RUNTIME_DLL=msvcp140.dll
+ 
+         MOZ_CHECK_HEADER(dia2.h, MSVC_HAS_DIA_SDK=1)
+         if test -n "$MSVC_HAS_DIA_SDK"; then
+             AC_DEFINE(MSVC_HAS_DIA_SDK)
+         fi
+ 
++        if test "$_MSC_VER" -ge "1910"; then # VS2017+
++            # C5038: Enable initializer list order warnings
++            # The -w1#### flag treats warning C#### as if it was a warning level
++            # 1 warning, and thus enables it because we enable /W3 warnings. We
++            # don't use -we#### because it would enable warning C#### but treat
++            # it as an error, even in third-party code.
++            # https://docs.microsoft.com/en-us/cpp/build/reference/compiler-option-warning-level
++            CXXFLAGS="$CXXFLAGS -w15038"
++        fi
++
+         # C5026: move constructor was implicitly defined as deleted
+         CXXFLAGS="$CXXFLAGS -wd5026"
+ 
+         # C5027: move assignment operator was implicitly defined as deleted
+         CXXFLAGS="$CXXFLAGS -wd5027"
+ 
+         # -Zc:sizedDealloc- disables C++14 global sized deallocation (see bug 1160146)
+         CXXFLAGS="$CXXFLAGS -Zc:sizedDealloc-"
+diff --git a/widget/windows/moz.build b/widget/windows/moz.build
+--- a/widget/windows/moz.build
++++ b/widget/windows/moz.build
+@@ -116,8 +116,12 @@ for var in ('MOZ_ENABLE_D3D10_LAYER'):
+ 
+ RESFILE = 'widget.res'
+ 
+ CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS']
+ 
+ OS_LIBS += [
+     'rpcrt4',
+ ]
++
++if CONFIG['_MSC_VER']:
++    # C5038: Suppress initializer list order warnings from wrl.h
++    SOURCES['WindowsUIUtils.cpp'].flags += ['-wd5038']

+ 35 - 0
mozilla-esr52/patches/1423694-VS2017-155.patch

@@ -0,0 +1,35 @@
+
+# HG changeset patch
+# User Ryan VanderMeulen <ryanvm@gmail.com>
+# Date 1512697654 18000
+# Node ID cab8279fe830c871b8fd7f465d66d584e834b96c
+# Parent  7e9987e8d4ab5019aba8ba7bd648f352f087cdfc
+Bug 1423649 - Fix compiler errors that happen when building with VS2017 15.5.
+
+diff -r 7e9987e8d4ab memory/mozalloc/mozalloc.h
+--- a/memory/mozalloc/mozalloc.h	Sat Oct 14 21:09:05 2017 -0400
++++ b/memory/mozalloc/mozalloc.h	Mon Aug 13 22:07:41 2018 +0200
+@@ -173,7 +173,11 @@
+ /*
+  * Suppress build warning spam (bug 578546).
+  */
++#if _MSC_VER < 1912
+ #define MOZALLOC_THROW_IF_HAS_EXCEPTIONS
++#else
++#define MOZALLOC_THROW_IF_HAS_EXCEPTIONS throw()
++#endif
+ #define MOZALLOC_THROW_BAD_ALLOC_IF_HAS_EXCEPTIONS
+ #else
+ #define MOZALLOC_THROW_IF_HAS_EXCEPTIONS throw()
+diff -r 7e9987e8d4ab old-configure.in
+--- a/old-configure.in	Sat Oct 14 21:09:05 2017 -0400
++++ b/old-configure.in	Mon Aug 13 22:07:41 2018 +0200
+@@ -1137,6 +1137,8 @@
+         # make 'foo == bar;' error out
+         CFLAGS="$CFLAGS -we4553"
+         CXXFLAGS="$CXXFLAGS -we4553"
++        # Silence VS2017 15.5+ TR1 deprecation warnings hit by older gtest versions
++        CXXFLAGS="$CXXFLAGS -D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING"
+         LIBS="$LIBS kernel32.lib user32.lib gdi32.lib winmm.lib wsock32.lib advapi32.lib secur32.lib"
+         MOZ_DEBUG_LDFLAGS='-DEBUG -DEBUGTYPE:CV'
+         WARNINGS_AS_ERRORS='-WX'

+ 86 - 0
mozilla-esr52/patches/1484184.patch

@@ -0,0 +1,86 @@
+
+# HG changeset patch
+# User Masatoshi Kimura <VYV03354@nifty.ne.jp>
+# Date 1534436849 -32400
+# Node ID c66cc808862f6c77361be44b38e78e86b4aa7c69
+# Parent  b1b6c8ba677347f013305e10c08b64ad4654b54f
+Bug 1484184 - Remove now unused _RAISE macro check to deal with MSVC 2017 15.8. r=froydnj
+
+diff --git a/memory/mozalloc/moz.build b/memory/mozalloc/moz.build
+--- a/memory/mozalloc/moz.build
++++ b/memory/mozalloc/moz.build
+@@ -11,20 +11,19 @@ EXPORTS.mozilla += [
+     'mozalloc_oom.h',
+ ]
+ 
+ if CONFIG['WRAP_STL_INCLUDES']:
+     if CONFIG['GNU_CXX']:
+         EXPORTS.mozilla += ['throw_gcc.h']
+     elif CONFIG['_MSC_VER']:
+         DEFINES['_HAS_EXCEPTIONS'] = 0
+-        if CONFIG['MOZ_MSVC_STL_WRAP_RAISE']:
+-            SOURCES += [
+-                'msvc_raise_wrappers.cpp',
+-            ]
++        SOURCES += [
++            'msvc_raise_wrappers.cpp',
++        ]
+ 
+ if CONFIG['OS_TARGET'] == 'WINNT':
+     # Keep this file separate to avoid #include'ing windows.h everywhere.
+     SOURCES += [
+         'winheap.cpp',
+     ]
+ 
+ UNIFIED_SOURCES += [
+diff --git a/old-configure.in b/old-configure.in
+--- a/old-configure.in
++++ b/old-configure.in
+@@ -318,45 +318,18 @@ case "$target" in
+             ;;
+         x86_64-*)
+             MIDL_FLAGS="${MIDL_FLAGS} -env x64"
+             ;;
+         esac
+ 
+         unset _MSVC_VER_FILTER
+ 
+-        AC_CACHE_CHECK(for overridable _RAISE,
+-                       ac_cv_have__RAISE,
+-            [
+-                AC_LANG_SAVE
+-                AC_LANG_CPLUSPLUS
+-                _SAVE_CXXFLAGS="$CXXFLAGS"
+-                CXXFLAGS="${CXXFLAGS} -D_HAS_EXCEPTIONS=0"
+-                AC_TRY_COMPILE([#include <xstddef>
+-                                #undef _RAISE
+-                                #define _RAISE(x) externallyDefinedFunction((x).what())
+-                                #include <vector>
+-                               ],
+-                               [std::vector<int> v; return v.at(1);],
+-                               ac_cv_have__RAISE="no",
+-                               ac_cv_have__RAISE="yes")
+-                CXXFLAGS="$_SAVE_CXXFLAGS"
+-                AC_LANG_RESTORE
+-            ])
+-        if test "$ac_cv_have__RAISE" = "yes"; then
+-            WRAP_STL_INCLUDES=1
+-            MOZ_MSVC_STL_WRAP_RAISE=1
+-            AC_DEFINE(MOZ_MSVC_STL_WRAP_RAISE)
+-        else
+-            AC_MSG_ERROR([Gecko exception wrapping doesn't understand your your MSVC/SDK.  Please file a bug describing this error and your build configuration.])
+-        fi
+-
+-        if test "$WRAP_STL_INCLUDES" = "1"; then
+-            STL_FLAGS="-I${DIST}/stl_wrappers"
+-        fi
++        WRAP_STL_INCLUDES=1
++        STL_FLAGS="-I${DIST}/stl_wrappers"
+         CFLAGS="$CFLAGS -D_HAS_EXCEPTIONS=0"
+         CXXFLAGS="$CXXFLAGS -D_HAS_EXCEPTIONS=0"
+     else
+         # Check w32api version
+         _W32API_MAJOR_VERSION=`echo $W32API_VERSION | $AWK -F\. '{ print $1 }'`
+         _W32API_MINOR_VERSION=`echo $W32API_VERSION | $AWK -F\. '{ print $2 }'`
+         AC_MSG_CHECKING([for w32api version >= $W32API_VERSION])
+         AC_TRY_COMPILE([#include <w32api.h>],

+ 48 - 0
mozilla-esr52/patches/1484190.patch

@@ -0,0 +1,48 @@
+
+# HG changeset patch
+# User Masatoshi Kimura <VYV03354@nifty.ne.jp>
+# Date 1534506109 -32400
+# Node ID 574377aa45865d04eed2713f331c1f553f7f12f7
+# Parent  cb93ee62f8461d7205713327094f784708e1418d
+Bug 1484190 - Unblock MSVC 2017 15.8. r=dmajor
+
+diff --git a/build/moz.configure/toolchain.configure b/build/moz.configure/toolchain.configure
+--- a/build/moz.configure/toolchain.configure
++++ b/build/moz.configure/toolchain.configure
+@@ -729,16 +729,36 @@ def compiler(language, host_or_target, c
+                 raise FatalCheckError(
+                     'This version (%s) of the MSVC compiler is not '
+                     'supported.\n'
+                     'You must install Visual C++ 2015 Update 3 or newer in '
+                     'order to build.\n'
+                     'See https://developer.mozilla.org/en/'
+                     'Windows_Build_Prerequisites' % info.version)
+ 
++            if info.version >= '19.10.0' and info.version < '19.13.26128':
++                raise FatalCheckError(
++                    'This version (%s) of the MSVC compiler is not '
++                    'supported.\n'
++                    'You must install Visual C++ 2017 Update 6 or '
++                    'Update 8 or later in order to build.\n'
++                    'See https://developer.mozilla.org/en/'
++                    'Windows_Build_Prerequisites' % info.version)
++
++            # MSVC version 15.7 and the previews for 15.8, at least,
++            # can't build Firefox.
++            if info.version >= '19.14.0' and info.version < '19.15.26720':
++                raise FatalCheckError(
++                    'This version (%s) of the MSVC compiler is not '
++                    'supported due to compiler bugs.\n'
++                    'You must install Visual C++ 2017 Update 6 or '
++                    'Update 8 or later in order to build.\n'
++                    'See https://developer.mozilla.org/en/'
++                    'Windows_Build_Prerequisites' % info.version)
++
+         return namespace(
+             wrapper=wrapper,
+             compiler=compiler,
+             flags=flags,
+             type=info.type,
+             version=info.version,
+             language=language,
+         )

+ 86 - 0
mozilla-esr52/patches/1485224-1.patch

@@ -0,0 +1,86 @@
+
+# HG changeset patch
+# User Masatoshi Kimura <VYV03354@nifty.ne.jp>
+# Date 1536834138 -32400
+# Node ID 131188fb2361caf66b023dd24b72d21d7cb70d19
+# Parent  91c7687d381bbd5d5ac662ef5feefe965abfd60e
+Bug 1485224 - Make best efforts to write a stack frame atomically. r=froydnj
+
+diff --git a/xpcom/base/nsTraceRefcnt.cpp b/xpcom/base/nsTraceRefcnt.cpp
+--- a/xpcom/base/nsTraceRefcnt.cpp
++++ b/xpcom/base/nsTraceRefcnt.cpp
+@@ -765,38 +765,67 @@ InitTraceLog()
+     gLogging = FullLogging;
+   }
+ }
+ 
+ 
+ extern "C" {
+ 
+ static void
++EnsureWrite(FILE* aStream, const char* aBuf, size_t aLen)
++{
++#ifdef XP_WIN
++  int fd = _fileno(aStream);
++#else
++  int fd = fileno(aStream);
++#endif
++  while (aLen > 0) {
++#ifdef XP_WIN
++    auto written = _write(fd, aBuf, aLen);
++#else
++    auto written = write(fd, aBuf, aLen);
++#endif
++    if (written <= 0 || size_t(written) > aLen) {
++      break;
++    }
++    aBuf += written;
++    aLen -= written;
++  }
++}
++
++static void
+ PrintStackFrame(uint32_t aFrameNumber, void* aPC, void* aSP, void* aClosure)
+ {
+   FILE* stream = (FILE*)aClosure;
+   MozCodeAddressDetails details;
+-  char buf[1024];
++  static const size_t buflen = 1024;
++  char buf[buflen + 1];  // 1 for trailing '\n'
+ 
+   MozDescribeCodeAddress(aPC, &details);
+-  MozFormatCodeAddressDetails(buf, sizeof(buf), aFrameNumber, aPC, &details);
+-  fprintf(stream, "%s\n", buf);
++  MozFormatCodeAddressDetails(buf, buflen, aFrameNumber, aPC, &details);
++  size_t len = std::min(strlen(buf), buflen + 1 - 2);
++  buf[len++] = '\n';
++  buf[len] = '\0';
+   fflush(stream);
++  EnsureWrite(stream, buf, len);
+ }
+ 
+ static void
+ PrintStackFrameCached(uint32_t aFrameNumber, void* aPC, void* aSP,
+                       void* aClosure)
+ {
+   auto stream = static_cast<FILE*>(aClosure);
+   static const size_t buflen = 1024;
+-  char buf[buflen];
+-  gCodeAddressService->GetLocation(aFrameNumber, aPC, buf, buflen);
+-  fprintf(stream, "    %s\n", buf);
++  char buf[buflen + 5] = "    ";  // 5 for leading "    " and trailing '\n'
++  gCodeAddressService->GetLocation(aFrameNumber, aPC, buf + 4, buflen);
++  size_t len = std::min(strlen(buf), buflen + 5 - 2);
++  buf[len++] = '\n';
++  buf[len] = '\0';
+   fflush(stream);
++  EnsureWrite(stream, buf, len);
+ }
+ 
+ static void
+ RecordStackFrame(uint32_t /*aFrameNumber*/, void* aPC, void* /*aSP*/,
+                  void* aClosure)
+ {
+   auto locations = static_cast<std::vector<void*>*>(aClosure);
+   locations->push_back(aPC);
+

+ 47 - 0
mozilla-esr52/patches/1485224-2.patch

@@ -0,0 +1,47 @@
+
+# HG changeset patch
+# User Masatoshi Kimura <VYV03354@nifty.ne.jp>
+# Date 1535467299 -32400
+# Node ID 815d17af6a7e0277bc0c6c60bf745cc2ef425a2b
+# Parent  0efe5d18153fa83cade36fb8ba1f1cc4a5a1bc85
+Bug 1485224 - Workaround a linker bug of MSVC 2017 Update 8. r=glandium
+
+MSVC 15.8 linker dislikes forward slashes in the /OUT: parameter when it is generating a profile
+
+diff --git a/config/rules.mk b/config/rules.mk
+--- a/config/rules.mk
++++ b/config/rules.mk
+@@ -627,25 +627,32 @@ distclean::
+ 	$(wildcard *.$(OBJ_SUFFIX)) $(wildcard *.ho) $(wildcard host_*.o*) \
+ 	$(wildcard *.$(LIB_SUFFIX)) $(wildcard *$(DLL_SUFFIX)) \
+ 	$(wildcard *.$(IMPORT_LIB_SUFFIX))
+ 
+ alltags:
+ 	$(RM) TAGS
+ 	find $(topsrcdir) -name dist -prune -o \( -name '*.[hc]' -o -name '*.cp' -o -name '*.cpp' -o -name '*.idl' \) -print | $(TAG_PROGRAM)
+ 
++# Workaround a bug of MSVC 2017 Update 8 (see bug 1485224)
++ifeq ($(CC_TYPE)_$(HOST_OS_ARCH)_$(MOZ_PROFILE_GENERATE),msvc_WINNT_1)
++LINKER_OUT=$(subst /,\,$1)
++else
++LINKER_OUT=$1
++endif
++
+ #
+ # PROGRAM = Foo
+ # creates OBJS, links with LIBS to create Foo
+ #
+ $(PROGRAM): $(PROGOBJS) $(STATIC_LIBS_DEPS) $(EXTRA_DEPS) $(EXE_DEF_FILE) $(RESFILE) $(GLOBAL_DEPS)
+ 	$(REPORT_BUILD)
+ 	@$(RM) $@.manifest
+ ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
+-	$(EXPAND_LINK) -NOLOGO -OUT:$@ -PDB:$(LINK_PDBFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(MOZ_PROGRAM_LDFLAGS) $(PROGOBJS) $(RESFILE) $(STATIC_LIBS) $(SHARED_LIBS) $(EXTRA_LIBS) $(OS_LIBS)
++	$(EXPAND_LINK) -NOLOGO -OUT:$(call LINKER_OUT,$@) -PDB:$(LINK_PDBFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(MOZ_PROGRAM_LDFLAGS) $(PROGOBJS) $(RESFILE) $(STATIC_LIBS) $(SHARED_LIBS) $(EXTRA_LIBS) $(OS_LIBS)
+ ifdef MSMANIFEST_TOOL
+ 	@if test -f $@.manifest; then \
+ 		if test -f '$(srcdir)/$@.manifest'; then \
+ 			echo 'Embedding manifest from $(srcdir)/$@.manifest and $@.manifest'; \
+ 			$(MT) -NOLOGO -MANIFEST '$(win_srcdir)/$@.manifest' $@.manifest -OUTPUTRESOURCE:$@\;1; \
+ 		else \
+ 			echo 'Embedding manifest from $@.manifest'; \
+ 			$(MT) -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \

+ 124 - 0
mozilla-esr52/patches/9999999-clang-osx.patch.patch

@@ -0,0 +1,124 @@
+# HG changeset patch
+# User Frank-Rainer Grahl <frgrahl@gmx.net>
+# Parent  f9b2f9868d7712cd2803c0e981f6f1f047c6cf62
+Bug 9999999 - Allow macOS cross compile with clang 6 plus VS2017 and later rust fix.
+
+diff -r f9b2f9868d77 media/libvpx/vp9/common/x86/vp9_subpixel_8t_intrin_avx2.c
+--- a/media/libvpx/vp9/common/x86/vp9_subpixel_8t_intrin_avx2.c	Mon Aug 13 22:07:50 2018 +0200
++++ b/media/libvpx/vp9/common/x86/vp9_subpixel_8t_intrin_avx2.c	Mon Aug 13 22:15:27 2018 +0200
+@@ -40,24 +40,27 @@
+ };
+ 
+ #if defined(__clang__)
+-# if __clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ <= 3) || \
+-      (defined(__APPLE__) && __clang_major__ == 5 && __clang_minor__ == 0)
+-#  define MM256_BROADCASTSI128_SI256(x) \
+-       _mm_broadcastsi128_si256((__m128i const *)&(x))
+-# else  // clang > 3.3, and not 5.0 on macosx.
+-#  define MM256_BROADCASTSI128_SI256(x) _mm256_broadcastsi128_si256(x)
+-# endif  // clang <= 3.3
++#if (__clang_major__ > 0 && __clang_major__ < 3) ||            \
++    (__clang_major__ == 3 && __clang_minor__ <= 3) ||          \
++    (defined(__APPLE__) && defined(__apple_build_version__) && \
++     ((__clang_major__ == 4 && __clang_minor__ <= 2) ||        \
++      (__clang_major__ == 5 && __clang_minor__ == 0)))
++#define MM256_BROADCASTSI128_SI256(x) \
++  _mm_broadcastsi128_si256((__m128i const *)&(x))
++#else  // clang > 3.3, and not 5.0 on macosx.
++#define MM256_BROADCASTSI128_SI256(x) _mm256_broadcastsi128_si256(x)
++#endif  // clang <= 3.3
+ #elif defined(__GNUC__)
+-# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ <= 6)
+-#  define MM256_BROADCASTSI128_SI256(x) \
+-       _mm_broadcastsi128_si256((__m128i const *)&(x))
+-# elif __GNUC__ == 4 && __GNUC_MINOR__ == 7
+-#  define MM256_BROADCASTSI128_SI256(x) _mm_broadcastsi128_si256(x)
+-# else  // gcc > 4.7
+-#  define MM256_BROADCASTSI128_SI256(x) _mm256_broadcastsi128_si256(x)
+-# endif  // gcc <= 4.6
+-#else  // !(gcc || clang)
+-# define MM256_BROADCASTSI128_SI256(x) _mm256_broadcastsi128_si256(x)
++#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ <= 6)
++#define MM256_BROADCASTSI128_SI256(x) \
++  _mm_broadcastsi128_si256((__m128i const *)&(x))
++#elif __GNUC__ == 4 && __GNUC_MINOR__ == 7
++#define MM256_BROADCASTSI128_SI256(x) _mm_broadcastsi128_si256(x)
++#else  // gcc > 4.7
++#define MM256_BROADCASTSI128_SI256(x) _mm256_broadcastsi128_si256(x)
++#endif  // gcc <= 4.6
++#else   // !(gcc || clang)
++#define MM256_BROADCASTSI128_SI256(x) _mm256_broadcastsi128_si256(x)
+ #endif  // __clang__
+ 
+ static void vp9_filter_block1d16_h8_avx2(const uint8_t *src_ptr,
+diff -r f9b2f9868d77 mfbt/Compression.cpp
+--- a/mfbt/Compression.cpp	Mon Aug 13 22:07:50 2018 +0200
++++ b/mfbt/Compression.cpp	Mon Aug 13 22:15:27 2018 +0200
+@@ -12,6 +12,15 @@
+ // corecrt_memory.h.
+ #include <string>
+ 
++// Because we wrap lz4.c in an anonymous namespace, all of its #includes
++// go in the anonymous namespace too. This would create conflicting
++// declarations for intrinsic functions that are internally defined
++// at top-level. Including intrin.h here prevents it from being included
++// later within the anonymous namespace.
++#ifdef _MSC_VER
++#include <intrin.h>
++#endif
++
+ using namespace mozilla::Compression;
+ 
+ namespace {
+diff -r f9b2f9868d77 toolkit/library/gtest/rust/Cargo.lock
+--- a/toolkit/library/gtest/rust/Cargo.lock	Mon Aug 13 22:07:50 2018 +0200
++++ b/toolkit/library/gtest/rust/Cargo.lock	Mon Aug 13 22:15:27 2018 +0200
+@@ -1,4 +1,9 @@
+-[root]
++[[package]]
++name = "byteorder"
++version = "0.5.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
+ name = "gkrust-gtest"
+ version = "0.1.0"
+ dependencies = [
+@@ -8,11 +13,6 @@
+ ]
+ 
+ [[package]]
+-name = "byteorder"
+-version = "0.5.3"
+-source = "registry+https://github.com/rust-lang/crates.io-index"
+-
+-[[package]]
+ name = "gkrust-shared"
+ version = "0.1.0"
+ dependencies = [
+diff -r f9b2f9868d77 toolkit/library/rust/Cargo.lock
+--- a/toolkit/library/rust/Cargo.lock	Mon Aug 13 22:07:50 2018 +0200
++++ b/toolkit/library/rust/Cargo.lock	Mon Aug 13 22:15:27 2018 +0200
+@@ -1,4 +1,9 @@
+-[root]
++[[package]]
++name = "byteorder"
++version = "0.5.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++
++[[package]]
+ name = "gkrust"
+ version = "0.1.0"
+ dependencies = [
+@@ -6,11 +11,6 @@
+ ]
+ 
+ [[package]]
+-name = "byteorder"
+-version = "0.5.3"
+-source = "registry+https://github.com/rust-lang/crates.io-index"
+-
+-[[package]]
+ name = "gkrust-shared"
+ version = "0.1.0"
+ dependencies = [

+ 39 - 0
mozilla-esr52/patches/9999999-psutil.patch

@@ -0,0 +1,39 @@
+# HG changeset patch
+# User Frank-Rainer Grahl <frgrahl@gmx.net>
+# Parent  f9b2f9868d7712cd2803c0e981f6f1f047c6cf62
+Bug 9999999 - Fix compiler warnings in upstream psutil.
+
+diff -r f9b2f9868d77 python/psutil/psutil/arch/windows/ntextapi.h
+--- a/python/psutil/psutil/arch/windows/ntextapi.h	Mon Aug 13 22:07:50 2018 +0200
++++ b/python/psutil/psutil/arch/windows/ntextapi.h	Mon Aug 13 22:15:27 2018 +0200
+@@ -186,7 +186,7 @@
+     ProcessTimes,
+     ProcessBasePriority,
+     ProcessRaisePriority,
+-    ProcessDebugPort,
++    _ProcessDebugPort,
+     ProcessExceptionPort,
+     ProcessAccessToken,
+     ProcessLdtInformation,
+@@ -207,9 +207,9 @@
+     ProcessForegroundInformation,
+     _ProcessWow64Information,
+     /* added after XP+ */
+-    ProcessImageFileName,
++    _ProcessImageFileName,
+     ProcessLUIDDeviceMapsEnabled,
+-    ProcessBreakOnTermination,
++    _ProcessBreakOnTermination,
+     ProcessDebugObjectHandle,
+     ProcessDebugFlags,
+     ProcessHandleTracing,
+@@ -223,6 +223,9 @@
+ 
+ #define PROCESSINFOCLASS PROCESSINFOCLASS2
+ #define ProcessBasicInformation _ProcessBasicInformation
++#define ProcessDebugPort _ProcessDebugPort
++#define ProcessImageFileName _ProcessImageFileName
++#define ProcessBreakOnTermination _ProcessBreakOnTermination
+ #define ProcessWow64Information _ProcessWow64Information
+ 
+ #endif // __NTEXTAPI_H__

+ 46 - 0
mozilla-esr52/patches/9999999-search.patch

@@ -0,0 +1,46 @@
+# HG changeset patch
+# User Frank-Rainer Grahl <frgrahl@gmx.net>
+# Parent  f9b2f9868d7712cd2803c0e981f6f1f047c6cf62
+Bug 9999999 - Use Windows 7 search icon on Windows 8.x.
+
+diff -r f9b2f9868d77 toolkit/themes/windows/global/global.css
+--- a/toolkit/themes/windows/global/global.css	Mon Aug 13 22:07:50 2018 +0200
++++ b/toolkit/themes/windows/global/global.css	Mon Aug 13 22:15:27 2018 +0200
+@@ -352,7 +352,8 @@
+ 
+ @media (-moz-os-version: windows-xp),
+        (-moz-os-version: windows-vista),
+-       (-moz-os-version: windows-win7) {
++       (-moz-os-version: windows-win7),
++       (-moz-os-version: windows-win8) {
+   .close-icon {
+     -moz-image-region: rect(0, 16px, 16px, 0);
+   }
+@@ -388,7 +389,8 @@
+ 
+   @media (-moz-os-version: windows-xp),
+          (-moz-os-version: windows-vista),
+-         (-moz-os-version: windows-win7) {
++         (-moz-os-version: windows-win7),
++         (-moz-os-version: windows-win8) {
+     .close-icon {
+       -moz-image-region: rect(0, 32px, 32px, 0);
+     }
+diff -r f9b2f9868d77 toolkit/themes/windows/global/jar.mn
+--- a/toolkit/themes/windows/global/jar.mn	Mon Aug 13 22:07:50 2018 +0200
++++ b/toolkit/themes/windows/global/jar.mn	Mon Aug 13 22:15:27 2018 +0200
+@@ -122,10 +122,10 @@
+ % override chrome://global/skin/tree/sort-asc.png                 chrome://global/skin/tree/sort-asc-XP.png                osversion<6
+ % override chrome://global/skin/tree/sort-dsc.png                 chrome://global/skin/tree/sort-dsc-XP.png                osversion<6
+ 
+-% override chrome://global/skin/icons/close.png                   chrome://global/skin/icons/close-XPVista7.png            osversion<=6.1
+-% override chrome://global/skin/icons/close@2x.png                chrome://global/skin/icons/close-XPVista7@2x.png         osversion<=6.1
+-% override chrome://global/skin/icons/close-inverted.png          chrome://global/skin/icons/close-inverted-XPVista7.png   osversion<=6.1
+-% override chrome://global/skin/icons/close-inverted@2x.png       chrome://global/skin/icons/close-inverted-XPVista7@2x.png osversion<=6.1
++% override chrome://global/skin/icons/close.png                   chrome://global/skin/icons/close-XPVista7.png            osversion<=6.3
++% override chrome://global/skin/icons/close@2x.png                chrome://global/skin/icons/close-XPVista7@2x.png         osversion<=6.3
++% override chrome://global/skin/icons/close-inverted.png          chrome://global/skin/icons/close-inverted-XPVista7.png   osversion<=6.3
++% override chrome://global/skin/icons/close-inverted@2x.png       chrome://global/skin/icons/close-inverted-XPVista7@2x.png osversion<=6.3
+ 
+ % override chrome://global/skin/tree/twisty.svg#clsd              chrome://global/skin/tree/twisty-Vista78.svg#clsd           osversion<=6.3
+ % override chrome://global/skin/tree/twisty.svg#clsd-rtl          chrome://global/skin/tree/twisty-Vista78.svg#clsd-rtl       osversion<=6.3

+ 42 - 0
mozilla-esr52/patches/9999999-vs2017-x86.patch

@@ -0,0 +1,42 @@
+# HG changeset patch
+# User Frank-Rainer Grahl <frgrahl@gmx.net>
+# Parent  f84791796fb86af664ef2896030e492581d8fa55
+Bug 9999999 - Support building comm-central x86 with VS2017.
+
+diff --git a/security/sandbox/win/wow_helper/Makefile.in b/security/sandbox/win/wow_helper/Makefile.in
+--- a/security/sandbox/win/wow_helper/Makefile.in
++++ b/security/sandbox/win/wow_helper/Makefile.in
+@@ -16,26 +16,32 @@ lazy = $(if $(___$(1)),,$(eval ___$(1) :
+ # to do the conversion for us by calling python with an environment variable
+ # with the result of the call to `which`. Then munge that path to add the
+ # x64 cross-compiler path.
+ ifdef MOZ_USING_COMPILER_WRAPPER
+ ORIG_CXX := cl
+ else
+ ORIG_CXX := $(CXX)
+ endif
++
++# The path layout changed in VS2017.
++ifeq ($(_MSC_VER),1900)
+ CXX = $(call lazy,CXX,"$$(subst amd64_x86/x86_amd64/,amd64/,$$(shell CL=`which "$(ORIG_CXX)"` $(PYTHON) -c 'import os; print os.path.dirname(os.environ["CL"])')/x86_amd64/cl.exe)")
++else
++CXX = $(call lazy,CXX,"$$(subst HostX64/x86/,HostX64/x64/,$$(shell CL=`which "$(ORIG_CXX)"` $(PYTHON) -c 'import os; print os.path.dirname(os.environ["CL"])')/cl.exe)")
++endif
+ 
+ MOZ_WINCONSOLE = 0
+ 
+ include $(topsrcdir)/config/config.mk
+ 
+ # Munge the LIB variable to contain paths to the x64 CRT and system libraries.
+ # Unconveniently, none of the paths have the same convention, including the
+ # compiler path above.
+-LIB = $(call lazy,LIB,$$(shell python -c 'import os; print ";".join(s.lower().replace(os.sep, "/").replace("/vc/lib", "/vc/lib/amd64").replace("/um/x86", "/um/x64").replace("/ucrt/x86", "/ucrt/x64") for s in os.environ["LIB"].split(";"))'))
++LIB = $(call lazy,LIB,$$(shell python -c 'import os; print ";".join(s.lower().replace(os.sep, "/").replace("/vc/lib", "/vc/lib/amd64").replace("/um/x86", "/um/x64").replace("/ucrt/x86", "/ucrt/x64").replace("/lib/x86", "/lib/x64") for s in os.environ["LIB"].split(";"))'))
+ 
+ CXXFLAGS := $(filter-out -arch:%,$(CXXFLAGS))
+ 
+ # OS_COMPILE_CXXFLAGS includes mozilla-config.h, which contains x86-specific
+ # defines breaking the build.
+ OS_COMPILE_CXXFLAGS :=
+ 
+ # LNK1246: '/SAFESEH' not compatible with 'x64' target machine

+ 130 - 0
mozilla-esr52/patches/9999999-xpsp3.patch

@@ -0,0 +1,130 @@
+# HG changeset patch
+# User Frank-Rainer Grahl <frgrahl@gmx.net>
+# Parent  36509b1b5328601b101c62dfa7921b91614bd5b3
+Bug 9999999 - Set Windows XP Servicepack 3 with IE 8 as minimum supported level.
+
+diff --git a/browser/installer/windows/nsis/defines.nsi.in b/browser/installer/windows/nsis/defines.nsi.in
+--- a/browser/installer/windows/nsis/defines.nsi.in
++++ b/browser/installer/windows/nsis/defines.nsi.in
+@@ -66,17 +66,17 @@
+ # ARCH is used when it is necessary to differentiate the x64 registry keys from
+ # the x86 registry keys (e.g. the uninstall registry key).
+ #ifdef HAVE_64BIT_BUILD
+ !define HAVE_64BIT_BUILD
+ !define ARCH "x64"
+ !define MinSupportedVer "Microsoft Windows 7 x64"
+ #else
+ !define ARCH "x86"
+-!define MinSupportedVer "Microsoft Windows XP SP2"
++!define MinSupportedVer "Microsoft Windows XP SP3"
+ #endif
+ 
+ !define MinSupportedCPU "SSE2"
+ 
+ #ifdef MOZ_MAINTENANCE_SERVICE
+ !define MOZ_MAINTENANCE_SERVICE
+ #endif
+ 
+diff --git a/js/src/old-configure.in b/js/src/old-configure.in
+--- a/js/src/old-configure.in
++++ b/js/src/old-configure.in
+@@ -128,17 +128,17 @@ else
+ fi
+ 
+ MOZ_TOOL_VARIABLES
+ 
+ dnl Special win32 checks
+ dnl ========================================================
+ 
+ # Target the Windows 8.1 SDK by default
+-WINVER=502
++WINVER=503
+ 
+ case "$target" in
+ *-mingw*)
+     if test "$GCC" != "yes"; then
+         # Check to see if we are really running in a msvc environemnt
+         _WIN32_MSVC=1
+ 
+         # Make sure compilers are valid
+@@ -260,18 +260,18 @@ case "$target" in
+                 "$_WINDRES_RELEASE_VERSION" -lt "$WINDRES_RELEASE_VERSION"
+         then
+             AC_MSG_ERROR([windres version $WINDRES_VERSION or higher is required to build.])
+         fi
+     fi # !GNU_CC
+ 
+     AC_DEFINE_UNQUOTED(WINVER,0x$WINVER)
+     AC_DEFINE_UNQUOTED(_WIN32_WINNT,0x$WINVER)
+-    # Require OS features provided by IE 6.0 SP2 (XP SP2)
+-    AC_DEFINE_UNQUOTED(_WIN32_IE,0x0603)
++    # Require OS features provided by IE 8.0 (XP SP3)
++    AC_DEFINE_UNQUOTED(_WIN32_IE,0x0800)
+ 
+     ;;
+ esac
+ 
+ if test -n "$_WIN32_MSVC"; then
+     SKIP_PATH_CHECKS=1
+     SKIP_COMPILER_CHECKS=1
+     SKIP_LIBRARY_CHECKS=1
+diff --git a/old-configure.in b/old-configure.in
+--- a/old-configure.in
++++ b/old-configure.in
+@@ -198,17 +198,17 @@ if test -n "$MOZ_WINCONSOLE"; then
+ fi
+ 
+ MOZ_TOOL_VARIABLES
+ 
+ dnl ========================================================
+ dnl Special win32 checks
+ dnl ========================================================
+ 
+-WINVER=502
++WINVER=503
+ 
+ case "$target" in
+ *-mingw*)
+     if test "$GCC" != "yes"; then
+         # Check to see if we are really running in a msvc environemnt
+         _WIN32_MSVC=1
+         AC_CHECK_PROGS(MIDL, midl)
+ 
+@@ -377,18 +377,18 @@ case "$target" in
+ 
+         # strsafe.h on mingw uses macros for function deprecation that pollutes namespace
+         # causing problems with local implementations with the same name.
+         AC_DEFINE(STRSAFE_NO_DEPRECATE)
+     fi # !GNU_CC
+ 
+     AC_DEFINE_UNQUOTED(WINVER,0x$WINVER)
+     AC_DEFINE_UNQUOTED(_WIN32_WINNT,0x$WINVER)
+-    # Require OS features provided by IE 6.0 SP2 (XP SP2)
+-    AC_DEFINE_UNQUOTED(_WIN32_IE,0x0603)
++    # Require OS features provided by IE 8.0 (XP SP3)
++    AC_DEFINE_UNQUOTED(_WIN32_IE,0x0800)
+ 
+     ;;
+ esac
+ 
+ if test -n "$_WIN32_MSVC"; then
+     SKIP_PATH_CHECKS=1
+     SKIP_COMPILER_CHECKS=1
+     SKIP_LIBRARY_CHECKS=1
+diff --git a/other-licenses/7zstub/src/7zip/Bundles/SFXSetup-moz/resource.rc b/other-licenses/7zstub/src/7zip/Bundles/SFXSetup-moz/resource.rc
+--- a/other-licenses/7zstub/src/7zip/Bundles/SFXSetup-moz/resource.rc
++++ b/other-licenses/7zstub/src/7zip/Bundles/SFXSetup-moz/resource.rc
+@@ -7,12 +7,12 @@ IDI_ICON3  ICON "setup.ico"
+ 
+ STRINGTABLE
+ BEGIN
+   IDS_EXTRACTION_ERROR_TITLE "Extraction Failed"
+   IDS_EXTRACTION_ERROR_MESSAGE "File is corrupt"
+   IDS_CANNOT_CREATE_FOLDER "Cannot create folder '{0}'"
+   IDS_PROGRESS_EXTRACTING "Extracting"
+   IDS_MIN_OS_TITLE "Setup Error"
+-  IDS_MIN_OS_TEXT "Microsoft Windows XP SP2 or newer is required."
++  IDS_MIN_OS_TEXT "Microsoft Windows XP SP3 or newer is required."
+ END
+ 
+ #include "../../FileManager/Resource/ProgressDialog/resource.rc"

+ 7541 - 0
mozilla-esr52/patches/mozilla-esr52-push_355262.patch

@@ -0,0 +1,7541 @@
+# HG changeset patch
+# User Ryan VanderMeulen <ryanvm@gmail.com>
+# Date 1484106636 18000
+#      Tue Jan 10 22:50:36 2017 -0500
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID 301a46b075293261115b39da1ff5f4d06cc08406
+# Parent  15d9d940341f02ef6dcad96899d284619d3d48db
+Bug 1322027 - Update jemalloc 4 to version 4.4.0. r=glandium a=jorgk
+
+diff --git a/build/autoconf/jemalloc.m4 b/build/autoconf/jemalloc.m4
+--- a/build/autoconf/jemalloc.m4
++++ b/build/autoconf/jemalloc.m4
+@@ -83,16 +83,19 @@ if test "$MOZ_BUILD_APP" != js -o -n "$J
+     # their mozconfig.
+     if test "$_MSC_VER"; then
+        ac_configure_args="$ac_configure_args CFLAGS="
+     fi
+ 
+     # Force disable DSS support in jemalloc.
+     ac_configure_args="$ac_configure_args ac_cv_func_sbrk=false"
+ 
++    # Force disable hugepage support in jemalloc.
++    ac_configure_args="$ac_configure_args je_cv_thp=no"
++
+     # Make Linux builds munmap freed chunks instead of recycling them.
+     ac_configure_args="$ac_configure_args --enable-munmap"
+ 
+     # Disable cache oblivious behavior that appears to have a performance
+     # impact on Firefox.
+     ac_configure_args="$ac_configure_args --disable-cache-oblivious"
+ 
+     if ! test -e memory/jemalloc; then
+diff --git a/memory/jemalloc/src/ChangeLog b/memory/jemalloc/src/ChangeLog
+--- a/memory/jemalloc/src/ChangeLog
++++ b/memory/jemalloc/src/ChangeLog
+@@ -1,14 +1,41 @@
+ Following are change highlights associated with official releases.  Important
+ bug fixes are all mentioned, but some internal enhancements are omitted here for
+ brevity.  Much more detail can be found in the git revision history:
+ 
+     https://github.com/jemalloc/jemalloc
+ 
++* 4.4.0 (December 3, 2016)
++
++  New features:
++  - Add configure support for *-*-linux-android.  (@cferris1000, @jasone)
++  - Add the --disable-syscall configure option, for use on systems that place
++    security-motivated limitations on syscall(2).  (@jasone)
++  - Add support for Debian GNU/kFreeBSD.  (@thesam)
++
++  Optimizations:
++  - Add extent serial numbers and use them where appropriate as a sort key that
++    is higher priority than address, so that the allocation policy prefers older
++    extents.  This tends to improve locality (decrease fragmentation) when
++    memory grows downward.  (@jasone)
++  - Refactor madvise(2) configuration so that MADV_FREE is detected and utilized
++    on Linux 4.5 and newer.  (@jasone)
++  - Mark partially purged arena chunks as non-huge-page.  This improves
++    interaction with Linux's transparent huge page functionality.  (@jasone)
++
++  Bug fixes:
++  - Fix size class computations for edge conditions involving extremely large
++    allocations.  This regression was first released in 4.0.0.  (@jasone,
++    @ingvarha)
++  - Remove overly restrictive assertions related to the cactive statistic.  This
++    regression was first released in 4.1.0.  (@jasone)
++  - Implement a more reliable detection scheme for os_unfair_lock on macOS.
++    (@jszakmeister)
++
+ * 4.3.1 (November 7, 2016)
+ 
+   Bug fixes:
+   - Fix a severe virtual memory leak.  This regression was first released in
+     4.3.0.  (@interwq, @jasone)
+   - Refactor atomic and prng APIs to restore support for 32-bit platforms that
+     use pre-C11 toolchains, e.g. FreeBSD's mips.  (@jasone)
+ 
+diff --git a/memory/jemalloc/src/INSTALL b/memory/jemalloc/src/INSTALL
+--- a/memory/jemalloc/src/INSTALL
++++ b/memory/jemalloc/src/INSTALL
+@@ -201,16 +201,21 @@ any of the following arguments (not a de
+     Disable cache-oblivious large allocation alignment for large allocation
+     requests with no alignment constraints.  If this feature is disabled, all
+     large allocations are page-aligned as an implementation artifact, which can
+     severely harm CPU cache utilization.  However, the cache-oblivious layout
+     comes at the cost of one extra page per large allocation, which in the
+     most extreme case increases physical memory usage for the 16 KiB size class
+     to 20 KiB.
+ 
++--disable-syscall
++    Disable use of syscall(2) rather than {open,read,write,close}(2).  This is
++    intended as a workaround for systems that place security limitations on
++    syscall(2).
++
+ --with-xslroot=<path>
+     Specify where to find DocBook XSL stylesheets when building the
+     documentation.
+ 
+ --with-lg-page=<lg-page>
+     Specify the base 2 log of the system page size.  This option is only useful
+     when cross compiling, since the configure script automatically determines
+     the host's page size by default.
+@@ -322,16 +327,25 @@ LD_LIBRARY_PATH="?"
+     'ld' uses this colon-separated list to find libraries.
+ 
+ LDFLAGS="?"
+     Pass these flags when linking.
+ 
+ PATH="?"
+     'configure' uses this to find programs.
+ 
++In some cases it may be necessary to work around configuration results that do
++not match reality.  For example, Linux 4.5 added support for the MADV_FREE flag
++to madvise(2), which can cause problems if building on a host with MADV_FREE
++support and deploying to a target without.  To work around this, use a cache
++file to override the relevant configuration variable defined in configure.ac,
++e.g.:
++
++    echo "je_cv_madv_free=no" > config.cache && ./configure -C
++
+ === Advanced compilation =======================================================
+ 
+ To build only parts of jemalloc, use the following targets:
+ 
+     build_lib_shared
+     build_lib_static
+     build_lib
+     build_doc_html
+diff --git a/memory/jemalloc/src/Makefile.in b/memory/jemalloc/src/Makefile.in
+--- a/memory/jemalloc/src/Makefile.in
++++ b/memory/jemalloc/src/Makefile.in
+@@ -161,16 +161,18 @@ TESTS_UNIT := \
+ 	$(srcroot)test/unit/junk.c \
+ 	$(srcroot)test/unit/junk_alloc.c \
+ 	$(srcroot)test/unit/junk_free.c \
+ 	$(srcroot)test/unit/lg_chunk.c \
+ 	$(srcroot)test/unit/mallctl.c \
+ 	$(srcroot)test/unit/math.c \
+ 	$(srcroot)test/unit/mq.c \
+ 	$(srcroot)test/unit/mtx.c \
++	$(srcroot)test/unit/pack.c \
++	$(srcroot)test/unit/pages.c \
+ 	$(srcroot)test/unit/ph.c \
+ 	$(srcroot)test/unit/prng.c \
+ 	$(srcroot)test/unit/prof_accum.c \
+ 	$(srcroot)test/unit/prof_active.c \
+ 	$(srcroot)test/unit/prof_gdump.c \
+ 	$(srcroot)test/unit/prof_idump.c \
+ 	$(srcroot)test/unit/prof_reset.c \
+ 	$(srcroot)test/unit/prof_thread_name.c \
+diff --git a/memory/jemalloc/src/VERSION b/memory/jemalloc/src/VERSION
+--- a/memory/jemalloc/src/VERSION
++++ b/memory/jemalloc/src/VERSION
+@@ -1,1 +1,1 @@
+-4.3.1-0-g0110fa8451af905affd77c3bea0d545fee2251b2
++4.4.0-0-gf1f76357313e7dcad7262f17a48ff0a2e005fcdc
+diff --git a/memory/jemalloc/src/build-aux/config.guess b/memory/jemalloc/src/build-aux/config.guess
+--- a/memory/jemalloc/src/build-aux/config.guess
++++ b/memory/jemalloc/src/build-aux/config.guess
+@@ -1,13 +1,13 @@
+ #! /bin/sh
+ # Attempt to guess a canonical system name.
+-#   Copyright 1992-2014 Free Software Foundation, Inc.
++#   Copyright 1992-2016 Free Software Foundation, Inc.
+ 
+-timestamp='2014-03-23'
++timestamp='2016-10-02'
+ 
+ # This file 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 3 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
+@@ -19,22 +19,22 @@ timestamp='2014-03-23'
+ #
+ # As a special exception to the GNU General Public License, if you
+ # distribute this file as part of a program that contains a
+ # configuration script generated by Autoconf, you may include it under
+ # the same distribution terms that you use for the rest of that
+ # program.  This Exception is an additional permission under section 7
+ # of the GNU General Public License, version 3 ("GPLv3").
+ #
+-# Originally written by Per Bothner.
++# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+ #
+ # You can get the latest version of this script from:
+-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
++# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+ #
+-# Please send patches with a ChangeLog entry to config-patches@gnu.org.
++# Please send patches to <config-patches@gnu.org>.
+ 
+ 
+ me=`echo "$0" | sed -e 's,.*/,,'`
+ 
+ usage="\
+ Usage: $0 [OPTION]
+ 
+ Output the configuration name of the system \`$me' is run on.
+@@ -45,17 +45,17 @@ Operation modes:
+   -v, --version      print version number, then exit
+ 
+ Report bugs and patches to <config-patches@gnu.org>."
+ 
+ version="\
+ GNU config.guess ($timestamp)
+ 
+ Originally written by Per Bothner.
+-Copyright 1992-2014 Free Software Foundation, Inc.
++Copyright 1992-2016 Free Software Foundation, Inc.
+ 
+ This is free software; see the source for copying conditions.  There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+ 
+ help="
+ Try \`$me --help' for more information."
+ 
+ # Parse command line
+@@ -163,135 +163,159 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
+ 	# switched to ELF, *-*-netbsd* would select the old
+ 	# object file format.  This provides both forward
+ 	# compatibility and a consistent mechanism for selecting the
+ 	# object file format.
+ 	#
+ 	# Note: NetBSD doesn't particularly care about the vendor
+ 	# portion of the name.  We always set it to "unknown".
+ 	sysctl="sysctl -n hw.machine_arch"
+-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
++	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
++	    /sbin/$sysctl 2>/dev/null || \
++	    /usr/sbin/$sysctl 2>/dev/null || \
++	    echo unknown)`
+ 	case "${UNAME_MACHINE_ARCH}" in
+ 	    armeb) machine=armeb-unknown ;;
+ 	    arm*) machine=arm-unknown ;;
+ 	    sh3el) machine=shl-unknown ;;
+ 	    sh3eb) machine=sh-unknown ;;
+ 	    sh5el) machine=sh5le-unknown ;;
++	    earmv*)
++		arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
++		endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
++		machine=${arch}${endian}-unknown
++		;;
+ 	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ 	esac
+ 	# The Operating System including object format, if it has switched
+-	# to ELF recently, or will in the future.
++	# to ELF recently (or will in the future) and ABI.
+ 	case "${UNAME_MACHINE_ARCH}" in
++	    earm*)
++		os=netbsdelf
++		;;
+ 	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ 		eval $set_cc_for_build
+ 		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ 			| grep -q __ELF__
+ 		then
+ 		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ 		    # Return netbsd for either.  FIX?
+ 		    os=netbsd
+ 		else
+ 		    os=netbsdelf
+ 		fi
+ 		;;
+ 	    *)
+ 		os=netbsd
+ 		;;
+ 	esac
++	# Determine ABI tags.
++	case "${UNAME_MACHINE_ARCH}" in
++	    earm*)
++		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
++		abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
++		;;
++	esac
+ 	# The OS release
+ 	# Debian GNU/NetBSD machines have a different userland, and
+ 	# thus, need a distinct triplet. However, they do not need
+ 	# kernel version information, so it can be replaced with a
+ 	# suitable tag, in the style of linux-gnu.
+ 	case "${UNAME_VERSION}" in
+ 	    Debian*)
+ 		release='-gnu'
+ 		;;
+ 	    *)
+-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
++		release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
+ 		;;
+ 	esac
+ 	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ 	# contains redundant information, the shorter form:
+ 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+-	echo "${machine}-${os}${release}"
++	echo "${machine}-${os}${release}${abi}"
+ 	exit ;;
+     *:Bitrig:*:*)
+ 	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+ 	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
+ 	exit ;;
+     *:OpenBSD:*:*)
+ 	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ 	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+ 	exit ;;
++    *:LibertyBSD:*:*)
++	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
++	echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}
++	exit ;;
+     *:ekkoBSD:*:*)
+ 	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ 	exit ;;
+     *:SolidBSD:*:*)
+ 	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+ 	exit ;;
+     macppc:MirBSD:*:*)
+ 	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+ 	exit ;;
+     *:MirBSD:*:*)
+ 	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ 	exit ;;
++    *:Sortix:*:*)
++	echo ${UNAME_MACHINE}-unknown-sortix
++	exit ;;
+     alpha:OSF1:*:*)
+ 	case $UNAME_RELEASE in
+ 	*4.0)
+ 		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ 		;;
+ 	*5.*)
+ 		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ 		;;
+ 	esac
+ 	# According to Compaq, /usr/sbin/psrinfo has been available on
+ 	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+ 	# covers most systems running today.  This code pipes the CPU
+ 	# types through head -n 1, so we only detect the type of CPU 0.
+ 	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ 	case "$ALPHA_CPU_TYPE" in
+ 	    "EV4 (21064)")
+-		UNAME_MACHINE="alpha" ;;
++		UNAME_MACHINE=alpha ;;
+ 	    "EV4.5 (21064)")
+-		UNAME_MACHINE="alpha" ;;
++		UNAME_MACHINE=alpha ;;
+ 	    "LCA4 (21066/21068)")
+-		UNAME_MACHINE="alpha" ;;
++		UNAME_MACHINE=alpha ;;
+ 	    "EV5 (21164)")
+-		UNAME_MACHINE="alphaev5" ;;
++		UNAME_MACHINE=alphaev5 ;;
+ 	    "EV5.6 (21164A)")
+-		UNAME_MACHINE="alphaev56" ;;
++		UNAME_MACHINE=alphaev56 ;;
+ 	    "EV5.6 (21164PC)")
+-		UNAME_MACHINE="alphapca56" ;;
++		UNAME_MACHINE=alphapca56 ;;
+ 	    "EV5.7 (21164PC)")
+-		UNAME_MACHINE="alphapca57" ;;
++		UNAME_MACHINE=alphapca57 ;;
+ 	    "EV6 (21264)")
+-		UNAME_MACHINE="alphaev6" ;;
++		UNAME_MACHINE=alphaev6 ;;
+ 	    "EV6.7 (21264A)")
+-		UNAME_MACHINE="alphaev67" ;;
++		UNAME_MACHINE=alphaev67 ;;
+ 	    "EV6.8CB (21264C)")
+-		UNAME_MACHINE="alphaev68" ;;
++		UNAME_MACHINE=alphaev68 ;;
+ 	    "EV6.8AL (21264B)")
+-		UNAME_MACHINE="alphaev68" ;;
++		UNAME_MACHINE=alphaev68 ;;
+ 	    "EV6.8CX (21264D)")
+-		UNAME_MACHINE="alphaev68" ;;
++		UNAME_MACHINE=alphaev68 ;;
+ 	    "EV6.9A (21264/EV69A)")
+-		UNAME_MACHINE="alphaev69" ;;
++		UNAME_MACHINE=alphaev69 ;;
+ 	    "EV7 (21364)")
+-		UNAME_MACHINE="alphaev7" ;;
++		UNAME_MACHINE=alphaev7 ;;
+ 	    "EV7.9 (21364A)")
+-		UNAME_MACHINE="alphaev79" ;;
++		UNAME_MACHINE=alphaev79 ;;
+ 	esac
+ 	# A Pn.n version is a patched version.
+ 	# A Vn.n version is a released version.
+ 	# A Tn.n version is a released field test version.
+ 	# A Xn.n version is an unreleased experimental baselevel.
+ 	# 1.2 uses "1.2" for uname -r.
+-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
++	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+ 	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+ 	exitcode=$?
+ 	trap '' 0
+ 	exit $exitcode ;;
+     Alpha\ *:Windows_NT*:*)
+ 	# How do we know it's Interix rather than the generic POSIX subsystem?
+ 	# Should we change UNAME_MACHINE based on the output of uname instead
+ 	# of the specific Alpha model?
+@@ -354,26 +378,26 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
+     sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ 	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ 	exit ;;
+     i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+ 	echo i386-pc-auroraux${UNAME_RELEASE}
+ 	exit ;;
+     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+ 	eval $set_cc_for_build
+-	SUN_ARCH="i386"
++	SUN_ARCH=i386
+ 	# If there is a compiler, see if it is configured for 64-bit objects.
+ 	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+ 	# This test works for both compilers.
+-	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
++	if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+ 	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
++		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ 		grep IS_64BIT_ARCH >/dev/null
+ 	    then
+-		SUN_ARCH="x86_64"
++		SUN_ARCH=x86_64
+ 	    fi
+ 	fi
+ 	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ 	exit ;;
+     sun4*:SunOS:6*:*)
+ 	# According to config.sub, this is the proper way to canonicalize
+ 	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+ 	# it's likely to be more like Solaris than SunOS4.
+@@ -388,17 +412,17 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
+ 	# Japanese Language versions have a version number like `4.1.3-JL'.
+ 	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ 	exit ;;
+     sun3*:SunOS:*:*)
+ 	echo m68k-sun-sunos${UNAME_RELEASE}
+ 	exit ;;
+     sun*:*:4.2BSD:*)
+ 	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+-	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
++	test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3
+ 	case "`/bin/arch`" in
+ 	    sun3)
+ 		echo m68k-sun-sunos${UNAME_RELEASE}
+ 		;;
+ 	    sun4)
+ 		echo sparc-sun-sunos${UNAME_RELEASE}
+ 		;;
+ 	esac
+@@ -574,18 +598,19 @@ EOF
+ 	exit ;;
+     *:AIX:*:[4567])
+ 	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ 	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ 		IBM_ARCH=rs6000
+ 	else
+ 		IBM_ARCH=powerpc
+ 	fi
+-	if [ -x /usr/bin/oslevel ] ; then
+-		IBM_REV=`/usr/bin/oslevel`
++	if [ -x /usr/bin/lslpp ] ; then
++		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
++			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+ 	else
+ 		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ 	fi
+ 	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ 	exit ;;
+     *:AIX:*:*)
+ 	echo rs6000-ibm-aix
+ 	exit ;;
+@@ -612,23 +637,23 @@ EOF
+ 	case "${UNAME_MACHINE}" in
+ 	    9000/31? )            HP_ARCH=m68000 ;;
+ 	    9000/[34]?? )         HP_ARCH=m68k ;;
+ 	    9000/[678][0-9][0-9])
+ 		if [ -x /usr/bin/getconf ]; then
+ 		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ 		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ 		    case "${sc_cpu_version}" in
+-		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+-		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
++		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
++		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
+ 		      532)                      # CPU_PA_RISC2_0
+ 			case "${sc_kernel_bits}" in
+-			  32) HP_ARCH="hppa2.0n" ;;
+-			  64) HP_ARCH="hppa2.0w" ;;
+-			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
++			  32) HP_ARCH=hppa2.0n ;;
++			  64) HP_ARCH=hppa2.0w ;;
++			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
+ 			esac ;;
+ 		    esac
+ 		fi
+ 		if [ "${HP_ARCH}" = "" ]; then
+ 		    eval $set_cc_for_build
+ 		    sed 's/^		//' << EOF >$dummy.c
+ 
+ 		#define _HPUX_SOURCE
+@@ -657,39 +682,39 @@ EOF
+ 		#else  /* !defined(_SC_KERNEL_BITS) */
+ 			    puts ("hppa2.0"); break;
+ 		#endif
+ 			default: puts ("hppa1.0"); break;
+ 			}
+ 		    exit (0);
+ 		}
+ EOF
+-		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
++		    (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ 		    test -z "$HP_ARCH" && HP_ARCH=hppa
+ 		fi ;;
+ 	esac
+-	if [ ${HP_ARCH} = "hppa2.0w" ]
++	if [ ${HP_ARCH} = hppa2.0w ]
+ 	then
+ 	    eval $set_cc_for_build
+ 
+ 	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ 	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+ 	    # generating 64-bit code.  GNU and HP use different nomenclature:
+ 	    #
+ 	    # $ CC_FOR_BUILD=cc ./config.guess
+ 	    # => hppa2.0w-hp-hpux11.23
+ 	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ 	    # => hppa64-hp-hpux11.23
+ 
+-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
++	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
+ 		grep -q __LP64__
+ 	    then
+-		HP_ARCH="hppa2.0w"
++		HP_ARCH=hppa2.0w
+ 	    else
+-		HP_ARCH="hppa64"
++		HP_ARCH=hppa64
+ 	    fi
+ 	fi
+ 	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ 	exit ;;
+     ia64:HP-UX:*:*)
+ 	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ 	echo ia64-hp-hpux${HPUX_REV}
+ 	exit ;;
+@@ -784,24 +809,24 @@ EOF
+ 	exit ;;
+     CRAY*SV1:*:*:*)
+ 	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ 	exit ;;
+     *:UNICOS/mp:*:*)
+ 	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ 	exit ;;
+     F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+-	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+-	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
++	FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
++	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+ 	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ 	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ 	exit ;;
+     5000:UNIX_System_V:4.*:*)
+-	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+-	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
++	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
++	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
+ 	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ 	exit ;;
+     i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ 	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ 	exit ;;
+     sparc*:BSD/OS:*:*)
+ 	echo sparc-unknown-bsdi${UNAME_RELEASE}
+ 	exit ;;
+@@ -873,17 +898,17 @@ EOF
+ 	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ 	exit ;;
+     *:GNU:*:*)
+ 	# the GNU system
+ 	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ 	exit ;;
+     *:GNU/*:*:*)
+ 	# other systems with GNU libc and userland
+-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
++	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
+ 	exit ;;
+     i*86:Minix:*:*)
+ 	echo ${UNAME_MACHINE}-pc-minix
+ 	exit ;;
+     aarch64:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     aarch64_be:Linux:*:*)
+@@ -896,17 +921,17 @@ EOF
+ 	  EV56)  UNAME_MACHINE=alphaev56 ;;
+ 	  PCA56) UNAME_MACHINE=alphapca56 ;;
+ 	  PCA57) UNAME_MACHINE=alphapca56 ;;
+ 	  EV6)   UNAME_MACHINE=alphaev6 ;;
+ 	  EV67)  UNAME_MACHINE=alphaev67 ;;
+ 	  EV68*) UNAME_MACHINE=alphaev68 ;;
+ 	esac
+ 	objdump --private-headers /bin/sh | grep -q ld.so.1
+-	if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
++	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+ 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     arc:Linux:*:* | arceb:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     arm*:Linux:*:*)
+ 	eval $set_cc_for_build
+ 	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+@@ -927,28 +952,34 @@ EOF
+ 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     cris:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+ 	exit ;;
+     crisv32:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+ 	exit ;;
++    e2k:Linux:*:*)
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++	exit ;;
+     frv:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     hexagon:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     i*86:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
+ 	exit ;;
+     ia64:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
++    k1om:Linux:*:*)
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++	exit ;;
+     m32r*:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     m68*:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     mips:Linux:*:* | mips64:Linux:*:*)
+ 	eval $set_cc_for_build
+@@ -964,16 +995,19 @@ EOF
+ 	#else
+ 	CPU=
+ 	#endif
+ 	#endif
+ EOF
+ 	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+ 	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
+ 	;;
++    mips64el:Linux:*:*)
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++	exit ;;
+     openrisc*:Linux:*:*)
+ 	echo or1k-unknown-linux-${LIBC}
+ 	exit ;;
+     or32:Linux:*:* | or1k*:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     padre:Linux:*:*)
+ 	echo sparc-unknown-linux-${LIBC}
+@@ -996,16 +1030,19 @@ EOF
+ 	echo powerpc-unknown-linux-${LIBC}
+ 	exit ;;
+     ppc64le:Linux:*:*)
+ 	echo powerpc64le-unknown-linux-${LIBC}
+ 	exit ;;
+     ppcle:Linux:*:*)
+ 	echo powerpcle-unknown-linux-${LIBC}
+ 	exit ;;
++    riscv32:Linux:*:* | riscv64:Linux:*:*)
++	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++	exit ;;
+     s390:Linux:*:* | s390x:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
+ 	exit ;;
+     sh64*:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     sh*:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+@@ -1015,17 +1052,17 @@ EOF
+ 	exit ;;
+     tile*:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     vax:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
+ 	exit ;;
+     x86_64:Linux:*:*)
+-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
+ 	exit ;;
+     xtensa*:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ 	exit ;;
+     i*86:DYNIX/ptx:4*:*)
+ 	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ 	# earlier versions are messed up and put the nodename in both
+ 	# sysname and nodename.
+@@ -1094,17 +1131,17 @@ EOF
+ 		echo ${UNAME_MACHINE}-pc-sysv32
+ 	fi
+ 	exit ;;
+     pc:*:*:*)
+ 	# Left here for compatibility:
+ 	# uname -m prints for DJGPP always 'pc', but it prints nothing about
+ 	# the processor, so we play safe by assuming i586.
+ 	# Note: whatever this is, it MUST be the same as what config.sub
+-	# prints for the "djgpp" host, or else GDB configury will decide that
++	# prints for the "djgpp" host, or else GDB configure will decide that
+ 	# this is a cross-build.
+ 	echo i586-pc-msdosdjgpp
+ 	exit ;;
+     Intel:Mach:3*:*)
+ 	echo i386-pc-mach3
+ 	exit ;;
+     paragon:*:*:*)
+ 	echo i860-intel-osf1
+@@ -1243,32 +1280,35 @@ EOF
+ 	echo sx7-nec-superux${UNAME_RELEASE}
+ 	exit ;;
+     SX-8:SUPER-UX:*:*)
+ 	echo sx8-nec-superux${UNAME_RELEASE}
+ 	exit ;;
+     SX-8R:SUPER-UX:*:*)
+ 	echo sx8r-nec-superux${UNAME_RELEASE}
+ 	exit ;;
++    SX-ACE:SUPER-UX:*:*)
++	echo sxace-nec-superux${UNAME_RELEASE}
++	exit ;;
+     Power*:Rhapsody:*:*)
+ 	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ 	exit ;;
+     *:Rhapsody:*:*)
+ 	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ 	exit ;;
+     *:Darwin:*:*)
+ 	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ 	eval $set_cc_for_build
+ 	if test "$UNAME_PROCESSOR" = unknown ; then
+ 	    UNAME_PROCESSOR=powerpc
+ 	fi
+ 	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+-	    if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
++	    if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+ 		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+-		    (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
++		    (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ 		    grep IS_64BIT_ARCH >/dev/null
+ 		then
+ 		    case $UNAME_PROCESSOR in
+ 			i386) UNAME_PROCESSOR=x86_64 ;;
+ 			powerpc) UNAME_PROCESSOR=powerpc64 ;;
+ 		    esac
+ 		fi
+ 	    fi
+@@ -1280,17 +1320,17 @@ EOF
+ 	    # processor. This is not true of the ARM version of Darwin
+ 	    # that Apple uses in portable devices.
+ 	    UNAME_PROCESSOR=x86_64
+ 	fi
+ 	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ 	exit ;;
+     *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ 	UNAME_PROCESSOR=`uname -p`
+-	if test "$UNAME_PROCESSOR" = "x86"; then
++	if test "$UNAME_PROCESSOR" = x86; then
+ 		UNAME_PROCESSOR=i386
+ 		UNAME_MACHINE=pc
+ 	fi
+ 	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ 	exit ;;
+     *:QNX:*:4*)
+ 	echo i386-pc-qnx
+ 	exit ;;
+@@ -1311,17 +1351,17 @@ EOF
+ 	exit ;;
+     DS/*:UNIX_System_V:*:*)
+ 	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ 	exit ;;
+     *:Plan9:*:*)
+ 	# "uname -m" is not consistent, so use $cputype instead. 386
+ 	# is converted to i386 for consistency with other x86
+ 	# operating systems.
+-	if test "$cputype" = "386"; then
++	if test "$cputype" = 386; then
+ 	    UNAME_MACHINE=i386
+ 	else
+ 	    UNAME_MACHINE="$cputype"
+ 	fi
+ 	echo ${UNAME_MACHINE}-unknown-plan9
+ 	exit ;;
+     *:TOPS-10:*:*)
+ 	echo pdp10-unknown-tops10
+@@ -1353,44 +1393,46 @@ EOF
+ 	    A*) echo alpha-dec-vms ; exit ;;
+ 	    I*) echo ia64-dec-vms ; exit ;;
+ 	    V*) echo vax-dec-vms ; exit ;;
+ 	esac ;;
+     *:XENIX:*:SysV)
+ 	echo i386-pc-xenix
+ 	exit ;;
+     i*86:skyos:*:*)
+-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
++	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'`
+ 	exit ;;
+     i*86:rdos:*:*)
+ 	echo ${UNAME_MACHINE}-pc-rdos
+ 	exit ;;
+     i*86:AROS:*:*)
+ 	echo ${UNAME_MACHINE}-pc-aros
+ 	exit ;;
+     x86_64:VMkernel:*:*)
+ 	echo ${UNAME_MACHINE}-unknown-esx
+ 	exit ;;
++    amd64:Isilon\ OneFS:*:*)
++	echo x86_64-unknown-onefs
++	exit ;;
+ esac
+ 
+ cat >&2 <<EOF
+ $0: unable to guess system type
+ 
+-This script, last modified $timestamp, has failed to recognize
+-the operating system you are using. It is advised that you
+-download the most up to date version of the config scripts from
++This script (version $timestamp), has failed to recognize the
++operating system you are using. If your script is old, overwrite
++config.guess and config.sub with the latest versions from:
+ 
+-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
++  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+ and
+-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
++  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+ 
+-If the version you run ($0) is already up to date, please
+-send the following data and any information you think might be
+-pertinent to <config-patches@gnu.org> in order to provide the needed
+-information to handle your system.
++If $0 has already been updated, send the following data and any
++information you think might be pertinent to config-patches@gnu.org to
++provide the necessary information to handle your system.
+ 
+ config.guess timestamp = $timestamp
+ 
+ uname -m = `(uname -m) 2>/dev/null || echo unknown`
+ uname -r = `(uname -r) 2>/dev/null || echo unknown`
+ uname -s = `(uname -s) 2>/dev/null || echo unknown`
+ uname -v = `(uname -v) 2>/dev/null || echo unknown`
+ 
+diff --git a/memory/jemalloc/src/build-aux/config.sub b/memory/jemalloc/src/build-aux/config.sub
+--- a/memory/jemalloc/src/build-aux/config.sub
++++ b/memory/jemalloc/src/build-aux/config.sub
+@@ -1,13 +1,13 @@
+ #! /bin/sh
+ # Configuration validation subroutine script.
+-#   Copyright 1992-2014 Free Software Foundation, Inc.
++#   Copyright 1992-2016 Free Software Foundation, Inc.
+ 
+-timestamp='2014-05-01'
++timestamp='2016-11-04'
+ 
+ # This file 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 3 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
+@@ -20,25 +20,25 @@ timestamp='2014-05-01'
+ # As a special exception to the GNU General Public License, if you
+ # distribute this file as part of a program that contains a
+ # configuration script generated by Autoconf, you may include it under
+ # the same distribution terms that you use for the rest of that
+ # program.  This Exception is an additional permission under section 7
+ # of the GNU General Public License, version 3 ("GPLv3").
+ 
+ 
+-# Please send patches with a ChangeLog entry to config-patches@gnu.org.
++# Please send patches to <config-patches@gnu.org>.
+ #
+ # Configuration subroutine to validate and canonicalize a configuration type.
+ # Supply the specified configuration type as an argument.
+ # If it is invalid, we print an error message on stderr and exit with code 1.
+ # Otherwise, we print the canonical config type on stdout and succeed.
+ 
+ # You can get the latest version of this script from:
+-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
++# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+ 
+ # This file is supposed to be the same for all GNU packages
+ # and recognize all the CPU types, system types and aliases
+ # that are meaningful with *any* GNU software.
+ # Each package is responsible for reporting which valid configurations
+ # it does not support.  The user should be able to distinguish
+ # a failure to support a valid configuration from a meaningless
+ # configuration.
+@@ -48,32 +48,31 @@ timestamp='2014-05-01'
+ #	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+ # or in some cases, the newer four-part form:
+ #	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+ # It is wrong to echo any other type of specification.
+ 
+ me=`echo "$0" | sed -e 's,.*/,,'`
+ 
+ usage="\
+-Usage: $0 [OPTION] CPU-MFR-OPSYS
+-       $0 [OPTION] ALIAS
++Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+ 
+ Canonicalize a configuration name.
+ 
+ Operation modes:
+   -h, --help         print this help, then exit
+   -t, --time-stamp   print date of last modification, then exit
+   -v, --version      print version number, then exit
+ 
+ Report bugs and patches to <config-patches@gnu.org>."
+ 
+ version="\
+ GNU config.sub ($timestamp)
+ 
+-Copyright 1992-2014 Free Software Foundation, Inc.
++Copyright 1992-2016 Free Software Foundation, Inc.
+ 
+ This is free software; see the source for copying conditions.  There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+ 
+ help="
+ Try \`$me --help' for more information."
+ 
+ # Parse command line
+@@ -112,18 +111,18 @@ case $# in
+ esac
+ 
+ # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+ # Here we must recognize all the valid KERNEL-OS combinations.
+ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+ case $maybe_os in
+   nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+   linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+-  knetbsd*-gnu* | netbsd*-gnu* | \
+-  kopensolaris*-gnu* | \
++  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
++  kopensolaris*-gnu* | cloudabi*-eabi* | \
+   storm-chaos* | os2-emx* | rtmk-nova*)
+     os=-$maybe_os
+     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+     ;;
+   android-linux)
+     os=-linux-android
+     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+     ;;
+@@ -250,22 +249,23 @@ case $basic_machine in
+ 	| a29k \
+ 	| aarch64 | aarch64_be \
+ 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ 	| am33_2.0 \
+ 	| arc | arceb \
+ 	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+ 	| avr | avr32 \
++	| ba \
+ 	| be32 | be64 \
+ 	| bfin \
+ 	| c4x | c8051 | clipper \
+ 	| d10v | d30v | dlx | dsp16xx \
+-	| epiphany \
+-	| fido | fr30 | frv \
++	| e2k | epiphany \
++	| fido | fr30 | frv | ft32 \
+ 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ 	| hexagon \
+ 	| i370 | i860 | i960 | ia64 \
+ 	| ip2k | iq2000 \
+ 	| k1om \
+ 	| le32 | le64 \
+ 	| lm32 \
+ 	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+@@ -296,41 +296,47 @@ case $basic_machine in
+ 	| mt \
+ 	| msp430 \
+ 	| nds32 | nds32le | nds32be \
+ 	| nios | nios2 | nios2eb | nios2el \
+ 	| ns16k | ns32k \
+ 	| open8 | or1k | or1knd | or32 \
+ 	| pdp10 | pdp11 | pj | pjl \
+ 	| powerpc | powerpc64 | powerpc64le | powerpcle \
++	| pru \
+ 	| pyramid \
++	| riscv32 | riscv64 \
+ 	| rl78 | rx \
+ 	| score \
+-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
++	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ 	| sh64 | sh64le \
+ 	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+ 	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+ 	| spu \
+ 	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+ 	| ubicom32 \
+ 	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
++	| visium \
+ 	| we32k \
+ 	| x86 | xc16x | xstormy16 | xtensa \
+ 	| z8k | z80)
+ 		basic_machine=$basic_machine-unknown
+ 		;;
+ 	c54x)
+ 		basic_machine=tic54x-unknown
+ 		;;
+ 	c55x)
+ 		basic_machine=tic55x-unknown
+ 		;;
+ 	c6x)
+ 		basic_machine=tic6x-unknown
+ 		;;
++	leon|leon[3-9])
++		basic_machine=sparc-$basic_machine
++		;;
+ 	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
+ 		basic_machine=$basic_machine-unknown
+ 		os=-none
+ 		;;
+ 	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ 		;;
+ 	ms1)
+ 		basic_machine=mt-unknown
+@@ -366,22 +372,23 @@ case $basic_machine in
+ 	580-* \
+ 	| a29k-* \
+ 	| aarch64-* | aarch64_be-* \
+ 	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ 	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ 	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+ 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+ 	| avr-* | avr32-* \
++	| ba-* \
+ 	| be32-* | be64-* \
+ 	| bfin-* | bs2000-* \
+ 	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+ 	| c8051-* | clipper-* | craynv-* | cydra-* \
+ 	| d10v-* | d30v-* | dlx-* \
+-	| elxsi-* \
++	| e2k-* | elxsi-* \
+ 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+ 	| h8300-* | h8500-* \
+ 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ 	| hexagon-* \
+ 	| i*86-* | i860-* | i960-* | ia64-* \
+ 	| ip2k-* | iq2000-* \
+ 	| k1om-* \
+ 	| le32-* | le64-* \
+@@ -417,30 +424,33 @@ case $basic_machine in
+ 	| nds32-* | nds32le-* | nds32be-* \
+ 	| nios-* | nios2-* | nios2eb-* | nios2el-* \
+ 	| none-* | np1-* | ns16k-* | ns32k-* \
+ 	| open8-* \
+ 	| or1k*-* \
+ 	| orion-* \
+ 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ 	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
++	| pru-* \
+ 	| pyramid-* \
++	| riscv32-* | riscv64-* \
+ 	| rl78-* | romp-* | rs6000-* | rx-* \
+ 	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+ 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ 	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+ 	| sparclite-* \
+-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
++	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
+ 	| tahoe-* \
+ 	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ 	| tile*-* \
+ 	| tron-* \
+ 	| ubicom32-* \
+ 	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+ 	| vax-* \
++	| visium-* \
+ 	| we32k-* \
+ 	| x86-* | x86_64-* | xc16x-* | xps100-* \
+ 	| xstormy16-* | xtensa*-* \
+ 	| ymp-* \
+ 	| z8k-* | z80-*)
+ 		;;
+ 	# Recognize the basic CPU types without company name, with glob match.
+ 	xtensa*)
+@@ -507,16 +517,19 @@ case $basic_machine in
+ 	apollo68bsd)
+ 		basic_machine=m68k-apollo
+ 		os=-bsd
+ 		;;
+ 	aros)
+ 		basic_machine=i386-pc
+ 		os=-aros
+ 		;;
++	asmjs)
++		basic_machine=asmjs-unknown
++		;;
+ 	aux)
+ 		basic_machine=m68k-apple
+ 		os=-aux
+ 		;;
+ 	balance)
+ 		basic_machine=ns32k-sequent
+ 		os=-dynix
+ 		;;
+@@ -627,16 +640,24 @@ case $basic_machine in
+ 	dpx20 | dpx20-*)
+ 		basic_machine=rs6000-bull
+ 		os=-bosx
+ 		;;
+ 	dpx2* | dpx2*-bull)
+ 		basic_machine=m68k-bull
+ 		os=-sysv3
+ 		;;
++	e500v[12])
++		basic_machine=powerpc-unknown
++		os=$os"spe"
++		;;
++	e500v[12]-*)
++		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
++		os=$os"spe"
++		;;
+ 	ebmon29k)
+ 		basic_machine=a29k-amd
+ 		os=-ebmon
+ 		;;
+ 	elxsi)
+ 		basic_machine=elxsi-elxsi
+ 		os=-bsd
+ 		;;
+@@ -768,16 +789,19 @@ case $basic_machine in
+ 			os=-irix4
+ 			;;
+ 		esac
+ 		;;
+ 	isi68 | isi)
+ 		basic_machine=m68k-isi
+ 		os=-sysv
+ 		;;
++	leon-*|leon[3-9]-*)
++		basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
++		;;
+ 	m68knommu)
+ 		basic_machine=m68k-unknown
+ 		os=-linux
+ 		;;
+ 	m68knommu-*)
+ 		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		os=-linux
+ 		;;
+@@ -823,16 +847,20 @@ case $basic_machine in
+ 	monitor)
+ 		basic_machine=m68k-rom68k
+ 		os=-coff
+ 		;;
+ 	morphos)
+ 		basic_machine=powerpc-unknown
+ 		os=-morphos
+ 		;;
++	moxiebox)
++		basic_machine=moxie-unknown
++		os=-moxiebox
++		;;
+ 	msdos)
+ 		basic_machine=i386-pc
+ 		os=-msdos
+ 		;;
+ 	ms1-*)
+ 		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+ 		;;
+ 	msys)
+@@ -999,27 +1027,27 @@ case $basic_machine in
+ 		;;
+ 	power)	basic_machine=power-ibm
+ 		;;
+ 	ppc | ppcbe)	basic_machine=powerpc-unknown
+ 		;;
+ 	ppc-* | ppcbe-*)
+ 		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
+-	ppcle | powerpclittle | ppc-le | powerpc-little)
++	ppcle | powerpclittle)
+ 		basic_machine=powerpcle-unknown
+ 		;;
+ 	ppcle-* | powerpclittle-*)
+ 		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
+ 	ppc64)	basic_machine=powerpc64-unknown
+ 		;;
+ 	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
+-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
++	ppc64le | powerpc64little)
+ 		basic_machine=powerpc64le-unknown
+ 		;;
+ 	ppc64le-* | powerpc64little-*)
+ 		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
+ 	ps2)
+ 		basic_machine=i386-ibm
+ 		;;
+@@ -1355,37 +1383,38 @@ case $os in
+ 	# The portable systems comes first.
+ 	# Each alternative MUST END IN A *, to match a version number.
+ 	# -sysv* is not here because it comes later, after sysvr4.
+ 	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ 	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+ 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+ 	      | -sym* | -kopensolaris* | -plan9* \
+ 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+-	      | -aos* | -aros* \
++	      | -aos* | -aros* | -cloudabi* | -sortix* \
+ 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+-	      | -bitrig* | -openbsd* | -solidbsd* \
++	      | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
+ 	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ 	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ 	      | -chorusos* | -chorusrdb* | -cegcc* \
+ 	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+-	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
++	      | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+ 	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+-	      | -uxpv* | -beos* | -mpeix* | -udk* \
++	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
+ 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ 	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
++	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
++	      | -onefs* | -tirtos* | -phoenix* | -fuchsia*)
+ 	# Remember, each alternative MUST END IN *, to match a version number.
+ 		;;
+ 	-qnx*)
+ 		case $basic_machine in
+ 		    x86-* | i*86-*)
+ 			;;
+ 		    *)
+ 			os=-nto$os
+@@ -1399,19 +1428,16 @@ case $os in
+ 		;;
+ 	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ 	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+ 	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ 		;;
+ 	-mac*)
+ 		os=`echo $os | sed -e 's|mac|macos|'`
+ 		;;
+-	# Apple iOS
+-	-ios*)
+-		;;
+ 	-linux-dietlibc)
+ 		os=-linux-dietlibc
+ 		;;
+ 	-linux*)
+ 		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ 		;;
+ 	-sunos5*)
+ 		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+@@ -1510,16 +1536,18 @@ case $os in
+ 	-zvmoe)
+ 		os=-zvmoe
+ 		;;
+ 	-dicos*)
+ 		os=-dicos
+ 		;;
+ 	-nacl*)
+ 		;;
++	-ios)
++		;;
+ 	-none)
+ 		;;
+ 	*)
+ 		# Get rid of the `-' at the beginning of $os.
+ 		os=`echo $os | sed 's/[^-]*-//'`
+ 		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ 		exit 1
+ 		;;
+diff --git a/memory/jemalloc/src/configure b/memory/jemalloc/src/configure
+--- a/memory/jemalloc/src/configure
++++ b/memory/jemalloc/src/configure
+@@ -782,16 +782,17 @@ enable_valgrind
+ enable_xmalloc
+ enable_cache_oblivious
+ with_lg_tiny_min
+ with_lg_quantum
+ with_lg_page
+ with_lg_page_sizes
+ with_lg_size_class_group
+ with_version
++enable_syscall
+ enable_lazy_lock
+ enable_tls
+ enable_zone_allocator
+ '
+       ac_precious_vars='build_alias
+ host_alias
+ target_alias
+ CC
+@@ -1437,16 +1438,17 @@ Optional Features:
+   --disable-fill          Disable support for junk/zero filling, quarantine,
+                           and redzones
+   --enable-utrace         Enable utrace(2)-based tracing
+   --disable-valgrind      Disable support for Valgrind
+   --enable-xmalloc        Support xmalloc option
+   --disable-cache-oblivious
+                           Disable support for cache-oblivious allocation
+                           alignment
++  --disable-syscall       Disable use of syscall(2)
+   --enable-lazy-lock      Enable lazy locking (only lock when multi-threaded)
+   --disable-tls           Disable thread-local storage (__thread keyword)
+   --disable-zone-allocator
+                           Disable zone allocator for Darwin
+ 
+ Optional Packages:
+   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+@@ -5306,59 +5308,61 @@ fi
+ 
+ 
+ CFLAGS="$CFLAGS"
+ default_munmap="1"
+ maps_coalesce="1"
+ case "${host}" in
+   *-*-darwin* | *-*-ios*)
+ 	abi="macho"
+-	$as_echo "#define JEMALLOC_PURGE_MADVISE_FREE  " >>confdefs.h
+-
+ 	RPATH=""
+ 	LD_PRELOAD_VAR="DYLD_INSERT_LIBRARIES"
+ 	so="dylib"
+ 	importlib="${so}"
+ 	force_tls="0"
+ 	DSO_LDFLAGS='-shared -Wl,-install_name,$(LIBDIR)/$(@F)'
+ 	SOREV="${rev}.${so}"
+ 	sbrk_deprecated="1"
+ 	;;
+   *-*-freebsd*)
+ 	abi="elf"
+ 	$as_echo "#define JEMALLOC_SYSCTL_VM_OVERCOMMIT  " >>confdefs.h
+ 
+-	$as_echo "#define JEMALLOC_PURGE_MADVISE_FREE  " >>confdefs.h
+-
+ 	force_lazy_lock="1"
+ 	;;
+   *-*-dragonfly*)
+ 	abi="elf"
+-	$as_echo "#define JEMALLOC_PURGE_MADVISE_FREE  " >>confdefs.h
+-
+ 	;;
+   *-*-openbsd*)
+ 	abi="elf"
+-	$as_echo "#define JEMALLOC_PURGE_MADVISE_FREE  " >>confdefs.h
+-
+ 	force_tls="0"
+ 	;;
+   *-*-bitrig*)
+ 	abi="elf"
+-	$as_echo "#define JEMALLOC_PURGE_MADVISE_FREE  " >>confdefs.h
+-
+ 	;;
+-  *-*-linux*)
++  *-*-linux-android)
+ 		CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
+ 	abi="elf"
+ 	$as_echo "#define JEMALLOC_HAS_ALLOCA_H 1" >>confdefs.h
+ 
+ 	$as_echo "#define JEMALLOC_PROC_SYS_VM_OVERCOMMIT_MEMORY  " >>confdefs.h
+ 
+-	$as_echo "#define JEMALLOC_PURGE_MADVISE_DONTNEED  " >>confdefs.h
++	$as_echo "#define JEMALLOC_THREADED_INIT  " >>confdefs.h
++
++	$as_echo "#define JEMALLOC_C11ATOMICS 1" >>confdefs.h
++
++	force_tls="0"
++	default_munmap="0"
++	;;
++  *-*-linux* | *-*-kfreebsd*)
++		CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
++	abi="elf"
++	$as_echo "#define JEMALLOC_HAS_ALLOCA_H 1" >>confdefs.h
++
++	$as_echo "#define JEMALLOC_PROC_SYS_VM_OVERCOMMIT_MEMORY  " >>confdefs.h
+ 
+ 	$as_echo "#define JEMALLOC_THREADED_INIT  " >>confdefs.h
+ 
+ 	$as_echo "#define JEMALLOC_USE_CXX_THROW  " >>confdefs.h
+ 
+ 	default_munmap="0"
+ 	;;
+   *-*-netbsd*)
+@@ -5383,23 +5387,19 @@ main ()
+ if ac_fn_c_try_compile "$LINENO"; then :
+   abi="elf"
+ else
+   abi="aout"
+ fi
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ 	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $abi" >&5
+ $as_echo "$abi" >&6; }
+-	$as_echo "#define JEMALLOC_PURGE_MADVISE_FREE  " >>confdefs.h
+-
+ 	;;
+   *-*-solaris2*)
+ 	abi="elf"
+-	$as_echo "#define JEMALLOC_PURGE_MADVISE_FREE  " >>confdefs.h
+-
+ 	RPATH='-Wl,-R,$(1)'
+ 		CPPFLAGS="$CPPFLAGS -D_POSIX_PTHREAD_SEMANTICS"
+ 	LIBS="$LIBS -lposix4 -lsocket -lnsl"
+ 	;;
+   *-ibm-aix*)
+ 	if "$LG_SIZEOF_PTR" = "8"; then
+ 	  	  LD_PRELOAD_VAR="LDR_PRELOAD64"
+ 	else
+@@ -7826,16 +7826,52 @@ if test "$ac_res" != no; then :
+   test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ 
+ else
+   as_fn_error $? "libpthread is missing" "$LINENO" 5
+ fi
+ 
+ fi
+ 
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthread_atfork(3) is compilable" >&5
++$as_echo_n "checking whether pthread_atfork(3) is compilable... " >&6; }
++if ${je_cv_pthread_atfork+:} false; then :
++  $as_echo_n "(cached) " >&6
++else
++  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h.  */
++
++#include <pthread.h>
++
++int
++main ()
++{
++
++  pthread_atfork((void *)0, (void *)0, (void *)0);
++
++  ;
++  return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++  je_cv_pthread_atfork=yes
++else
++  je_cv_pthread_atfork=no
++fi
++rm -f core conftest.err conftest.$ac_objext \
++    conftest$ac_exeext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $je_cv_pthread_atfork" >&5
++$as_echo "$je_cv_pthread_atfork" >&6; }
++
++  if test "x${je_cv_pthread_atfork}" = "xyes" ; then
++    $as_echo "#define JEMALLOC_HAVE_PTHREAD_ATFORK  " >>confdefs.h
++
++  fi
+ fi
+ 
+ CPPFLAGS="$CPPFLAGS -D_REENTRANT"
+ 
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5
+ $as_echo_n "checking for library containing clock_gettime... " >&6; }
+ if ${ac_cv_search_clock_gettime+:} false; then :
+   $as_echo_n "(cached) " >&6
+@@ -8108,17 +8144,31 @@ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $je_cv_mach_absolute_time" >&5
+ $as_echo "$je_cv_mach_absolute_time" >&6; }
+ 
+ if test "x${je_cv_mach_absolute_time}" = "xyes" ; then
+   $as_echo "#define JEMALLOC_HAVE_MACH_ABSOLUTE_TIME 1" >>confdefs.h
+ 
+ fi
+ 
+-SAVED_CFLAGS="${CFLAGS}"
++# Check whether --enable-syscall was given.
++if test "${enable_syscall+set}" = set; then :
++  enableval=$enable_syscall; if test "x$enable_syscall" = "xno" ; then
++  enable_syscall="0"
++else
++  enable_syscall="1"
++fi
++
++else
++  enable_syscall="1"
++
++fi
++
++if test "x$enable_syscall" = "x1" ; then
++      SAVED_CFLAGS="${CFLAGS}"
+ 
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Werror" >&5
+ $as_echo_n "checking whether compiler supports -Werror... " >&6; }
+ TCFLAGS="${CFLAGS}"
+ if test "x${CFLAGS}" = "x" ; then
+   CFLAGS="-Werror"
+ else
+   CFLAGS="${CFLAGS} -Werror"
+@@ -8178,20 +8228,21 @@ else
+   je_cv_syscall=no
+ fi
+ rm -f core conftest.err conftest.$ac_objext \
+     conftest$ac_exeext conftest.$ac_ext
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $je_cv_syscall" >&5
+ $as_echo "$je_cv_syscall" >&6; }
+ 
+-CFLAGS="${SAVED_CFLAGS}"
+-if test "x$je_cv_syscall" = "xyes" ; then
+-  $as_echo "#define JEMALLOC_HAVE_SYSCALL  " >>confdefs.h
+-
++  CFLAGS="${SAVED_CFLAGS}"
++  if test "x$je_cv_syscall" = "xyes" ; then
++    $as_echo "#define JEMALLOC_USE_SYSCALL  " >>confdefs.h
++
++  fi
+ fi
+ 
+ ac_fn_c_check_func "$LINENO" "secure_getenv" "ac_cv_func_secure_getenv"
+ if test "x$ac_cv_func_secure_getenv" = xyes; then :
+   have_secure_getenv="1"
+ else
+   have_secure_getenv="0"
+ 
+@@ -8568,19 +8619,17 @@ else
+ /* end confdefs.h.  */
+ 
+ #include <sys/mman.h>
+ 
+ int
+ main ()
+ {
+ 
+-	{
+-		madvise((void *)0, 0, 0);
+-	}
++	madvise((void *)0, 0, 0);
+ 
+   ;
+   return 0;
+ }
+ _ACEOF
+ if ac_fn_c_try_link "$LINENO"; then :
+   je_cv_madvise=yes
+ else
+@@ -8590,16 +8639,128 @@ rm -f core conftest.err conftest.$ac_obj
+     conftest$ac_exeext conftest.$ac_ext
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $je_cv_madvise" >&5
+ $as_echo "$je_cv_madvise" >&6; }
+ 
+ if test "x${je_cv_madvise}" = "xyes" ; then
+   $as_echo "#define JEMALLOC_HAVE_MADVISE  " >>confdefs.h
+ 
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether madvise(..., MADV_FREE) is compilable" >&5
++$as_echo_n "checking whether madvise(..., MADV_FREE) is compilable... " >&6; }
++if ${je_cv_madv_free+:} false; then :
++  $as_echo_n "(cached) " >&6
++else
++  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h.  */
++
++#include <sys/mman.h>
++
++int
++main ()
++{
++
++	madvise((void *)0, 0, MADV_FREE);
++
++  ;
++  return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++  je_cv_madv_free=yes
++else
++  je_cv_madv_free=no
++fi
++rm -f core conftest.err conftest.$ac_objext \
++    conftest$ac_exeext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $je_cv_madv_free" >&5
++$as_echo "$je_cv_madv_free" >&6; }
++
++  if test "x${je_cv_madv_free}" = "xyes" ; then
++    $as_echo "#define JEMALLOC_PURGE_MADVISE_FREE  " >>confdefs.h
++
++  fi
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether madvise(..., MADV_DONTNEED) is compilable" >&5
++$as_echo_n "checking whether madvise(..., MADV_DONTNEED) is compilable... " >&6; }
++if ${je_cv_madv_dontneed+:} false; then :
++  $as_echo_n "(cached) " >&6
++else
++  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h.  */
++
++#include <sys/mman.h>
++
++int
++main ()
++{
++
++	madvise((void *)0, 0, MADV_DONTNEED);
++
++  ;
++  return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++  je_cv_madv_dontneed=yes
++else
++  je_cv_madv_dontneed=no
++fi
++rm -f core conftest.err conftest.$ac_objext \
++    conftest$ac_exeext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $je_cv_madv_dontneed" >&5
++$as_echo "$je_cv_madv_dontneed" >&6; }
++
++  if test "x${je_cv_madv_dontneed}" = "xyes" ; then
++    $as_echo "#define JEMALLOC_PURGE_MADVISE_DONTNEED  " >>confdefs.h
++
++  fi
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether madvise(..., MADV_[NO]HUGEPAGE) is compilable" >&5
++$as_echo_n "checking whether madvise(..., MADV_[NO]HUGEPAGE) is compilable... " >&6; }
++if ${je_cv_thp+:} false; then :
++  $as_echo_n "(cached) " >&6
++else
++  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h.  */
++
++#include <sys/mman.h>
++
++int
++main ()
++{
++
++	madvise((void *)0, 0, MADV_HUGEPAGE);
++	madvise((void *)0, 0, MADV_NOHUGEPAGE);
++
++  ;
++  return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++  je_cv_thp=yes
++else
++  je_cv_thp=no
++fi
++rm -f core conftest.err conftest.$ac_objext \
++    conftest$ac_exeext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $je_cv_thp" >&5
++$as_echo "$je_cv_thp" >&6; }
++
++  if test "x${je_cv_thp}" = "xyes" ; then
++    $as_echo "#define JEMALLOC_THP  " >>confdefs.h
++
++  fi
+ fi
+ 
+ 
+ 
+ 
+ if test "x${je_cv_atomic9}" != "xyes" -a "x${je_cv_osatomic}" != "xyes" ; then
+ 
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to force 32-bit __sync_{add,sub}_and_fetch()" >&5
+@@ -8741,24 +8902,29 @@ fi
+ $as_echo_n "checking whether Darwin os_unfair_lock_*() is compilable... " >&6; }
+ if ${je_cv_os_unfair_lock+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h.  */
+ 
+ #include <os/lock.h>
+-
+-int
+-main ()
+-{
+-
++#include <AvailabilityMacros.h>
++
++int
++main ()
++{
++
++	#if MAC_OS_X_VERSION_MIN_REQUIRED < 101200
++	#error "os_unfair_lock is not supported"
++	#else
+ 	os_unfair_lock lock = OS_UNFAIR_LOCK_INIT;
+ 	os_unfair_lock_lock(&lock);
+ 	os_unfair_lock_unlock(&lock);
++	#endif
+ 
+   ;
+   return 0;
+ }
+ _ACEOF
+ if ac_fn_c_try_link "$LINENO"; then :
+   je_cv_os_unfair_lock=yes
+ else
+diff --git a/memory/jemalloc/src/configure.ac b/memory/jemalloc/src/configure.ac
+--- a/memory/jemalloc/src/configure.ac
++++ b/memory/jemalloc/src/configure.ac
+@@ -166,17 +166,16 @@ if test "x${je_cv_cray}" = "xyes" ; then
+ ])],
+                               [je_cv_cray_84=yes],
+                               [je_cv_cray_84=no])])
+ fi
+ 
+ if test "x$CFLAGS" = "x" ; then
+   no_CFLAGS="yes"
+   if test "x$GCC" = "xyes" ; then
+-dnl    JE_CFLAGS_APPEND([-std=gnu99])
+     JE_CFLAGS_APPEND([-std=gnu11])
+     if test "x$je_cv_cflags_appended" = "x-std=gnu11" ; then
+       AC_DEFINE_UNQUOTED([JEMALLOC_HAS_RESTRICT])
+     else
+       JE_CFLAGS_APPEND([-std=gnu99])
+       if test "x$je_cv_cflags_appended" = "x-std=gnu99" ; then
+         AC_DEFINE_UNQUOTED([JEMALLOC_HAS_RESTRICT])
+       fi
+@@ -350,73 +349,76 @@ dnl Define cpp macros in CPPFLAGS, rathe
+ dnl definitions need to be seen before any headers are included, which is a pain
+ dnl to make happen otherwise.
+ CFLAGS="$CFLAGS"
+ default_munmap="1"
+ maps_coalesce="1"
+ case "${host}" in
+   *-*-darwin* | *-*-ios*)
+ 	abi="macho"
+-	AC_DEFINE([JEMALLOC_PURGE_MADVISE_FREE], [ ])
+ 	RPATH=""
+ 	LD_PRELOAD_VAR="DYLD_INSERT_LIBRARIES"
+ 	so="dylib"
+ 	importlib="${so}"
+ 	force_tls="0"
+ 	DSO_LDFLAGS='-shared -Wl,-install_name,$(LIBDIR)/$(@F)'
+ 	SOREV="${rev}.${so}"
+ 	sbrk_deprecated="1"
+ 	;;
+   *-*-freebsd*)
+ 	abi="elf"
+ 	AC_DEFINE([JEMALLOC_SYSCTL_VM_OVERCOMMIT], [ ])
+-	AC_DEFINE([JEMALLOC_PURGE_MADVISE_FREE], [ ])
+ 	force_lazy_lock="1"
+ 	;;
+   *-*-dragonfly*)
+ 	abi="elf"
+-	AC_DEFINE([JEMALLOC_PURGE_MADVISE_FREE], [ ])
+ 	;;
+   *-*-openbsd*)
+ 	abi="elf"
+-	AC_DEFINE([JEMALLOC_PURGE_MADVISE_FREE], [ ])
+ 	force_tls="0"
+ 	;;
+   *-*-bitrig*)
+ 	abi="elf"
+-	AC_DEFINE([JEMALLOC_PURGE_MADVISE_FREE], [ ])
+ 	;;
+-  *-*-linux*)
++  *-*-linux-android)
+ 	dnl syscall(2) and secure_getenv(3) are exposed by _GNU_SOURCE.
+ 	CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
+ 	abi="elf"
+ 	AC_DEFINE([JEMALLOC_HAS_ALLOCA_H])
+ 	AC_DEFINE([JEMALLOC_PROC_SYS_VM_OVERCOMMIT_MEMORY], [ ])
+-	AC_DEFINE([JEMALLOC_PURGE_MADVISE_DONTNEED], [ ])
++	AC_DEFINE([JEMALLOC_THREADED_INIT], [ ])
++	AC_DEFINE([JEMALLOC_C11ATOMICS])
++	force_tls="0"
++	default_munmap="0"
++	;;
++  *-*-linux* | *-*-kfreebsd*)
++	dnl syscall(2) and secure_getenv(3) are exposed by _GNU_SOURCE.
++	CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
++	abi="elf"
++	AC_DEFINE([JEMALLOC_HAS_ALLOCA_H])
++	AC_DEFINE([JEMALLOC_PROC_SYS_VM_OVERCOMMIT_MEMORY], [ ])
+ 	AC_DEFINE([JEMALLOC_THREADED_INIT], [ ])
+ 	AC_DEFINE([JEMALLOC_USE_CXX_THROW], [ ])
+ 	default_munmap="0"
+ 	;;
+   *-*-netbsd*)
+ 	AC_MSG_CHECKING([ABI])
+         AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+ [[#ifdef __ELF__
+ /* ELF */
+ #else
+ #error aout
+ #endif
+ ]])],
+                           [abi="elf"],
+                           [abi="aout"])
+ 	AC_MSG_RESULT([$abi])
+-	AC_DEFINE([JEMALLOC_PURGE_MADVISE_FREE], [ ])
+ 	;;
+   *-*-solaris2*)
+ 	abi="elf"
+-	AC_DEFINE([JEMALLOC_PURGE_MADVISE_FREE], [ ])
+ 	RPATH='-Wl,-R,$(1)'
+ 	dnl Solaris needs this for sigwait().
+ 	CPPFLAGS="$CPPFLAGS -D_POSIX_PTHREAD_SEMANTICS"
+ 	LIBS="$LIBS -lposix4 -lsocket -lnsl"
+ 	;;
+   *-ibm-aix*)
+ 	if "$LG_SIZEOF_PTR" = "8"; then
+ 	  dnl 64bit AIX
+@@ -1322,16 +1324,24 @@ dnl Configure pthreads.
+ 
+ if test "x$abi" != "xpecoff" ; then
+   AC_CHECK_HEADERS([pthread.h], , [AC_MSG_ERROR([pthread.h is missing])])
+   dnl Some systems may embed pthreads functionality in libc; check for libpthread
+   dnl first, but try libc too before failing.
+   AC_CHECK_LIB([pthread], [pthread_create], [LIBS="$LIBS -lpthread"],
+                [AC_SEARCH_LIBS([pthread_create], , ,
+                                AC_MSG_ERROR([libpthread is missing]))])
++  JE_COMPILABLE([pthread_atfork(3)], [
++#include <pthread.h>
++], [
++  pthread_atfork((void *)0, (void *)0, (void *)0);
++], [je_cv_pthread_atfork])
++  if test "x${je_cv_pthread_atfork}" = "xyes" ; then
++    AC_DEFINE([JEMALLOC_HAVE_PTHREAD_ATFORK], [ ])
++  fi
+ fi
+ 
+ CPPFLAGS="$CPPFLAGS -D_REENTRANT"
+ 
+ dnl Check whether clock_gettime(2) is in libc or librt.
+ AC_SEARCH_LIBS([clock_gettime], [rt])
+ 
+ dnl Cray wrapper compiler often adds `-lrt` when using `-static`. Check with
+@@ -1381,30 +1391,43 @@ JE_COMPILABLE([mach_absolute_time()], [
+ #include <mach/mach_time.h>
+ ], [
+ 	mach_absolute_time();
+ ], [je_cv_mach_absolute_time])
+ if test "x${je_cv_mach_absolute_time}" = "xyes" ; then
+   AC_DEFINE([JEMALLOC_HAVE_MACH_ABSOLUTE_TIME])
+ fi
+ 
+-dnl Check if syscall(2) is usable.  Treat warnings as errors, so that e.g. OS X
+-dnl 10.12's deprecation warning prevents use.
+-SAVED_CFLAGS="${CFLAGS}"
+-JE_CFLAGS_APPEND([-Werror])
+-JE_COMPILABLE([syscall(2)], [
++dnl Use syscall(2) (if available) by default.
++AC_ARG_ENABLE([syscall],
++  [AS_HELP_STRING([--disable-syscall], [Disable use of syscall(2)])],
++[if test "x$enable_syscall" = "xno" ; then
++  enable_syscall="0"
++else
++  enable_syscall="1"
++fi
++],
++[enable_syscall="1"]
++)
++if test "x$enable_syscall" = "x1" ; then
++  dnl Check if syscall(2) is usable.  Treat warnings as errors, so that e.g. OS
++  dnl X 10.12's deprecation warning prevents use.
++  SAVED_CFLAGS="${CFLAGS}"
++  JE_CFLAGS_APPEND([-Werror])
++  JE_COMPILABLE([syscall(2)], [
+ #include <sys/syscall.h>
+ #include <unistd.h>
+ ], [
+ 	syscall(SYS_write, 2, "hello", 5);
+ ],
+-              [je_cv_syscall])
+-CFLAGS="${SAVED_CFLAGS}"
+-if test "x$je_cv_syscall" = "xyes" ; then
+-  AC_DEFINE([JEMALLOC_HAVE_SYSCALL], [ ])
++                [je_cv_syscall])
++  CFLAGS="${SAVED_CFLAGS}"
++  if test "x$je_cv_syscall" = "xyes" ; then
++    AC_DEFINE([JEMALLOC_USE_SYSCALL], [ ])
++  fi
+ fi
+ 
+ dnl Check if the GNU-specific secure_getenv function exists.
+ AC_CHECK_FUNC([secure_getenv],
+               [have_secure_getenv="1"],
+               [have_secure_getenv="0"]
+              )
+ if test "x$have_secure_getenv" = "x1" ; then
+@@ -1594,22 +1617,51 @@ if test "x${je_cv_osatomic}" = "xyes" ; 
+ fi
+ 
+ dnl ============================================================================
+ dnl Check for madvise(2).
+ 
+ JE_COMPILABLE([madvise(2)], [
+ #include <sys/mman.h>
+ ], [
+-	{
+-		madvise((void *)0, 0, 0);
+-	}
++	madvise((void *)0, 0, 0);
+ ], [je_cv_madvise])
+ if test "x${je_cv_madvise}" = "xyes" ; then
+   AC_DEFINE([JEMALLOC_HAVE_MADVISE], [ ])
++
++  dnl Check for madvise(..., MADV_FREE).
++  JE_COMPILABLE([madvise(..., MADV_FREE)], [
++#include <sys/mman.h>
++], [
++	madvise((void *)0, 0, MADV_FREE);
++], [je_cv_madv_free])
++  if test "x${je_cv_madv_free}" = "xyes" ; then
++    AC_DEFINE([JEMALLOC_PURGE_MADVISE_FREE], [ ])
++  fi
++
++  dnl Check for madvise(..., MADV_DONTNEED).
++  JE_COMPILABLE([madvise(..., MADV_DONTNEED)], [
++#include <sys/mman.h>
++], [
++	madvise((void *)0, 0, MADV_DONTNEED);
++], [je_cv_madv_dontneed])
++  if test "x${je_cv_madv_dontneed}" = "xyes" ; then
++    AC_DEFINE([JEMALLOC_PURGE_MADVISE_DONTNEED], [ ])
++  fi
++
++  dnl Check for madvise(..., MADV_[NO]HUGEPAGE).
++  JE_COMPILABLE([madvise(..., MADV_[[NO]]HUGEPAGE)], [
++#include <sys/mman.h>
++], [
++	madvise((void *)0, 0, MADV_HUGEPAGE);
++	madvise((void *)0, 0, MADV_NOHUGEPAGE);
++], [je_cv_thp])
++  if test "x${je_cv_thp}" = "xyes" ; then
++    AC_DEFINE([JEMALLOC_THP], [ ])
++  fi
+ fi
+ 
+ dnl ============================================================================
+ dnl Check whether __sync_{add,sub}_and_fetch() are available despite
+ dnl __GCC_HAVE_SYNC_COMPARE_AND_SWAP_n macros being undefined.
+ 
+ AC_DEFUN([JE_SYNC_COMPARE_AND_SWAP_CHECK],[
+   AC_CACHE_CHECK([whether to force $1-bit __sync_{add,sub}_and_fetch()],
+@@ -1664,20 +1716,25 @@ if test "x${je_cv_builtin_clz}" = "xyes"
+   AC_DEFINE([JEMALLOC_HAVE_BUILTIN_CLZ], [ ])
+ fi
+ 
+ dnl ============================================================================
+ dnl Check for os_unfair_lock operations as provided on Darwin.
+ 
+ JE_COMPILABLE([Darwin os_unfair_lock_*()], [
+ #include <os/lock.h>
++#include <AvailabilityMacros.h>
+ ], [
++	#if MAC_OS_X_VERSION_MIN_REQUIRED < 101200
++	#error "os_unfair_lock is not supported"
++	#else
+ 	os_unfair_lock lock = OS_UNFAIR_LOCK_INIT;
+ 	os_unfair_lock_lock(&lock);
+ 	os_unfair_lock_unlock(&lock);
++	#endif
+ ], [je_cv_os_unfair_lock])
+ if test "x${je_cv_os_unfair_lock}" = "xyes" ; then
+   AC_DEFINE([JEMALLOC_OS_UNFAIR_LOCK], [ ])
+ fi
+ 
+ dnl ============================================================================
+ dnl Check for spinlock(3) operations as provided on Darwin.
+ 
+diff --git a/memory/jemalloc/src/doc/jemalloc.xml.in b/memory/jemalloc/src/doc/jemalloc.xml.in
+--- a/memory/jemalloc/src/doc/jemalloc.xml.in
++++ b/memory/jemalloc/src/doc/jemalloc.xml.in
+@@ -401,17 +401,17 @@ mallctl("arenas.nbins", &nbins, &len, NU
+ 
+ miblen = 4;
+ mallctlnametomib("arenas.bin.0.size", mib, &miblen);
+ for (i = 0; i < nbins; i++) {
+ 	size_t bin_size;
+ 
+ 	mib[2] = i;
+ 	len = sizeof(bin_size);
+-	mallctlbymib(mib, miblen, &bin_size, &len, NULL, 0);
++	mallctlbymib(mib, miblen, (void *)&bin_size, &len, NULL, 0);
+ 	/* Do something with bin_size... */
+ }]]></programlisting></para>
+ 
+       <para>The <function>malloc_stats_print()</function> function writes
+       summary statistics via the <parameter>write_cb</parameter> callback
+       function pointer and <parameter>cbopaque</parameter> data passed to
+       <parameter>write_cb</parameter>, or <function>malloc_message()</function>
+       if <parameter>write_cb</parameter> is <constant>NULL</constant>.  The
+diff --git a/memory/jemalloc/src/include/jemalloc/internal/arena.h b/memory/jemalloc/src/include/jemalloc/internal/arena.h
+--- a/memory/jemalloc/src/include/jemalloc/internal/arena.h
++++ b/memory/jemalloc/src/include/jemalloc/internal/arena.h
+@@ -186,16 +186,24 @@ struct arena_chunk_s {
+ 	/*
+ 	 * A pointer to the arena that owns the chunk is stored within the node.
+ 	 * This field as a whole is used by chunks_rtree to support both
+ 	 * ivsalloc() and core-based debugging.
+ 	 */
+ 	extent_node_t		node;
+ 
+ 	/*
++	 * True if memory could be backed by transparent huge pages.  This is
++	 * only directly relevant to Linux, since it is the only supported
++	 * platform on which jemalloc interacts with explicit transparent huge
++	 * page controls.
++	 */
++	bool			hugepage;
++
++	/*
+ 	 * Map of pages within chunk that keeps track of free/large/small.  The
+ 	 * first map_bias entries are omitted, since the chunk header does not
+ 	 * need to be tracked in the map.  This omission saves a header page
+ 	 * for common chunk sizes (e.g. 4 MiB).
+ 	 */
+ 	arena_chunk_map_bits_t	map_bits[1]; /* Dynamically sized. */
+ };
+ 
+@@ -369,20 +377,22 @@ struct arena_s {
+ 	/*
+ 	 * PRNG state for cache index randomization of large allocation base
+ 	 * pointers.
+ 	 */
+ 	size_t			offset_state;
+ 
+ 	dss_prec_t		dss_prec;
+ 
+-
+ 	/* Extant arena chunks. */
+ 	ql_head(extent_node_t)	achunks;
+ 
++	/* Extent serial number generator state. */
++	size_t			extent_sn_next;
++
+ 	/*
+ 	 * In order to avoid rapid chunk allocation/deallocation when an arena
+ 	 * oscillates right on the cusp of needing a new chunk, cache the most
+ 	 * recently freed chunk.  The spare is left in the arena's chunk trees
+ 	 * until it is deleted.
+ 	 *
+ 	 * There is one spare chunk per arena, rather than one spare total, in
+ 	 * order to avoid interactions between multiple threads that could make
+@@ -448,19 +458,19 @@ struct arena_s {
+ 
+ 	/*
+ 	 * Trees of chunks that were previously allocated (trees differ only in
+ 	 * node ordering).  These are used when allocating chunks, in an attempt
+ 	 * to re-use address space.  Depending on function, different tree
+ 	 * orderings are needed, which is why there are two trees with the same
+ 	 * contents.
+ 	 */
+-	extent_tree_t		chunks_szad_cached;
++	extent_tree_t		chunks_szsnad_cached;
+ 	extent_tree_t		chunks_ad_cached;
+-	extent_tree_t		chunks_szad_retained;
++	extent_tree_t		chunks_szsnad_retained;
+ 	extent_tree_t		chunks_ad_retained;
+ 
+ 	malloc_mutex_t		chunks_mtx;
+ 	/* Cache of nodes that were allocated via base_alloc(). */
+ 	ql_head(extent_node_t)	node_cache;
+ 	malloc_mutex_t		node_cache_mtx;
+ 
+ 	/* User-configurable chunk hook functions. */
+@@ -517,23 +527,23 @@ extern run_quantize_t *run_quantize_ceil
+ #endif
+ void	arena_chunk_cache_maybe_insert(arena_t *arena, extent_node_t *node,
+     bool cache);
+ void	arena_chunk_cache_maybe_remove(arena_t *arena, extent_node_t *node,
+     bool cache);
+ extent_node_t	*arena_node_alloc(tsdn_t *tsdn, arena_t *arena);
+ void	arena_node_dalloc(tsdn_t *tsdn, arena_t *arena, extent_node_t *node);
+ void	*arena_chunk_alloc_huge(tsdn_t *tsdn, arena_t *arena, size_t usize,
+-    size_t alignment, bool *zero);
++    size_t alignment, size_t *sn, bool *zero);
+ void	arena_chunk_dalloc_huge(tsdn_t *tsdn, arena_t *arena, void *chunk,
+-    size_t usize);
++    size_t usize, size_t sn);
+ void	arena_chunk_ralloc_huge_similar(tsdn_t *tsdn, arena_t *arena,
+     void *chunk, size_t oldsize, size_t usize);
+ void	arena_chunk_ralloc_huge_shrink(tsdn_t *tsdn, arena_t *arena,
+-    void *chunk, size_t oldsize, size_t usize);
++    void *chunk, size_t oldsize, size_t usize, size_t sn);
+ bool	arena_chunk_ralloc_huge_expand(tsdn_t *tsdn, arena_t *arena,
+     void *chunk, size_t oldsize, size_t usize, bool *zero);
+ ssize_t	arena_lg_dirty_mult_get(tsdn_t *tsdn, arena_t *arena);
+ bool	arena_lg_dirty_mult_set(tsdn_t *tsdn, arena_t *arena,
+     ssize_t lg_dirty_mult);
+ ssize_t	arena_decay_time_get(tsdn_t *tsdn, arena_t *arena);
+ bool	arena_decay_time_set(tsdn_t *tsdn, arena_t *arena, ssize_t decay_time);
+ void	arena_purge(tsdn_t *tsdn, arena_t *arena, bool all);
+@@ -596,16 +606,17 @@ void	arena_basic_stats_merge(tsdn_t *tsd
+ void	arena_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads,
+     const char **dss, ssize_t *lg_dirty_mult, ssize_t *decay_time,
+     size_t *nactive, size_t *ndirty, arena_stats_t *astats,
+     malloc_bin_stats_t *bstats, malloc_large_stats_t *lstats,
+     malloc_huge_stats_t *hstats);
+ unsigned	arena_nthreads_get(arena_t *arena, bool internal);
+ void	arena_nthreads_inc(arena_t *arena, bool internal);
+ void	arena_nthreads_dec(arena_t *arena, bool internal);
++size_t	arena_extent_sn_next(arena_t *arena);
+ arena_t	*arena_new(tsdn_t *tsdn, unsigned ind);
+ void	arena_boot(void);
+ void	arena_prefork0(tsdn_t *tsdn, arena_t *arena);
+ void	arena_prefork1(tsdn_t *tsdn, arena_t *arena);
+ void	arena_prefork2(tsdn_t *tsdn, arena_t *arena);
+ void	arena_prefork3(tsdn_t *tsdn, arena_t *arena);
+ void	arena_postfork_parent(tsdn_t *tsdn, arena_t *arena);
+ void	arena_postfork_child(tsdn_t *tsdn, arena_t *arena);
+diff --git a/memory/jemalloc/src/include/jemalloc/internal/chunk.h b/memory/jemalloc/src/include/jemalloc/internal/chunk.h
+--- a/memory/jemalloc/src/include/jemalloc/internal/chunk.h
++++ b/memory/jemalloc/src/include/jemalloc/internal/chunk.h
+@@ -53,25 +53,26 @@ chunk_hooks_t	chunk_hooks_set(tsdn_t *ts
+     const chunk_hooks_t *chunk_hooks);
+ 
+ bool	chunk_register(tsdn_t *tsdn, const void *chunk,
+     const extent_node_t *node);
+ void	chunk_deregister(const void *chunk, const extent_node_t *node);
+ void	*chunk_alloc_base(size_t size);
+ void	*chunk_alloc_cache(tsdn_t *tsdn, arena_t *arena,
+     chunk_hooks_t *chunk_hooks, void *new_addr, size_t size, size_t alignment,
+-    bool *zero, bool *commit, bool dalloc_node);
++    size_t *sn, bool *zero, bool *commit, bool dalloc_node);
+ void	*chunk_alloc_wrapper(tsdn_t *tsdn, arena_t *arena,
+     chunk_hooks_t *chunk_hooks, void *new_addr, size_t size, size_t alignment,
+-    bool *zero, bool *commit);
++    size_t *sn, bool *zero, bool *commit);
+ void	chunk_dalloc_cache(tsdn_t *tsdn, arena_t *arena,
+-    chunk_hooks_t *chunk_hooks, void *chunk, size_t size, bool committed);
++    chunk_hooks_t *chunk_hooks, void *chunk, size_t size, size_t sn,
++    bool committed);
+ void	chunk_dalloc_wrapper(tsdn_t *tsdn, arena_t *arena,
+-    chunk_hooks_t *chunk_hooks, void *chunk, size_t size, bool zeroed,
+-    bool committed);
++    chunk_hooks_t *chunk_hooks, void *chunk, size_t size, size_t sn,
++    bool zeroed, bool committed);
+ bool	chunk_purge_wrapper(tsdn_t *tsdn, arena_t *arena,
+     chunk_hooks_t *chunk_hooks, void *chunk, size_t size, size_t offset,
+     size_t length);
+ bool	chunk_boot(void);
+ 
+ #endif /* JEMALLOC_H_EXTERNS */
+ /******************************************************************************/
+ #ifdef JEMALLOC_H_INLINES
+diff --git a/memory/jemalloc/src/include/jemalloc/internal/extent.h b/memory/jemalloc/src/include/jemalloc/internal/extent.h
+--- a/memory/jemalloc/src/include/jemalloc/internal/extent.h
++++ b/memory/jemalloc/src/include/jemalloc/internal/extent.h
+@@ -14,16 +14,30 @@ struct extent_node_s {
+ 
+ 	/* Pointer to the extent that this tree node is responsible for. */
+ 	void			*en_addr;
+ 
+ 	/* Total region size. */
+ 	size_t			en_size;
+ 
+ 	/*
++	 * Serial number (potentially non-unique).
++	 *
++	 * In principle serial numbers can wrap around on 32-bit systems if
++	 * JEMALLOC_MUNMAP is defined, but as long as comparison functions fall
++	 * back on address comparison for equal serial numbers, stable (if
++	 * imperfect) ordering is maintained.
++	 *
++	 * Serial numbers may not be unique even in the absence of wrap-around,
++	 * e.g. when splitting an extent and assigning the same serial number to
++	 * both resulting adjacent extents.
++	 */
++	size_t			en_sn;
++
++	/*
+ 	 * The zeroed flag is used by chunk recycling code to track whether
+ 	 * memory is zero-filled.
+ 	 */
+ 	bool			en_zeroed;
+ 
+ 	/*
+ 	 * True if physical memory is committed to the extent, whether
+ 	 * explicitly or implicitly as on a system that overcommits and
+@@ -40,57 +54,59 @@ struct extent_node_s {
+ 	/* Profile counters, used for huge objects. */
+ 	prof_tctx_t		*en_prof_tctx;
+ 
+ 	/* Linkage for arena's runs_dirty and chunks_cache rings. */
+ 	arena_runs_dirty_link_t	rd;
+ 	qr(extent_node_t)	cc_link;
+ 
+ 	union {
+-		/* Linkage for the size/address-ordered tree. */
+-		rb_node(extent_node_t)	szad_link;
++		/* Linkage for the size/sn/address-ordered tree. */
++		rb_node(extent_node_t)	szsnad_link;
+ 
+ 		/* Linkage for arena's achunks, huge, and node_cache lists. */
+ 		ql_elm(extent_node_t)	ql_link;
+ 	};
+ 
+ 	/* Linkage for the address-ordered tree. */
+ 	rb_node(extent_node_t)	ad_link;
+ };
+ typedef rb_tree(extent_node_t) extent_tree_t;
+ 
+ #endif /* JEMALLOC_H_STRUCTS */
+ /******************************************************************************/
+ #ifdef JEMALLOC_H_EXTERNS
+ 
+-rb_proto(, extent_tree_szad_, extent_tree_t, extent_node_t)
++rb_proto(, extent_tree_szsnad_, extent_tree_t, extent_node_t)
+ 
+ rb_proto(, extent_tree_ad_, extent_tree_t, extent_node_t)
+ 
+ #endif /* JEMALLOC_H_EXTERNS */
+ /******************************************************************************/
+ #ifdef JEMALLOC_H_INLINES
+ 
+ #ifndef JEMALLOC_ENABLE_INLINE
+ arena_t	*extent_node_arena_get(const extent_node_t *node);
+ void	*extent_node_addr_get(const extent_node_t *node);
+ size_t	extent_node_size_get(const extent_node_t *node);
++size_t	extent_node_sn_get(const extent_node_t *node);
+ bool	extent_node_zeroed_get(const extent_node_t *node);
+ bool	extent_node_committed_get(const extent_node_t *node);
+ bool	extent_node_achunk_get(const extent_node_t *node);
+ prof_tctx_t	*extent_node_prof_tctx_get(const extent_node_t *node);
+ void	extent_node_arena_set(extent_node_t *node, arena_t *arena);
+ void	extent_node_addr_set(extent_node_t *node, void *addr);
+ void	extent_node_size_set(extent_node_t *node, size_t size);
++void	extent_node_sn_set(extent_node_t *node, size_t sn);
+ void	extent_node_zeroed_set(extent_node_t *node, bool zeroed);
+ void	extent_node_committed_set(extent_node_t *node, bool committed);
+ void	extent_node_achunk_set(extent_node_t *node, bool achunk);
+ void	extent_node_prof_tctx_set(extent_node_t *node, prof_tctx_t *tctx);
+ void	extent_node_init(extent_node_t *node, arena_t *arena, void *addr,
+-    size_t size, bool zeroed, bool committed);
++    size_t size, size_t sn, bool zeroed, bool committed);
+ void	extent_node_dirty_linkage_init(extent_node_t *node);
+ void	extent_node_dirty_insert(extent_node_t *node,
+     arena_runs_dirty_link_t *runs_dirty, extent_node_t *chunks_dirty);
+ void	extent_node_dirty_remove(extent_node_t *node);
+ #endif
+ 
+ #if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_EXTENT_C_))
+ JEMALLOC_INLINE arena_t *
+@@ -109,16 +125,23 @@ extent_node_addr_get(const extent_node_t
+ 
+ JEMALLOC_INLINE size_t
+ extent_node_size_get(const extent_node_t *node)
+ {
+ 
+ 	return (node->en_size);
+ }
+ 
++JEMALLOC_INLINE size_t
++extent_node_sn_get(const extent_node_t *node)
++{
++
++	return (node->en_sn);
++}
++
+ JEMALLOC_INLINE bool
+ extent_node_zeroed_get(const extent_node_t *node)
+ {
+ 
+ 	return (node->en_zeroed);
+ }
+ 
+ JEMALLOC_INLINE bool
+@@ -160,16 +183,23 @@ extent_node_addr_set(extent_node_t *node
+ JEMALLOC_INLINE void
+ extent_node_size_set(extent_node_t *node, size_t size)
+ {
+ 
+ 	node->en_size = size;
+ }
+ 
+ JEMALLOC_INLINE void
++extent_node_sn_set(extent_node_t *node, size_t sn)
++{
++
++	node->en_sn = sn;
++}
++
++JEMALLOC_INLINE void
+ extent_node_zeroed_set(extent_node_t *node, bool zeroed)
+ {
+ 
+ 	node->en_zeroed = zeroed;
+ }
+ 
+ JEMALLOC_INLINE void
+ extent_node_committed_set(extent_node_t *node, bool committed)
+@@ -189,22 +219,23 @@ JEMALLOC_INLINE void
+ extent_node_prof_tctx_set(extent_node_t *node, prof_tctx_t *tctx)
+ {
+ 
+ 	node->en_prof_tctx = tctx;
+ }
+ 
+ JEMALLOC_INLINE void
+ extent_node_init(extent_node_t *node, arena_t *arena, void *addr, size_t size,
+-    bool zeroed, bool committed)
++    size_t sn, bool zeroed, bool committed)
+ {
+ 
+ 	extent_node_arena_set(node, arena);
+ 	extent_node_addr_set(node, addr);
+ 	extent_node_size_set(node, size);
++	extent_node_sn_set(node, sn);
+ 	extent_node_zeroed_set(node, zeroed);
+ 	extent_node_committed_set(node, committed);
+ 	extent_node_achunk_set(node, false);
+ 	if (config_prof)
+ 		extent_node_prof_tctx_set(node, NULL);
+ }
+ 
+ JEMALLOC_INLINE void
+diff --git a/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal.h.in b/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal.h.in
+--- a/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal.h.in
++++ b/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal.h.in
+@@ -332,25 +332,25 @@ typedef unsigned szind_t;
+ 	((void *)((uintptr_t)(a) & ~PAGE_MASK))
+ 
+ /* Return the smallest pagesize multiple that is >= s. */
+ #define	PAGE_CEILING(s)							\
+ 	(((s) + PAGE_MASK) & ~PAGE_MASK)
+ 
+ /* Return the nearest aligned address at or below a. */
+ #define	ALIGNMENT_ADDR2BASE(a, alignment)				\
+-	((void *)((uintptr_t)(a) & (-(alignment))))
++	((void *)((uintptr_t)(a) & ((~(alignment)) + 1)))
+ 
+ /* Return the offset between a and the nearest aligned address at or below a. */
+ #define	ALIGNMENT_ADDR2OFFSET(a, alignment)				\
+ 	((size_t)((uintptr_t)(a) & (alignment - 1)))
+ 
+ /* Return the smallest alignment multiple that is >= s. */
+ #define	ALIGNMENT_CEILING(s, alignment)					\
+-	(((s) + (alignment - 1)) & (-(alignment)))
++	(((s) + (alignment - 1)) & ((~(alignment)) + 1))
+ 
+ /* Declare a variable-length array. */
+ #if __STDC_VERSION__ < 199901L
+ #  ifdef _MSC_VER
+ #    include <malloc.h>
+ #    define alloca _alloca
+ #  else
+ #    ifdef JEMALLOC_HAS_ALLOCA_H
+diff --git a/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal_defs.h.in b/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal_defs.h.in
+--- a/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal_defs.h.in
++++ b/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal_defs.h.in
+@@ -51,44 +51,42 @@
+ #undef JE_FORCE_SYNC_COMPARE_AND_SWAP_8
+ 
+ /*
+  * Defined if __builtin_clz() and __builtin_clzl() are available.
+  */
+ #undef JEMALLOC_HAVE_BUILTIN_CLZ
+ 
+ /*
+- * Defined if madvise(2) is available.
+- */
+-#undef JEMALLOC_HAVE_MADVISE
+-
+-/*
+  * Defined if os_unfair_lock_*() functions are available, as provided by Darwin.
+  */
+ #undef JEMALLOC_OS_UNFAIR_LOCK
+ 
+ /*
+  * Defined if OSSpin*() functions are available, as provided by Darwin, and
+  * documented in the spinlock(3) manual page.
+  */
+ #undef JEMALLOC_OSSPIN
+ 
+-/* Defined if syscall(2) is available. */
+-#undef JEMALLOC_HAVE_SYSCALL
++/* Defined if syscall(2) is usable. */
++#undef JEMALLOC_USE_SYSCALL
+ 
+ /*
+  * Defined if secure_getenv(3) is available.
+  */
+ #undef JEMALLOC_HAVE_SECURE_GETENV
+ 
+ /*
+  * Defined if issetugid(2) is available.
+  */
+ #undef JEMALLOC_HAVE_ISSETUGID
+ 
++/* Defined if pthread_atfork(3) is available. */
++#undef JEMALLOC_HAVE_PTHREAD_ATFORK
++
+ /*
+  * Defined if clock_gettime(CLOCK_MONOTONIC_COARSE, ...) is available.
+  */
+ #undef JEMALLOC_HAVE_CLOCK_MONOTONIC_COARSE
+ 
+ /*
+  * Defined if clock_gettime(CLOCK_MONOTONIC, ...) is available.
+  */
+@@ -247,28 +245,36 @@
+  * Methods for determining whether the OS overcommits.
+  * JEMALLOC_PROC_SYS_VM_OVERCOMMIT_MEMORY: Linux's
+  *                                         /proc/sys/vm.overcommit_memory file.
+  * JEMALLOC_SYSCTL_VM_OVERCOMMIT: FreeBSD's vm.overcommit sysctl.
+  */
+ #undef JEMALLOC_SYSCTL_VM_OVERCOMMIT
+ #undef JEMALLOC_PROC_SYS_VM_OVERCOMMIT_MEMORY
+ 
++/* Defined if madvise(2) is available. */
++#undef JEMALLOC_HAVE_MADVISE
++
+ /*
+  * Methods for purging unused pages differ between operating systems.
+  *
+- *   madvise(..., MADV_DONTNEED) : On Linux, this immediately discards pages,
+- *                                 such that new pages will be demand-zeroed if
+- *                                 the address region is later touched.
+- *   madvise(..., MADV_FREE) : On FreeBSD and Darwin, this marks pages as being
+- *                             unused, such that they will be discarded rather
+- *                             than swapped out.
++ *   madvise(..., MADV_FREE) : This marks pages as being unused, such that they
++ *                             will be discarded rather than swapped out.
++ *   madvise(..., MADV_DONTNEED) : This immediately discards pages, such that
++ *                                 new pages will be demand-zeroed if the
++ *                                 address region is later touched.
+  */
++#undef JEMALLOC_PURGE_MADVISE_FREE
+ #undef JEMALLOC_PURGE_MADVISE_DONTNEED
+-#undef JEMALLOC_PURGE_MADVISE_FREE
++
++/*
++ * Defined if transparent huge pages are supported via the MADV_[NO]HUGEPAGE
++ * arguments to madvise(2).
++ */
++#undef JEMALLOC_THP
+ 
+ /* Define if operating system has alloca.h header. */
+ #undef JEMALLOC_HAS_ALLOCA_H
+ 
+ /* C99 restrict keyword supported. */
+ #undef JEMALLOC_HAS_RESTRICT
+ 
+ /* For use by hash code. */
+diff --git a/memory/jemalloc/src/include/jemalloc/internal/pages.h b/memory/jemalloc/src/include/jemalloc/internal/pages.h
+--- a/memory/jemalloc/src/include/jemalloc/internal/pages.h
++++ b/memory/jemalloc/src/include/jemalloc/internal/pages.h
+@@ -11,16 +11,18 @@
+ 
+ void	*pages_map(void *addr, size_t size, bool *commit);
+ void	pages_unmap(void *addr, size_t size);
+ void	*pages_trim(void *addr, size_t alloc_size, size_t leadsize,
+     size_t size, bool *commit);
+ bool	pages_commit(void *addr, size_t size);
+ bool	pages_decommit(void *addr, size_t size);
+ bool	pages_purge(void *addr, size_t size);
++bool	pages_huge(void *addr, size_t size);
++bool	pages_nohuge(void *addr, size_t size);
+ void	pages_boot(void);
+ 
+ #endif /* JEMALLOC_H_EXTERNS */
+ /******************************************************************************/
+ #ifdef JEMALLOC_H_INLINES
+ 
+ #endif /* JEMALLOC_H_INLINES */
+ /******************************************************************************/
+diff --git a/memory/jemalloc/src/include/jemalloc/internal/private_symbols.txt b/memory/jemalloc/src/include/jemalloc/internal/private_symbols.txt
+--- a/memory/jemalloc/src/include/jemalloc/internal/private_symbols.txt
++++ b/memory/jemalloc/src/include/jemalloc/internal/private_symbols.txt
+@@ -31,16 +31,17 @@ arena_dalloc_small
+ arena_decay_tick
+ arena_decay_ticks
+ arena_decay_time_default_get
+ arena_decay_time_default_set
+ arena_decay_time_get
+ arena_decay_time_set
+ arena_dss_prec_get
+ arena_dss_prec_set
++arena_extent_sn_next
+ arena_get
+ arena_ichoose
+ arena_init
+ arena_lg_dirty_mult_default_get
+ arena_lg_dirty_mult_default_set
+ arena_lg_dirty_mult_get
+ arena_lg_dirty_mult_set
+ arena_malloc
+@@ -213,16 +214,18 @@ extent_node_committed_set
+ extent_node_dirty_insert
+ extent_node_dirty_linkage_init
+ extent_node_dirty_remove
+ extent_node_init
+ extent_node_prof_tctx_get
+ extent_node_prof_tctx_set
+ extent_node_size_get
+ extent_node_size_set
++extent_node_sn_get
++extent_node_sn_set
+ extent_node_zeroed_get
+ extent_node_zeroed_set
+ extent_tree_ad_destroy
+ extent_tree_ad_destroy_recurse
+ extent_tree_ad_empty
+ extent_tree_ad_first
+ extent_tree_ad_insert
+ extent_tree_ad_iter
+@@ -234,35 +237,35 @@ extent_tree_ad_next
+ extent_tree_ad_nsearch
+ extent_tree_ad_prev
+ extent_tree_ad_psearch
+ extent_tree_ad_remove
+ extent_tree_ad_reverse_iter
+ extent_tree_ad_reverse_iter_recurse
+ extent_tree_ad_reverse_iter_start
+ extent_tree_ad_search
+-extent_tree_szad_destroy
+-extent_tree_szad_destroy_recurse
+-extent_tree_szad_empty
+-extent_tree_szad_first
+-extent_tree_szad_insert
+-extent_tree_szad_iter
+-extent_tree_szad_iter_recurse
+-extent_tree_szad_iter_start
+-extent_tree_szad_last
+-extent_tree_szad_new
+-extent_tree_szad_next
+-extent_tree_szad_nsearch
+-extent_tree_szad_prev
+-extent_tree_szad_psearch
+-extent_tree_szad_remove
+-extent_tree_szad_reverse_iter
+-extent_tree_szad_reverse_iter_recurse
+-extent_tree_szad_reverse_iter_start
+-extent_tree_szad_search
++extent_tree_szsnad_destroy
++extent_tree_szsnad_destroy_recurse
++extent_tree_szsnad_empty
++extent_tree_szsnad_first
++extent_tree_szsnad_insert
++extent_tree_szsnad_iter
++extent_tree_szsnad_iter_recurse
++extent_tree_szsnad_iter_start
++extent_tree_szsnad_last
++extent_tree_szsnad_new
++extent_tree_szsnad_next
++extent_tree_szsnad_nsearch
++extent_tree_szsnad_prev
++extent_tree_szsnad_psearch
++extent_tree_szsnad_remove
++extent_tree_szsnad_reverse_iter
++extent_tree_szsnad_reverse_iter_recurse
++extent_tree_szsnad_reverse_iter_start
++extent_tree_szsnad_search
+ ffs_llu
+ ffs_lu
+ ffs_u
+ ffs_u32
+ ffs_u64
+ ffs_zu
+ get_errno
+ hash
+@@ -389,17 +392,19 @@ opt_stats_print
+ opt_tcache
+ opt_utrace
+ opt_xmalloc
+ opt_zero
+ p2rz
+ pages_boot
+ pages_commit
+ pages_decommit
++pages_huge
+ pages_map
++pages_nohuge
+ pages_purge
+ pages_trim
+ pages_unmap
+ pind2sz
+ pind2sz_compute
+ pind2sz_lookup
+ pind2sz_tab
+ pow2_ceil_u32
+diff --git a/memory/jemalloc/src/include/jemalloc/internal/stats.h b/memory/jemalloc/src/include/jemalloc/internal/stats.h
+--- a/memory/jemalloc/src/include/jemalloc/internal/stats.h
++++ b/memory/jemalloc/src/include/jemalloc/internal/stats.h
+@@ -170,32 +170,28 @@ stats_cactive_get(void)
+ {
+ 
+ 	return (atomic_read_z(&stats_cactive));
+ }
+ 
+ JEMALLOC_INLINE void
+ stats_cactive_add(size_t size)
+ {
+-	UNUSED size_t cactive;
+ 
+ 	assert(size > 0);
+ 	assert((size & chunksize_mask) == 0);
+ 
+-	cactive = atomic_add_z(&stats_cactive, size);
+-	assert(cactive - size < cactive);
++	atomic_add_z(&stats_cactive, size);
+ }
+ 
+ JEMALLOC_INLINE void
+ stats_cactive_sub(size_t size)
+ {
+-	UNUSED size_t cactive;
+ 
+ 	assert(size > 0);
+ 	assert((size & chunksize_mask) == 0);
+ 
+-	cactive = atomic_sub_z(&stats_cactive, size);
+-	assert(cactive + size > cactive);
++	atomic_sub_z(&stats_cactive, size);
+ }
+ #endif
+ 
+ #endif /* JEMALLOC_H_INLINES */
+ /******************************************************************************/
+diff --git a/memory/jemalloc/src/include/jemalloc/internal/util.h b/memory/jemalloc/src/include/jemalloc/internal/util.h
+--- a/memory/jemalloc/src/include/jemalloc/internal/util.h
++++ b/memory/jemalloc/src/include/jemalloc/internal/util.h
+@@ -36,18 +36,22 @@
+ 
+ /*
+  * Size of stack-allocated buffer used by malloc_{,v,vc}printf().  This must be
+  * large enough for all possible uses within jemalloc.
+  */
+ #define	MALLOC_PRINTF_BUFSIZE	4096
+ 
+ /* Junk fill patterns. */
+-#define	JEMALLOC_ALLOC_JUNK	((uint8_t)0xa5)
+-#define	JEMALLOC_FREE_JUNK	((uint8_t)0x5a)
++#ifndef JEMALLOC_ALLOC_JUNK
++#  define JEMALLOC_ALLOC_JUNK	((uint8_t)0xa5)
++#endif
++#ifndef JEMALLOC_FREE_JUNK
++#  define JEMALLOC_FREE_JUNK	((uint8_t)0x5a)
++#endif
+ 
+ /*
+  * Wrap a cpp argument that contains commas such that it isn't broken up into
+  * multiple arguments.
+  */
+ #define	JEMALLOC_ARG_CONCAT(...) __VA_ARGS__
+ 
+ /*
+diff --git a/memory/jemalloc/src/include/jemalloc/internal/valgrind.h b/memory/jemalloc/src/include/jemalloc/internal/valgrind.h
+--- a/memory/jemalloc/src/include/jemalloc/internal/valgrind.h
++++ b/memory/jemalloc/src/include/jemalloc/internal/valgrind.h
+@@ -31,36 +31,50 @@
+  * Valgrind reports errors, there are no extra stack frames in the backtraces.
+  */
+ #define	JEMALLOC_VALGRIND_MALLOC(cond, tsdn, ptr, usize, zero) do {	\
+ 	if (unlikely(in_valgrind && cond)) {				\
+ 		VALGRIND_MALLOCLIKE_BLOCK(ptr, usize, p2rz(tsdn, ptr),	\
+ 		    zero);						\
+ 	}								\
+ } while (0)
+-#define	JEMALLOC_VALGRIND_REALLOC(maybe_moved, tsdn, ptr, usize,	\
+-    ptr_maybe_null, old_ptr, old_usize, old_rzsize, old_ptr_maybe_null,	\
+-    zero) do {								\
++#define	JEMALLOC_VALGRIND_REALLOC_MOVED_no(ptr, old_ptr)		\
++    (false)
++#define	JEMALLOC_VALGRIND_REALLOC_MOVED_maybe(ptr, old_ptr)		\
++    ((ptr) != (old_ptr))
++#define	JEMALLOC_VALGRIND_REALLOC_PTR_NULL_no(ptr)			\
++    (false)
++#define	JEMALLOC_VALGRIND_REALLOC_PTR_NULL_maybe(ptr)			\
++    (ptr == NULL)
++#define	JEMALLOC_VALGRIND_REALLOC_OLD_PTR_NULL_no(old_ptr)		\
++    (false)
++#define	JEMALLOC_VALGRIND_REALLOC_OLD_PTR_NULL_maybe(old_ptr)		\
++    (old_ptr == NULL)
++#define	JEMALLOC_VALGRIND_REALLOC(moved, tsdn, ptr, usize, ptr_null,	\
++    old_ptr, old_usize, old_rzsize, old_ptr_null, zero) do {		\
+ 	if (unlikely(in_valgrind)) {					\
+ 		size_t rzsize = p2rz(tsdn, ptr);			\
+ 									\
+-		if (!maybe_moved || ptr == old_ptr) {			\
++		if (!JEMALLOC_VALGRIND_REALLOC_MOVED_##moved(ptr,	\
++		    old_ptr)) {						\
+ 			VALGRIND_RESIZEINPLACE_BLOCK(ptr, old_usize,	\
+ 			    usize, rzsize);				\
+ 			if (zero && old_usize < usize) {		\
+ 				valgrind_make_mem_defined(		\
+ 				    (void *)((uintptr_t)ptr +		\
+ 				    old_usize), usize - old_usize);	\
+ 			}						\
+ 		} else {						\
+-			if (!old_ptr_maybe_null || old_ptr != NULL) {	\
++			if (!JEMALLOC_VALGRIND_REALLOC_OLD_PTR_NULL_##	\
++			    old_ptr_null(old_ptr)) {			\
+ 				valgrind_freelike_block(old_ptr,	\
+ 				    old_rzsize);			\
+ 			}						\
+-			if (!ptr_maybe_null || ptr != NULL) {		\
++			if (!JEMALLOC_VALGRIND_REALLOC_PTR_NULL_##	\
++			    ptr_null(ptr)) {				\
+ 				size_t copy_size = (old_usize < usize)	\
+ 				    ?  old_usize : usize;		\
+ 				size_t tail_size = usize - copy_size;	\
+ 				VALGRIND_MALLOCLIKE_BLOCK(ptr, usize,	\
+ 				    rzsize, false);			\
+ 				if (copy_size > 0) {			\
+ 					valgrind_make_mem_defined(ptr,	\
+ 					copy_size);			\
+diff --git a/memory/jemalloc/src/msvc/projects/vc2015/test_threads/test_threads.cpp b/memory/jemalloc/src/msvc/projects/vc2015/test_threads/test_threads.cpp
+--- a/memory/jemalloc/src/msvc/projects/vc2015/test_threads/test_threads.cpp
++++ b/memory/jemalloc/src/msvc/projects/vc2015/test_threads/test_threads.cpp
+@@ -16,29 +16,29 @@ using std::thread;
+ using std::uniform_int_distribution;
+ using std::minstd_rand;
+ 
+ int test_threads()
+ {
+   je_malloc_conf = "narenas:3";
+   int narenas = 0;
+   size_t sz = sizeof(narenas);
+-  je_mallctl("opt.narenas", &narenas, &sz, NULL, 0);
++  je_mallctl("opt.narenas", (void *)&narenas, &sz, NULL, 0);
+   if (narenas != 3) {
+     printf("Error: unexpected number of arenas: %d\n", narenas);
+     return 1;
+   }
+   static const int sizes[] = { 7, 16, 32, 60, 91, 100, 120, 144, 169, 199, 255, 400, 670, 900, 917, 1025, 3333, 5190, 13131, 49192, 99999, 123123, 255265, 2333111 };
+   static const int numSizes = (int)(sizeof(sizes) / sizeof(sizes[0]));
+   vector<thread> workers;
+   static const int numThreads = narenas + 1, numAllocsMax = 25, numIter1 = 50, numIter2 = 50;
+   je_malloc_stats_print(NULL, NULL, NULL);
+   size_t allocated1;
+   size_t sz1 = sizeof(allocated1);
+-  je_mallctl("stats.active", &allocated1, &sz1, NULL, 0);
++  je_mallctl("stats.active", (void *)&allocated1, &sz1, NULL, 0);
+   printf("\nPress Enter to start threads...\n");
+   getchar();
+   printf("Starting %d threads x %d x %d iterations...\n", numThreads, numIter1, numIter2);
+   for (int i = 0; i < numThreads; i++) {
+     workers.emplace_back([tid=i]() {
+       uniform_int_distribution<int> sizeDist(0, numSizes - 1);
+       minstd_rand rnd(tid * 17);
+       uint8_t* ptrs[numAllocsMax];
+@@ -73,17 +73,17 @@ int test_threads()
+       }
+     });
+   }
+   for (thread& t : workers) {
+     t.join();
+   }
+   je_malloc_stats_print(NULL, NULL, NULL);
+   size_t allocated2;
+-  je_mallctl("stats.active", &allocated2, &sz1, NULL, 0);
++  je_mallctl("stats.active", (void *)&allocated2, &sz1, NULL, 0);
+   size_t leaked = allocated2 - allocated1;
+   printf("\nDone. Leaked: %zd bytes\n", leaked);
+   bool failed = leaked > 65536; // in case C++ runtime allocated something (e.g. iostream locale or facet)
+   printf("\nTest %s!\n", (failed ? "FAILED" : "successful"));
+   printf("\nPress Enter to continue...\n");
+   getchar();
+   return failed ? 1 : 0;
+ }
+diff --git a/memory/jemalloc/src/src/arena.c b/memory/jemalloc/src/src/arena.c
+--- a/memory/jemalloc/src/src/arena.c
++++ b/memory/jemalloc/src/src/arena.c
+@@ -33,49 +33,89 @@ unsigned	nhclasses; /* Number of huge si
+ static void	arena_chunk_dalloc(tsdn_t *tsdn, arena_t *arena,
+     arena_chunk_t *chunk);
+ static void	arena_purge_to_limit(tsdn_t *tsdn, arena_t *arena,
+     size_t ndirty_limit);
+ static void	arena_run_dalloc(tsdn_t *tsdn, arena_t *arena, arena_run_t *run,
+     bool dirty, bool cleaned, bool decommitted);
+ static void	arena_dalloc_bin_run(tsdn_t *tsdn, arena_t *arena,
+     arena_chunk_t *chunk, arena_run_t *run, arena_bin_t *bin);
+-static void	arena_bin_lower_run(arena_t *arena, arena_chunk_t *chunk,
+-    arena_run_t *run, arena_bin_t *bin);
++static void	arena_bin_lower_run(arena_t *arena, arena_run_t *run,
++    arena_bin_t *bin);
+ 
+ /******************************************************************************/
+ 
+ JEMALLOC_INLINE_C size_t
+ arena_miscelm_size_get(const arena_chunk_map_misc_t *miscelm)
+ {
+ 	arena_chunk_t *chunk;
+ 	size_t pageind, mapbits;
+ 
+ 	chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(miscelm);
+ 	pageind = arena_miscelm_to_pageind(miscelm);
+ 	mapbits = arena_mapbits_get(chunk, pageind);
+ 	return (arena_mapbits_size_decode(mapbits));
+ }
+ 
++JEMALLOC_INLINE_C const extent_node_t *
++arena_miscelm_extent_get(const arena_chunk_map_misc_t *miscelm)
++{
++	arena_chunk_t *chunk;
++
++	chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(miscelm);
++	return (&chunk->node);
++}
++
+ JEMALLOC_INLINE_C int
+-arena_run_addr_comp(const arena_chunk_map_misc_t *a,
++arena_sn_comp(const arena_chunk_map_misc_t *a, const arena_chunk_map_misc_t *b)
++{
++	size_t a_sn, b_sn;
++
++	assert(a != NULL);
++	assert(b != NULL);
++
++	a_sn = extent_node_sn_get(arena_miscelm_extent_get(a));
++	b_sn = extent_node_sn_get(arena_miscelm_extent_get(b));
++
++	return ((a_sn > b_sn) - (a_sn < b_sn));
++}
++
++JEMALLOC_INLINE_C int
++arena_ad_comp(const arena_chunk_map_misc_t *a,
+     const arena_chunk_map_misc_t *b)
+ {
+ 	uintptr_t a_miscelm = (uintptr_t)a;
+ 	uintptr_t b_miscelm = (uintptr_t)b;
+ 
+ 	assert(a != NULL);
+ 	assert(b != NULL);
+ 
+ 	return ((a_miscelm > b_miscelm) - (a_miscelm < b_miscelm));
+ }
+ 
++JEMALLOC_INLINE_C int
++arena_snad_comp(const arena_chunk_map_misc_t *a,
++    const arena_chunk_map_misc_t *b)
++{
++	int ret;
++
++	assert(a != NULL);
++	assert(b != NULL);
++
++	ret = arena_sn_comp(a, b);
++	if (ret != 0)
++		return (ret);
++
++	ret = arena_ad_comp(a, b);
++	return (ret);
++}
++
+ /* Generate pairing heap functions. */
+ ph_gen(static UNUSED, arena_run_heap_, arena_run_heap_t, arena_chunk_map_misc_t,
+-    ph_link, arena_run_addr_comp)
++    ph_link, arena_snad_comp)
+ 
+ #ifdef JEMALLOC_JET
+ #undef run_quantize_floor
+ #define	run_quantize_floor JEMALLOC_N(n_run_quantize_floor)
+ #endif
+ static size_t
+ run_quantize_floor(size_t size)
+ {
+@@ -524,77 +564,80 @@ arena_chunk_init_spare(arena_t *arena)
+ 	assert(arena_mapbits_dirty_get(chunk, map_bias) ==
+ 	    arena_mapbits_dirty_get(chunk, chunk_npages-1));
+ 
+ 	return (chunk);
+ }
+ 
+ static bool
+ arena_chunk_register(tsdn_t *tsdn, arena_t *arena, arena_chunk_t *chunk,
+-    bool zero)
++    size_t sn, bool zero)
+ {
+ 
+ 	/*
+ 	 * The extent node notion of "committed" doesn't directly apply to
+ 	 * arena chunks.  Arbitrarily mark them as committed.  The commit state
+ 	 * of runs is tracked individually, and upon chunk deallocation the
+ 	 * entire chunk is in a consistent commit state.
+ 	 */
+-	extent_node_init(&chunk->node, arena, chunk, chunksize, zero, true);
++	extent_node_init(&chunk->node, arena, chunk, chunksize, sn, zero, true);
+ 	extent_node_achunk_set(&chunk->node, true);
+ 	return (chunk_register(tsdn, chunk, &chunk->node));
+ }
+ 
+ static arena_chunk_t *
+ arena_chunk_alloc_internal_hard(tsdn_t *tsdn, arena_t *arena,
+     chunk_hooks_t *chunk_hooks, bool *zero, bool *commit)
+ {
+ 	arena_chunk_t *chunk;
++	size_t sn;
+ 
+ 	malloc_mutex_unlock(tsdn, &arena->lock);
+ 
+ 	chunk = (arena_chunk_t *)chunk_alloc_wrapper(tsdn, arena, chunk_hooks,
+-	    NULL, chunksize, chunksize, zero, commit);
++	    NULL, chunksize, chunksize, &sn, zero, commit);
+ 	if (chunk != NULL && !*commit) {
+ 		/* Commit header. */
+ 		if (chunk_hooks->commit(chunk, chunksize, 0, map_bias <<
+ 		    LG_PAGE, arena->ind)) {
+ 			chunk_dalloc_wrapper(tsdn, arena, chunk_hooks,
+-			    (void *)chunk, chunksize, *zero, *commit);
++			    (void *)chunk, chunksize, sn, *zero, *commit);
+ 			chunk = NULL;
+ 		}
+ 	}
+-	if (chunk != NULL && arena_chunk_register(tsdn, arena, chunk, *zero)) {
++	if (chunk != NULL && arena_chunk_register(tsdn, arena, chunk, sn,
++	    *zero)) {
+ 		if (!*commit) {
+ 			/* Undo commit of header. */
+ 			chunk_hooks->decommit(chunk, chunksize, 0, map_bias <<
+ 			    LG_PAGE, arena->ind);
+ 		}
+ 		chunk_dalloc_wrapper(tsdn, arena, chunk_hooks, (void *)chunk,
+-		    chunksize, *zero, *commit);
++		    chunksize, sn, *zero, *commit);
+ 		chunk = NULL;
+ 	}
+ 
+ 	malloc_mutex_lock(tsdn, &arena->lock);
+ 	return (chunk);
+ }
+ 
+ static arena_chunk_t *
+ arena_chunk_alloc_internal(tsdn_t *tsdn, arena_t *arena, bool *zero,
+     bool *commit)
+ {
+ 	arena_chunk_t *chunk;
+ 	chunk_hooks_t chunk_hooks = CHUNK_HOOKS_INITIALIZER;
++	size_t sn;
+ 
+ 	chunk = chunk_alloc_cache(tsdn, arena, &chunk_hooks, NULL, chunksize,
+-	    chunksize, zero, commit, true);
++	    chunksize, &sn, zero, commit, true);
+ 	if (chunk != NULL) {
+-		if (arena_chunk_register(tsdn, arena, chunk, *zero)) {
++		if (arena_chunk_register(tsdn, arena, chunk, sn, *zero)) {
+ 			chunk_dalloc_cache(tsdn, arena, &chunk_hooks, chunk,
+-			    chunksize, true);
++			    chunksize, sn, true);
+ 			return (NULL);
+ 		}
+ 	}
+ 	if (chunk == NULL) {
+ 		chunk = arena_chunk_alloc_internal_hard(tsdn, arena,
+ 		    &chunk_hooks, zero, commit);
+ 	}
+ 
+@@ -616,16 +659,18 @@ arena_chunk_init_hard(tsdn_t *tsdn, aren
+ 	assert(arena->spare == NULL);
+ 
+ 	zero = false;
+ 	commit = false;
+ 	chunk = arena_chunk_alloc_internal(tsdn, arena, &zero, &commit);
+ 	if (chunk == NULL)
+ 		return (NULL);
+ 
++	chunk->hugepage = true;
++
+ 	/*
+ 	 * Initialize the map to contain one maximal free untouched run.  Mark
+ 	 * the pages as zeroed if arena_chunk_alloc_internal() returned a zeroed
+ 	 * or decommitted chunk.
+ 	 */
+ 	flag_unzeroed = (zero || !commit) ? 0 : CHUNK_MAP_UNZEROED;
+ 	flag_decommitted = commit ? 0 : CHUNK_MAP_DECOMMITTED;
+ 	arena_mapbits_unallocated_set(chunk, map_bias, arena_maxrun,
+@@ -679,36 +724,47 @@ arena_chunk_alloc(tsdn_t *tsdn, arena_t 
+ 	arena_avail_insert(arena, chunk, map_bias, chunk_npages-map_bias);
+ 
+ 	return (chunk);
+ }
+ 
+ static void
+ arena_chunk_discard(tsdn_t *tsdn, arena_t *arena, arena_chunk_t *chunk)
+ {
++	size_t sn, hugepage;
+ 	bool committed;
+ 	chunk_hooks_t chunk_hooks = CHUNK_HOOKS_INITIALIZER;
+ 
+ 	chunk_deregister(chunk, &chunk->node);
+ 
++	sn = extent_node_sn_get(&chunk->node);
++	hugepage = chunk->hugepage;
+ 	committed = (arena_mapbits_decommitted_get(chunk, map_bias) == 0);
+ 	if (!committed) {
+ 		/*
+ 		 * Decommit the header.  Mark the chunk as decommitted even if
+ 		 * header decommit fails, since treating a partially committed
+ 		 * chunk as committed has a high potential for causing later
+ 		 * access of decommitted memory.
+ 		 */
+ 		chunk_hooks = chunk_hooks_get(tsdn, arena);
+ 		chunk_hooks.decommit(chunk, chunksize, 0, map_bias << LG_PAGE,
+ 		    arena->ind);
+ 	}
++	if (!hugepage) {
++		/*
++		 * Convert chunk back to the default state, so that all
++		 * subsequent chunk allocations start out with chunks that can
++		 * be backed by transparent huge pages.
++		 */
++		pages_huge(chunk, chunksize);
++	}
+ 
+ 	chunk_dalloc_cache(tsdn, arena, &chunk_hooks, (void *)chunk, chunksize,
+-	    committed);
++	    sn, committed);
+ 
+ 	if (config_stats) {
+ 		arena->stats.mapped -= chunksize;
+ 		arena->stats.metadata_mapped -= (map_bias << LG_PAGE);
+ 	}
+ }
+ 
+ static void
+@@ -854,82 +910,83 @@ arena_node_dalloc(tsdn_t *tsdn, arena_t 
+ 	malloc_mutex_lock(tsdn, &arena->node_cache_mtx);
+ 	ql_elm_new(node, ql_link);
+ 	ql_tail_insert(&arena->node_cache, node, ql_link);
+ 	malloc_mutex_unlock(tsdn, &arena->node_cache_mtx);
+ }
+ 
+ static void *
+ arena_chunk_alloc_huge_hard(tsdn_t *tsdn, arena_t *arena,
+-    chunk_hooks_t *chunk_hooks, size_t usize, size_t alignment, bool *zero,
+-    size_t csize)
++    chunk_hooks_t *chunk_hooks, size_t usize, size_t alignment, size_t *sn,
++    bool *zero, size_t csize)
+ {
+ 	void *ret;
+ 	bool commit = true;
+ 
+ 	ret = chunk_alloc_wrapper(tsdn, arena, chunk_hooks, NULL, csize,
+-	    alignment, zero, &commit);
++	    alignment, sn, zero, &commit);
+ 	if (ret == NULL) {
+ 		/* Revert optimistic stats updates. */
+ 		malloc_mutex_lock(tsdn, &arena->lock);
+ 		if (config_stats) {
+ 			arena_huge_malloc_stats_update_undo(arena, usize);
+ 			arena->stats.mapped -= usize;
+ 		}
+ 		arena_nactive_sub(arena, usize >> LG_PAGE);
+ 		malloc_mutex_unlock(tsdn, &arena->lock);
+ 	}
+ 
+ 	return (ret);
+ }
+ 
+ void *
+ arena_chunk_alloc_huge(tsdn_t *tsdn, arena_t *arena, size_t usize,
+-    size_t alignment, bool *zero)
++    size_t alignment, size_t *sn, bool *zero)
+ {
+ 	void *ret;
+ 	chunk_hooks_t chunk_hooks = CHUNK_HOOKS_INITIALIZER;
+ 	size_t csize = CHUNK_CEILING(usize);
+ 	bool commit = true;
+ 
+ 	malloc_mutex_lock(tsdn, &arena->lock);
+ 
+ 	/* Optimistically update stats. */
+ 	if (config_stats) {
+ 		arena_huge_malloc_stats_update(arena, usize);
+ 		arena->stats.mapped += usize;
+ 	}
+ 	arena_nactive_add(arena, usize >> LG_PAGE);
+ 
+ 	ret = chunk_alloc_cache(tsdn, arena, &chunk_hooks, NULL, csize,
+-	    alignment, zero, &commit, true);
++	    alignment, sn, zero, &commit, true);
+ 	malloc_mutex_unlock(tsdn, &arena->lock);
+ 	if (ret == NULL) {
+ 		ret = arena_chunk_alloc_huge_hard(tsdn, arena, &chunk_hooks,
+-		    usize, alignment, zero, csize);
++		    usize, alignment, sn, zero, csize);
+ 	}
+ 
+ 	return (ret);
+ }
+ 
+ void
+-arena_chunk_dalloc_huge(tsdn_t *tsdn, arena_t *arena, void *chunk, size_t usize)
++arena_chunk_dalloc_huge(tsdn_t *tsdn, arena_t *arena, void *chunk, size_t usize,
++    size_t sn)
+ {
+ 	chunk_hooks_t chunk_hooks = CHUNK_HOOKS_INITIALIZER;
+ 	size_t csize;
+ 
+ 	csize = CHUNK_CEILING(usize);
+ 	malloc_mutex_lock(tsdn, &arena->lock);
+ 	if (config_stats) {
+ 		arena_huge_dalloc_stats_update(arena, usize);
+ 		arena->stats.mapped -= usize;
+ 	}
+ 	arena_nactive_sub(arena, usize >> LG_PAGE);
+ 
+-	chunk_dalloc_cache(tsdn, arena, &chunk_hooks, chunk, csize, true);
++	chunk_dalloc_cache(tsdn, arena, &chunk_hooks, chunk, csize, sn, true);
+ 	malloc_mutex_unlock(tsdn, &arena->lock);
+ }
+ 
+ void
+ arena_chunk_ralloc_huge_similar(tsdn_t *tsdn, arena_t *arena, void *chunk,
+     size_t oldsize, size_t usize)
+ {
+ 
+@@ -943,17 +1000,17 @@ arena_chunk_ralloc_huge_similar(tsdn_t *
+ 		arena_nactive_add(arena, (usize - oldsize) >> LG_PAGE);
+ 	else
+ 		arena_nactive_sub(arena, (oldsize - usize) >> LG_PAGE);
+ 	malloc_mutex_unlock(tsdn, &arena->lock);
+ }
+ 
+ void
+ arena_chunk_ralloc_huge_shrink(tsdn_t *tsdn, arena_t *arena, void *chunk,
+-    size_t oldsize, size_t usize)
++    size_t oldsize, size_t usize, size_t sn)
+ {
+ 	size_t udiff = oldsize - usize;
+ 	size_t cdiff = CHUNK_CEILING(oldsize) - CHUNK_CEILING(usize);
+ 
+ 	malloc_mutex_lock(tsdn, &arena->lock);
+ 	if (config_stats) {
+ 		arena_huge_ralloc_stats_update(arena, oldsize, usize);
+ 		if (cdiff != 0)
+@@ -962,81 +1019,82 @@ arena_chunk_ralloc_huge_shrink(tsdn_t *t
+ 	arena_nactive_sub(arena, udiff >> LG_PAGE);
+ 
+ 	if (cdiff != 0) {
+ 		chunk_hooks_t chunk_hooks = CHUNK_HOOKS_INITIALIZER;
+ 		void *nchunk = (void *)((uintptr_t)chunk +
+ 		    CHUNK_CEILING(usize));
+ 
+ 		chunk_dalloc_cache(tsdn, arena, &chunk_hooks, nchunk, cdiff,
+-		    true);
++		    sn, true);
+ 	}
+ 	malloc_mutex_unlock(tsdn, &arena->lock);
+ }
+ 
+ static bool
+ arena_chunk_ralloc_huge_expand_hard(tsdn_t *tsdn, arena_t *arena,
+     chunk_hooks_t *chunk_hooks, void *chunk, size_t oldsize, size_t usize,
+-    bool *zero, void *nchunk, size_t udiff, size_t cdiff)
++    size_t *sn, bool *zero, void *nchunk, size_t udiff, size_t cdiff)
+ {
+ 	bool err;
+ 	bool commit = true;
+ 
+ 	err = (chunk_alloc_wrapper(tsdn, arena, chunk_hooks, nchunk, cdiff,
+-	    chunksize, zero, &commit) == NULL);
++	    chunksize, sn, zero, &commit) == NULL);
+ 	if (err) {
+ 		/* Revert optimistic stats updates. */
+ 		malloc_mutex_lock(tsdn, &arena->lock);
+ 		if (config_stats) {
+ 			arena_huge_ralloc_stats_update_undo(arena, oldsize,
+ 			    usize);
+ 			arena->stats.mapped -= cdiff;
+ 		}
+ 		arena_nactive_sub(arena, udiff >> LG_PAGE);
+ 		malloc_mutex_unlock(tsdn, &arena->lock);
+ 	} else if (chunk_hooks->merge(chunk, CHUNK_CEILING(oldsize), nchunk,
+ 	    cdiff, true, arena->ind)) {
+ 		chunk_dalloc_wrapper(tsdn, arena, chunk_hooks, nchunk, cdiff,
+-		    *zero, true);
++		    *sn, *zero, true);
+ 		err = true;
+ 	}
+ 	return (err);
+ }
+ 
+ bool
+ arena_chunk_ralloc_huge_expand(tsdn_t *tsdn, arena_t *arena, void *chunk,
+     size_t oldsize, size_t usize, bool *zero)
+ {
+ 	bool err;
+ 	chunk_hooks_t chunk_hooks = chunk_hooks_get(tsdn, arena);
+ 	void *nchunk = (void *)((uintptr_t)chunk + CHUNK_CEILING(oldsize));
+ 	size_t udiff = usize - oldsize;
+ 	size_t cdiff = CHUNK_CEILING(usize) - CHUNK_CEILING(oldsize);
++	size_t sn;
+ 	bool commit = true;
+ 
+ 	malloc_mutex_lock(tsdn, &arena->lock);
+ 
+ 	/* Optimistically update stats. */
+ 	if (config_stats) {
+ 		arena_huge_ralloc_stats_update(arena, oldsize, usize);
+ 		arena->stats.mapped += cdiff;
+ 	}
+ 	arena_nactive_add(arena, udiff >> LG_PAGE);
+ 
+ 	err = (chunk_alloc_cache(tsdn, arena, &chunk_hooks, nchunk, cdiff,
+-	    chunksize, zero, &commit, true) == NULL);
++	    chunksize, &sn, zero, &commit, true) == NULL);
+ 	malloc_mutex_unlock(tsdn, &arena->lock);
+ 	if (err) {
+ 		err = arena_chunk_ralloc_huge_expand_hard(tsdn, arena,
+-		    &chunk_hooks, chunk, oldsize, usize, zero, nchunk, udiff,
+-		    cdiff);
++		    &chunk_hooks, chunk, oldsize, usize, &sn, zero, nchunk,
++		    udiff, cdiff);
+ 	} else if (chunk_hooks.merge(chunk, CHUNK_CEILING(oldsize), nchunk,
+ 	    cdiff, true, arena->ind)) {
+ 		chunk_dalloc_wrapper(tsdn, arena, &chunk_hooks, nchunk, cdiff,
+-		    *zero, true);
++		    sn, *zero, true);
+ 		err = true;
+ 	}
+ 
+ 	return (err);
+ }
+ 
+ /*
+  * Do first-best-fit run selection, i.e. select the lowest run that best fits.
+@@ -1514,16 +1572,17 @@ arena_stash_dirty(tsdn_t *tsdn, arena_t 
+ 	for (rdelm = qr_next(&arena->runs_dirty, rd_link),
+ 	    chunkselm = qr_next(&arena->chunks_cache, cc_link);
+ 	    rdelm != &arena->runs_dirty; rdelm = rdelm_next) {
+ 		size_t npages;
+ 		rdelm_next = qr_next(rdelm, rd_link);
+ 
+ 		if (rdelm == &chunkselm->rd) {
+ 			extent_node_t *chunkselm_next;
++			size_t sn;
+ 			bool zero, commit;
+ 			UNUSED void *chunk;
+ 
+ 			npages = extent_node_size_get(chunkselm) >> LG_PAGE;
+ 			if (opt_purge == purge_mode_decay && arena->ndirty -
+ 			    (nstashed + npages) < ndirty_limit)
+ 				break;
+ 
+@@ -1531,18 +1590,18 @@ arena_stash_dirty(tsdn_t *tsdn, arena_t 
+ 			/*
+ 			 * Allocate.  chunkselm remains valid due to the
+ 			 * dalloc_node=false argument to chunk_alloc_cache().
+ 			 */
+ 			zero = false;
+ 			commit = false;
+ 			chunk = chunk_alloc_cache(tsdn, arena, chunk_hooks,
+ 			    extent_node_addr_get(chunkselm),
+-			    extent_node_size_get(chunkselm), chunksize, &zero,
+-			    &commit, false);
++			    extent_node_size_get(chunkselm), chunksize, &sn,
++			    &zero, &commit, false);
+ 			assert(chunk == extent_node_addr_get(chunkselm));
+ 			assert(zero == extent_node_zeroed_get(chunkselm));
+ 			extent_node_dirty_insert(chunkselm, purge_runs_sentinel,
+ 			    purge_chunks_sentinel);
+ 			assert(npages == (extent_node_size_get(chunkselm) >>
+ 			    LG_PAGE));
+ 			chunkselm = chunkselm_next;
+ 		} else {
+@@ -1629,16 +1688,27 @@ arena_purge_stashed(tsdn_t *tsdn, arena_
+ 			arena_chunk_t *chunk =
+ 			    (arena_chunk_t *)CHUNK_ADDR2BASE(rdelm);
+ 			arena_chunk_map_misc_t *miscelm =
+ 			    arena_rd_to_miscelm(rdelm);
+ 			pageind = arena_miscelm_to_pageind(miscelm);
+ 			run_size = arena_mapbits_large_size_get(chunk, pageind);
+ 			npages = run_size >> LG_PAGE;
+ 
++			/*
++			 * If this is the first run purged within chunk, mark
++			 * the chunk as non-huge.  This will prevent all use of
++			 * transparent huge pages for this chunk until the chunk
++			 * as a whole is deallocated.
++			 */
++			if (chunk->hugepage) {
++				pages_nohuge(chunk, chunksize);
++				chunk->hugepage = false;
++			}
++
+ 			assert(pageind + npages <= chunk_npages);
+ 			assert(!arena_mapbits_decommitted_get(chunk, pageind));
+ 			assert(!arena_mapbits_decommitted_get(chunk,
+ 			    pageind+npages-1));
+ 			decommitted = !chunk_hooks->decommit(chunk, chunksize,
+ 			    pageind << LG_PAGE, npages << LG_PAGE, arena->ind);
+ 			if (decommitted) {
+ 				flag_unzeroed = 0;
+@@ -1698,23 +1768,24 @@ arena_unstash_purged(tsdn_t *tsdn, arena
+ 	    chunkselm = qr_next(purge_chunks_sentinel, cc_link);
+ 	    rdelm != purge_runs_sentinel; rdelm = rdelm_next) {
+ 		rdelm_next = qr_next(rdelm, rd_link);
+ 		if (rdelm == &chunkselm->rd) {
+ 			extent_node_t *chunkselm_next = qr_next(chunkselm,
+ 			    cc_link);
+ 			void *addr = extent_node_addr_get(chunkselm);
+ 			size_t size = extent_node_size_get(chunkselm);
++			size_t sn = extent_node_sn_get(chunkselm);
+ 			bool zeroed = extent_node_zeroed_get(chunkselm);
+ 			bool committed = extent_node_committed_get(chunkselm);
+ 			extent_node_dirty_remove(chunkselm);
+ 			arena_node_dalloc(tsdn, arena, chunkselm);
+ 			chunkselm = chunkselm_next;
+ 			chunk_dalloc_wrapper(tsdn, arena, chunk_hooks, addr,
+-			    size, zeroed, committed);
++			    size, sn, zeroed, committed);
+ 		} else {
+ 			arena_chunk_t *chunk =
+ 			    (arena_chunk_t *)CHUNK_ADDR2BASE(rdelm);
+ 			arena_chunk_map_misc_t *miscelm =
+ 			    arena_rd_to_miscelm(rdelm);
+ 			size_t pageind = arena_miscelm_to_pageind(miscelm);
+ 			bool decommitted = (arena_mapbits_decommitted_get(chunk,
+ 			    pageind) != 0);
+@@ -2310,17 +2381,17 @@ arena_bin_malloc_hard(tsdn_t *tsdn, aren
+ 			 * arena_bin_lower_run() must be called, as if a region
+ 			 * were just deallocated from the run.
+ 			 */
+ 			chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(run);
+ 			if (run->nfree == bin_info->nregs) {
+ 				arena_dalloc_bin_run(tsdn, arena, chunk, run,
+ 				    bin);
+ 			} else
+-				arena_bin_lower_run(arena, chunk, run, bin);
++				arena_bin_lower_run(arena, run, bin);
+ 		}
+ 		return (ret);
+ 	}
+ 
+ 	if (run == NULL)
+ 		return (NULL);
+ 
+ 	bin->runcur = run;
+@@ -2815,26 +2886,28 @@ arena_dalloc_bin_run(tsdn_t *tsdn, arena
+ 	malloc_mutex_unlock(tsdn, &arena->lock);
+ 	/****************************/
+ 	malloc_mutex_lock(tsdn, &bin->lock);
+ 	if (config_stats)
+ 		bin->stats.curruns--;
+ }
+ 
+ static void
+-arena_bin_lower_run(arena_t *arena, arena_chunk_t *chunk, arena_run_t *run,
+-    arena_bin_t *bin)
++arena_bin_lower_run(arena_t *arena, arena_run_t *run, arena_bin_t *bin)
+ {
+ 
+ 	/*
+-	 * Make sure that if bin->runcur is non-NULL, it refers to the lowest
+-	 * non-full run.  It is okay to NULL runcur out rather than proactively
+-	 * keeping it pointing at the lowest non-full run.
++	 * Make sure that if bin->runcur is non-NULL, it refers to the
++	 * oldest/lowest non-full run.  It is okay to NULL runcur out rather
++	 * than proactively keeping it pointing at the oldest/lowest non-full
++	 * run.
+ 	 */
+-	if ((uintptr_t)run < (uintptr_t)bin->runcur) {
++	if (bin->runcur != NULL &&
++	    arena_snad_comp(arena_run_to_miscelm(bin->runcur),
++	    arena_run_to_miscelm(run)) > 0) {
+ 		/* Switch runcur. */
+ 		if (bin->runcur->nfree > 0)
+ 			arena_bin_runs_insert(bin, bin->runcur);
+ 		bin->runcur = run;
+ 		if (config_stats)
+ 			bin->stats.reruns++;
+ 	} else
+ 		arena_bin_runs_insert(bin, run);
+@@ -2860,17 +2933,17 @@ arena_dalloc_bin_locked_impl(tsdn_t *tsd
+ 	if (!junked && config_fill && unlikely(opt_junk_free))
+ 		arena_dalloc_junk_small(ptr, bin_info);
+ 
+ 	arena_run_reg_dalloc(run, ptr);
+ 	if (run->nfree == bin_info->nregs) {
+ 		arena_dissociate_bin_run(chunk, run, bin);
+ 		arena_dalloc_bin_run(tsdn, arena, chunk, run, bin);
+ 	} else if (run->nfree == 1 && run != bin->runcur)
+-		arena_bin_lower_run(arena, chunk, run, bin);
++		arena_bin_lower_run(arena, run, bin);
+ 
+ 	if (config_stats) {
+ 		bin->stats.ndalloc++;
+ 		bin->stats.curregs--;
+ 	}
+ }
+ 
+ void
+@@ -3447,16 +3520,23 @@ arena_nthreads_inc(arena_t *arena, bool 
+ 
+ void
+ arena_nthreads_dec(arena_t *arena, bool internal)
+ {
+ 
+ 	atomic_sub_u(&arena->nthreads[internal], 1);
+ }
+ 
++size_t
++arena_extent_sn_next(arena_t *arena)
++{
++
++	return (atomic_add_z(&arena->extent_sn_next, 1) - 1);
++}
++
+ arena_t *
+ arena_new(tsdn_t *tsdn, unsigned ind)
+ {
+ 	arena_t *arena;
+ 	unsigned i;
+ 
+ 	/*
+ 	 * Allocate arena, arena->lstats, and arena->hstats contiguously, mainly
+@@ -3506,16 +3586,18 @@ arena_new(tsdn_t *tsdn, unsigned ind)
+ 		arena->offset_state = config_debug ? ind :
+ 		    (size_t)(uintptr_t)arena;
+ 	}
+ 
+ 	arena->dss_prec = chunk_dss_prec_get();
+ 
+ 	ql_new(&arena->achunks);
+ 
++	arena->extent_sn_next = 0;
++
+ 	arena->spare = NULL;
+ 
+ 	arena->lg_dirty_mult = arena_lg_dirty_mult_default_get();
+ 	arena->purging = false;
+ 	arena->nactive = 0;
+ 	arena->ndirty = 0;
+ 
+ 	for (i = 0; i < NPSIZES; i++)
+@@ -3527,19 +3609,19 @@ arena_new(tsdn_t *tsdn, unsigned ind)
+ 	if (opt_purge == purge_mode_decay)
+ 		arena_decay_init(arena, arena_decay_time_default_get());
+ 
+ 	ql_new(&arena->huge);
+ 	if (malloc_mutex_init(&arena->huge_mtx, "arena_huge",
+ 	    WITNESS_RANK_ARENA_HUGE))
+ 		return (NULL);
+ 
+-	extent_tree_szad_new(&arena->chunks_szad_cached);
++	extent_tree_szsnad_new(&arena->chunks_szsnad_cached);
+ 	extent_tree_ad_new(&arena->chunks_ad_cached);
+-	extent_tree_szad_new(&arena->chunks_szad_retained);
++	extent_tree_szsnad_new(&arena->chunks_szsnad_retained);
+ 	extent_tree_ad_new(&arena->chunks_ad_retained);
+ 	if (malloc_mutex_init(&arena->chunks_mtx, "arena_chunks",
+ 	    WITNESS_RANK_ARENA_CHUNKS))
+ 		return (NULL);
+ 	ql_new(&arena->node_cache);
+ 	if (malloc_mutex_init(&arena->node_cache_mtx, "arena_node_cache",
+ 	    WITNESS_RANK_ARENA_NODE_CACHE))
+ 		return (NULL);
+diff --git a/memory/jemalloc/src/src/base.c b/memory/jemalloc/src/src/base.c
+--- a/memory/jemalloc/src/src/base.c
++++ b/memory/jemalloc/src/src/base.c
+@@ -1,16 +1,17 @@
+ #define	JEMALLOC_BASE_C_
+ #include "jemalloc/internal/jemalloc_internal.h"
+ 
+ /******************************************************************************/
+ /* Data. */
+ 
+ static malloc_mutex_t	base_mtx;
+-static extent_tree_t	base_avail_szad;
++static size_t		base_extent_sn_next;
++static extent_tree_t	base_avail_szsnad;
+ static extent_node_t	*base_nodes;
+ static size_t		base_allocated;
+ static size_t		base_resident;
+ static size_t		base_mapped;
+ 
+ /******************************************************************************/
+ 
+ static extent_node_t *
+@@ -34,16 +35,24 @@ base_node_dalloc(tsdn_t *tsdn, extent_no
+ 
+ 	malloc_mutex_assert_owner(tsdn, &base_mtx);
+ 
+ 	JEMALLOC_VALGRIND_MAKE_MEM_UNDEFINED(node, sizeof(extent_node_t));
+ 	*(extent_node_t **)node = base_nodes;
+ 	base_nodes = node;
+ }
+ 
++static void
++base_extent_node_init(extent_node_t *node, void *addr, size_t size)
++{
++	size_t sn = atomic_add_z(&base_extent_sn_next, 1) - 1;
++
++	extent_node_init(node, NULL, addr, size, sn, true, true);
++}
++
+ static extent_node_t *
+ base_chunk_alloc(tsdn_t *tsdn, size_t minsize)
+ {
+ 	extent_node_t *node;
+ 	size_t csize, nsize;
+ 	void *addr;
+ 
+ 	malloc_mutex_assert_owner(tsdn, &base_mtx);
+@@ -63,17 +72,17 @@ base_chunk_alloc(tsdn_t *tsdn, size_t mi
+ 		node = (extent_node_t *)addr;
+ 		addr = (void *)((uintptr_t)addr + nsize);
+ 		csize -= nsize;
+ 		if (config_stats) {
+ 			base_allocated += nsize;
+ 			base_resident += PAGE_CEILING(nsize);
+ 		}
+ 	}
+-	extent_node_init(node, NULL, addr, csize, true, true);
++	base_extent_node_init(node, addr, csize);
+ 	return (node);
+ }
+ 
+ /*
+  * base_alloc() guarantees demand-zeroed memory, in order to make multi-page
+  * sparse data structures such as radix tree nodes efficient with respect to
+  * physical memory usage.
+  */
+@@ -87,36 +96,36 @@ base_alloc(tsdn_t *tsdn, size_t size)
+ 
+ 	/*
+ 	 * Round size up to nearest multiple of the cacheline size, so that
+ 	 * there is no chance of false cache line sharing.
+ 	 */
+ 	csize = CACHELINE_CEILING(size);
+ 
+ 	usize = s2u(csize);
+-	extent_node_init(&key, NULL, NULL, usize, false, false);
++	extent_node_init(&key, NULL, NULL, usize, 0, false, false);
+ 	malloc_mutex_lock(tsdn, &base_mtx);
+-	node = extent_tree_szad_nsearch(&base_avail_szad, &key);
++	node = extent_tree_szsnad_nsearch(&base_avail_szsnad, &key);
+ 	if (node != NULL) {
+ 		/* Use existing space. */
+-		extent_tree_szad_remove(&base_avail_szad, node);
++		extent_tree_szsnad_remove(&base_avail_szsnad, node);
+ 	} else {
+ 		/* Try to allocate more space. */
+ 		node = base_chunk_alloc(tsdn, csize);
+ 	}
+ 	if (node == NULL) {
+ 		ret = NULL;
+ 		goto label_return;
+ 	}
+ 
+ 	ret = extent_node_addr_get(node);
+ 	if (extent_node_size_get(node) > csize) {
+ 		extent_node_addr_set(node, (void *)((uintptr_t)ret + csize));
+ 		extent_node_size_set(node, extent_node_size_get(node) - csize);
+-		extent_tree_szad_insert(&base_avail_szad, node);
++		extent_tree_szsnad_insert(&base_avail_szsnad, node);
+ 	} else
+ 		base_node_dalloc(tsdn, node);
+ 	if (config_stats) {
+ 		base_allocated += csize;
+ 		/*
+ 		 * Add one PAGE to base_resident for every page boundary that is
+ 		 * crossed by the new allocation.
+ 		 */
+@@ -144,17 +153,18 @@ base_stats_get(tsdn_t *tsdn, size_t *all
+ }
+ 
+ bool
+ base_boot(void)
+ {
+ 
+ 	if (malloc_mutex_init(&base_mtx, "base", WITNESS_RANK_BASE))
+ 		return (true);
+-	extent_tree_szad_new(&base_avail_szad);
++	base_extent_sn_next = 0;
++	extent_tree_szsnad_new(&base_avail_szsnad);
+ 	base_nodes = NULL;
+ 
+ 	return (false);
+ }
+ 
+ void
+ base_prefork(tsdn_t *tsdn)
+ {
+diff --git a/memory/jemalloc/src/src/chunk.c b/memory/jemalloc/src/src/chunk.c
+--- a/memory/jemalloc/src/src/chunk.c
++++ b/memory/jemalloc/src/src/chunk.c
+@@ -45,19 +45,19 @@ const chunk_hooks_t	chunk_hooks_default 
+ 
+ /******************************************************************************/
+ /*
+  * Function prototypes for static functions that are referenced prior to
+  * definition.
+  */
+ 
+ static void	chunk_record(tsdn_t *tsdn, arena_t *arena,
+-    chunk_hooks_t *chunk_hooks, extent_tree_t *chunks_szad,
+-    extent_tree_t *chunks_ad, bool cache, void *chunk, size_t size, bool zeroed,
+-    bool committed);
++    chunk_hooks_t *chunk_hooks, extent_tree_t *chunks_szsnad,
++    extent_tree_t *chunks_ad, bool cache, void *chunk, size_t size, size_t sn,
++    bool zeroed, bool committed);
+ 
+ /******************************************************************************/
+ 
+ static chunk_hooks_t
+ chunk_hooks_get_locked(arena_t *arena)
+ {
+ 
+ 	return (arena->chunk_hooks);
+@@ -178,135 +178,137 @@ chunk_deregister(const void *chunk, cons
+ 		size_t size = extent_node_size_get(node);
+ 		size_t nsub = (size == 0) ? 1 : size / chunksize;
+ 		assert(atomic_read_z(&curchunks) >= nsub);
+ 		atomic_sub_z(&curchunks, nsub);
+ 	}
+ }
+ 
+ /*
+- * Do first-best-fit chunk selection, i.e. select the lowest chunk that best
+- * fits.
++ * Do first-best-fit chunk selection, i.e. select the oldest/lowest chunk that
++ * best fits.
+  */
+ static extent_node_t *
+-chunk_first_best_fit(arena_t *arena, extent_tree_t *chunks_szad,
+-    extent_tree_t *chunks_ad, size_t size)
++chunk_first_best_fit(arena_t *arena, extent_tree_t *chunks_szsnad, size_t size)
+ {
+ 	extent_node_t key;
+ 
+ 	assert(size == CHUNK_CEILING(size));
+ 
+-	extent_node_init(&key, arena, NULL, size, false, false);
+-	return (extent_tree_szad_nsearch(chunks_szad, &key));
++	extent_node_init(&key, arena, NULL, size, 0, false, false);
++	return (extent_tree_szsnad_nsearch(chunks_szsnad, &key));
+ }
+ 
+ static void *
+ chunk_recycle(tsdn_t *tsdn, arena_t *arena, chunk_hooks_t *chunk_hooks,
+-    extent_tree_t *chunks_szad, extent_tree_t *chunks_ad, bool cache,
+-    void *new_addr, size_t size, size_t alignment, bool *zero, bool *commit,
+-    bool dalloc_node)
++    extent_tree_t *chunks_szsnad, extent_tree_t *chunks_ad, bool cache,
++    void *new_addr, size_t size, size_t alignment, size_t *sn, bool *zero,
++    bool *commit, bool dalloc_node)
+ {
+ 	void *ret;
+ 	extent_node_t *node;
+ 	size_t alloc_size, leadsize, trailsize;
+ 	bool zeroed, committed;
+ 
++	assert(CHUNK_CEILING(size) == size);
++	assert(alignment > 0);
+ 	assert(new_addr == NULL || alignment == chunksize);
++	assert(CHUNK_ADDR2BASE(new_addr) == new_addr);
+ 	/*
+ 	 * Cached chunks use the node linkage embedded in their headers, in
+ 	 * which case dalloc_node is true, and new_addr is non-NULL because
+ 	 * we're operating on a specific chunk.
+ 	 */
+ 	assert(dalloc_node || new_addr != NULL);
+ 
+-	alloc_size = CHUNK_CEILING(s2u(size + alignment - chunksize));
++	alloc_size = size + CHUNK_CEILING(alignment) - chunksize;
+ 	/* Beware size_t wrap-around. */
+ 	if (alloc_size < size)
+ 		return (NULL);
+ 	malloc_mutex_lock(tsdn, &arena->chunks_mtx);
+ 	chunk_hooks_assure_initialized_locked(tsdn, arena, chunk_hooks);
+ 	if (new_addr != NULL) {
+ 		extent_node_t key;
+-		extent_node_init(&key, arena, new_addr, alloc_size, false,
++		extent_node_init(&key, arena, new_addr, alloc_size, 0, false,
+ 		    false);
+ 		node = extent_tree_ad_search(chunks_ad, &key);
+ 	} else {
+-		node = chunk_first_best_fit(arena, chunks_szad, chunks_ad,
+-		    alloc_size);
++		node = chunk_first_best_fit(arena, chunks_szsnad, alloc_size);
+ 	}
+ 	if (node == NULL || (new_addr != NULL && extent_node_size_get(node) <
+ 	    size)) {
+ 		malloc_mutex_unlock(tsdn, &arena->chunks_mtx);
+ 		return (NULL);
+ 	}
+ 	leadsize = ALIGNMENT_CEILING((uintptr_t)extent_node_addr_get(node),
+ 	    alignment) - (uintptr_t)extent_node_addr_get(node);
+ 	assert(new_addr == NULL || leadsize == 0);
+ 	assert(extent_node_size_get(node) >= leadsize + size);
+ 	trailsize = extent_node_size_get(node) - leadsize - size;
+ 	ret = (void *)((uintptr_t)extent_node_addr_get(node) + leadsize);
++	*sn = extent_node_sn_get(node);
+ 	zeroed = extent_node_zeroed_get(node);
+ 	if (zeroed)
+ 		*zero = true;
+ 	committed = extent_node_committed_get(node);
+ 	if (committed)
+ 		*commit = true;
+ 	/* Split the lead. */
+ 	if (leadsize != 0 &&
+ 	    chunk_hooks->split(extent_node_addr_get(node),
+ 	    extent_node_size_get(node), leadsize, size, false, arena->ind)) {
+ 		malloc_mutex_unlock(tsdn, &arena->chunks_mtx);
+ 		return (NULL);
+ 	}
+ 	/* Remove node from the tree. */
+-	extent_tree_szad_remove(chunks_szad, node);
++	extent_tree_szsnad_remove(chunks_szsnad, node);
+ 	extent_tree_ad_remove(chunks_ad, node);
+ 	arena_chunk_cache_maybe_remove(arena, node, cache);
+ 	if (leadsize != 0) {
+ 		/* Insert the leading space as a smaller chunk. */
+ 		extent_node_size_set(node, leadsize);
+-		extent_tree_szad_insert(chunks_szad, node);
++		extent_tree_szsnad_insert(chunks_szsnad, node);
+ 		extent_tree_ad_insert(chunks_ad, node);
+ 		arena_chunk_cache_maybe_insert(arena, node, cache);
+ 		node = NULL;
+ 	}
+ 	if (trailsize != 0) {
+ 		/* Split the trail. */
+ 		if (chunk_hooks->split(ret, size + trailsize, size,
+ 		    trailsize, false, arena->ind)) {
+ 			if (dalloc_node && node != NULL)
+ 				arena_node_dalloc(tsdn, arena, node);
+ 			malloc_mutex_unlock(tsdn, &arena->chunks_mtx);
+-			chunk_record(tsdn, arena, chunk_hooks, chunks_szad,
+-			    chunks_ad, cache, ret, size + trailsize, zeroed,
+-			    committed);
++			chunk_record(tsdn, arena, chunk_hooks, chunks_szsnad,
++			    chunks_ad, cache, ret, size + trailsize, *sn,
++			    zeroed, committed);
+ 			return (NULL);
+ 		}
+ 		/* Insert the trailing space as a smaller chunk. */
+ 		if (node == NULL) {
+ 			node = arena_node_alloc(tsdn, arena);
+ 			if (node == NULL) {
+ 				malloc_mutex_unlock(tsdn, &arena->chunks_mtx);
+ 				chunk_record(tsdn, arena, chunk_hooks,
+-				    chunks_szad, chunks_ad, cache, ret, size +
+-				    trailsize, zeroed, committed);
++				    chunks_szsnad, chunks_ad, cache, ret, size
++				    + trailsize, *sn, zeroed, committed);
+ 				return (NULL);
+ 			}
+ 		}
+ 		extent_node_init(node, arena, (void *)((uintptr_t)(ret) + size),
+-		    trailsize, zeroed, committed);
+-		extent_tree_szad_insert(chunks_szad, node);
++		    trailsize, *sn, zeroed, committed);
++		extent_tree_szsnad_insert(chunks_szsnad, node);
+ 		extent_tree_ad_insert(chunks_ad, node);
+ 		arena_chunk_cache_maybe_insert(arena, node, cache);
+ 		node = NULL;
+ 	}
+ 	if (!committed && chunk_hooks->commit(ret, size, 0, size, arena->ind)) {
+ 		malloc_mutex_unlock(tsdn, &arena->chunks_mtx);
+-		chunk_record(tsdn, arena, chunk_hooks, chunks_szad, chunks_ad,
+-		    cache, ret, size, zeroed, committed);
++		chunk_record(tsdn, arena, chunk_hooks, chunks_szsnad, chunks_ad,
++		    cache, ret, size, *sn, zeroed, committed);
+ 		return (NULL);
+ 	}
+ 	malloc_mutex_unlock(tsdn, &arena->chunks_mtx);
+ 
+ 	assert(dalloc_node || node != NULL);
+ 	if (dalloc_node && node != NULL)
+ 		arena_node_dalloc(tsdn, arena, node);
+ 	if (*zero) {
+@@ -380,29 +382,29 @@ chunk_alloc_base(size_t size)
+ 	if (config_valgrind)
+ 		JEMALLOC_VALGRIND_MAKE_MEM_UNDEFINED(ret, size);
+ 
+ 	return (ret);
+ }
+ 
+ void *
+ chunk_alloc_cache(tsdn_t *tsdn, arena_t *arena, chunk_hooks_t *chunk_hooks,
+-    void *new_addr, size_t size, size_t alignment, bool *zero, bool *commit,
+-    bool dalloc_node)
++    void *new_addr, size_t size, size_t alignment, size_t *sn, bool *zero,
++    bool *commit, bool dalloc_node)
+ {
+ 	void *ret;
+ 
+ 	assert(size != 0);
+ 	assert((size & chunksize_mask) == 0);
+ 	assert(alignment != 0);
+ 	assert((alignment & chunksize_mask) == 0);
+ 
+ 	ret = chunk_recycle(tsdn, arena, chunk_hooks,
+-	    &arena->chunks_szad_cached, &arena->chunks_ad_cached, true,
+-	    new_addr, size, alignment, zero, commit, dalloc_node);
++	    &arena->chunks_szsnad_cached, &arena->chunks_ad_cached, true,
++	    new_addr, size, alignment, sn, zero, commit, dalloc_node);
+ 	if (ret == NULL)
+ 		return (NULL);
+ 	if (config_valgrind)
+ 		JEMALLOC_VALGRIND_MAKE_MEM_UNDEFINED(ret, size);
+ 	return (ret);
+ }
+ 
+ static arena_t *
+@@ -446,102 +448,108 @@ chunk_alloc_default(void *new_addr, size
+ 	arena = chunk_arena_get(tsdn, arena_ind);
+ 
+ 	return (chunk_alloc_default_impl(tsdn, arena, new_addr, size, alignment,
+ 	    zero, commit));
+ }
+ 
+ static void *
+ chunk_alloc_retained(tsdn_t *tsdn, arena_t *arena, chunk_hooks_t *chunk_hooks,
+-    void *new_addr, size_t size, size_t alignment, bool *zero, bool *commit)
++    void *new_addr, size_t size, size_t alignment, size_t *sn, bool *zero,
++    bool *commit)
+ {
+ 	void *ret;
+ 
+ 	assert(size != 0);
+ 	assert((size & chunksize_mask) == 0);
+ 	assert(alignment != 0);
+ 	assert((alignment & chunksize_mask) == 0);
+ 
+ 	ret = chunk_recycle(tsdn, arena, chunk_hooks,
+-	    &arena->chunks_szad_retained, &arena->chunks_ad_retained, false,
+-	    new_addr, size, alignment, zero, commit, true);
++	    &arena->chunks_szsnad_retained, &arena->chunks_ad_retained, false,
++	    new_addr, size, alignment, sn, zero, commit, true);
+ 
+ 	if (config_stats && ret != NULL)
+ 		arena->stats.retained -= size;
+ 
+ 	return (ret);
+ }
+ 
+ void *
+ chunk_alloc_wrapper(tsdn_t *tsdn, arena_t *arena, chunk_hooks_t *chunk_hooks,
+-    void *new_addr, size_t size, size_t alignment, bool *zero, bool *commit)
++    void *new_addr, size_t size, size_t alignment, size_t *sn, bool *zero,
++    bool *commit)
+ {
+ 	void *ret;
+ 
+ 	chunk_hooks_assure_initialized(tsdn, arena, chunk_hooks);
+ 
+ 	ret = chunk_alloc_retained(tsdn, arena, chunk_hooks, new_addr, size,
+-	    alignment, zero, commit);
++	    alignment, sn, zero, commit);
+ 	if (ret == NULL) {
+ 		if (chunk_hooks->alloc == chunk_alloc_default) {
+ 			/* Call directly to propagate tsdn. */
+ 			ret = chunk_alloc_default_impl(tsdn, arena, new_addr,
+ 			    size, alignment, zero, commit);
+ 		} else {
+ 			ret = chunk_hooks->alloc(new_addr, size, alignment,
+ 			    zero, commit, arena->ind);
+ 		}
+ 
+ 		if (ret == NULL)
+ 			return (NULL);
+ 
++		*sn = arena_extent_sn_next(arena);
++
+ 		if (config_valgrind && chunk_hooks->alloc !=
+ 		    chunk_alloc_default)
+ 			JEMALLOC_VALGRIND_MAKE_MEM_UNDEFINED(ret, chunksize);
+ 	}
+ 
+ 	return (ret);
+ }
+ 
+ static void
+ chunk_record(tsdn_t *tsdn, arena_t *arena, chunk_hooks_t *chunk_hooks,
+-    extent_tree_t *chunks_szad, extent_tree_t *chunks_ad, bool cache,
+-    void *chunk, size_t size, bool zeroed, bool committed)
++    extent_tree_t *chunks_szsnad, extent_tree_t *chunks_ad, bool cache,
++    void *chunk, size_t size, size_t sn, bool zeroed, bool committed)
+ {
+ 	bool unzeroed;
+ 	extent_node_t *node, *prev;
+ 	extent_node_t key;
+ 
+ 	assert(!cache || !zeroed);
+ 	unzeroed = cache || !zeroed;
+ 	JEMALLOC_VALGRIND_MAKE_MEM_NOACCESS(chunk, size);
+ 
+ 	malloc_mutex_lock(tsdn, &arena->chunks_mtx);
+ 	chunk_hooks_assure_initialized_locked(tsdn, arena, chunk_hooks);
+-	extent_node_init(&key, arena, (void *)((uintptr_t)chunk + size), 0,
++	extent_node_init(&key, arena, (void *)((uintptr_t)chunk + size), 0, 0,
+ 	    false, false);
+ 	node = extent_tree_ad_nsearch(chunks_ad, &key);
+ 	/* Try to coalesce forward. */
+ 	if (node != NULL && extent_node_addr_get(node) ==
+ 	    extent_node_addr_get(&key) && extent_node_committed_get(node) ==
+ 	    committed && !chunk_hooks->merge(chunk, size,
+ 	    extent_node_addr_get(node), extent_node_size_get(node), false,
+ 	    arena->ind)) {
+ 		/*
+ 		 * Coalesce chunk with the following address range.  This does
+ 		 * not change the position within chunks_ad, so only
+-		 * remove/insert from/into chunks_szad.
++		 * remove/insert from/into chunks_szsnad.
+ 		 */
+-		extent_tree_szad_remove(chunks_szad, node);
++		extent_tree_szsnad_remove(chunks_szsnad, node);
+ 		arena_chunk_cache_maybe_remove(arena, node, cache);
+ 		extent_node_addr_set(node, chunk);
+ 		extent_node_size_set(node, size + extent_node_size_get(node));
++		if (sn < extent_node_sn_get(node))
++			extent_node_sn_set(node, sn);
+ 		extent_node_zeroed_set(node, extent_node_zeroed_get(node) &&
+ 		    !unzeroed);
+-		extent_tree_szad_insert(chunks_szad, node);
++		extent_tree_szsnad_insert(chunks_szsnad, node);
+ 		arena_chunk_cache_maybe_insert(arena, node, cache);
+ 	} else {
+ 		/* Coalescing forward failed, so insert a new node. */
+ 		node = arena_node_alloc(tsdn, arena);
+ 		if (node == NULL) {
+ 			/*
+ 			 * Node allocation failed, which is an exceedingly
+ 			 * unlikely failure.  Leak chunk after making sure its
+@@ -549,67 +557,70 @@ chunk_record(tsdn_t *tsdn, arena_t *aren
+ 			 * a virtual memory leak.
+ 			 */
+ 			if (cache) {
+ 				chunk_purge_wrapper(tsdn, arena, chunk_hooks,
+ 				    chunk, size, 0, size);
+ 			}
+ 			goto label_return;
+ 		}
+-		extent_node_init(node, arena, chunk, size, !unzeroed,
++		extent_node_init(node, arena, chunk, size, sn, !unzeroed,
+ 		    committed);
+ 		extent_tree_ad_insert(chunks_ad, node);
+-		extent_tree_szad_insert(chunks_szad, node);
++		extent_tree_szsnad_insert(chunks_szsnad, node);
+ 		arena_chunk_cache_maybe_insert(arena, node, cache);
+ 	}
+ 
+ 	/* Try to coalesce backward. */
+ 	prev = extent_tree_ad_prev(chunks_ad, node);
+ 	if (prev != NULL && (void *)((uintptr_t)extent_node_addr_get(prev) +
+ 	    extent_node_size_get(prev)) == chunk &&
+ 	    extent_node_committed_get(prev) == committed &&
+ 	    !chunk_hooks->merge(extent_node_addr_get(prev),
+ 	    extent_node_size_get(prev), chunk, size, false, arena->ind)) {
+ 		/*
+ 		 * Coalesce chunk with the previous address range.  This does
+ 		 * not change the position within chunks_ad, so only
+-		 * remove/insert node from/into chunks_szad.
++		 * remove/insert node from/into chunks_szsnad.
+ 		 */
+-		extent_tree_szad_remove(chunks_szad, prev);
++		extent_tree_szsnad_remove(chunks_szsnad, prev);
+ 		extent_tree_ad_remove(chunks_ad, prev);
+ 		arena_chunk_cache_maybe_remove(arena, prev, cache);
+-		extent_tree_szad_remove(chunks_szad, node);
++		extent_tree_szsnad_remove(chunks_szsnad, node);
+ 		arena_chunk_cache_maybe_remove(arena, node, cache);
+ 		extent_node_addr_set(node, extent_node_addr_get(prev));
+ 		extent_node_size_set(node, extent_node_size_get(prev) +
+ 		    extent_node_size_get(node));
++		if (extent_node_sn_get(prev) < extent_node_sn_get(node))
++			extent_node_sn_set(node, extent_node_sn_get(prev));
+ 		extent_node_zeroed_set(node, extent_node_zeroed_get(prev) &&
+ 		    extent_node_zeroed_get(node));
+-		extent_tree_szad_insert(chunks_szad, node);
++		extent_tree_szsnad_insert(chunks_szsnad, node);
+ 		arena_chunk_cache_maybe_insert(arena, node, cache);
+ 
+ 		arena_node_dalloc(tsdn, arena, prev);
+ 	}
+ 
+ label_return:
+ 	malloc_mutex_unlock(tsdn, &arena->chunks_mtx);
+ }
+ 
+ void
+ chunk_dalloc_cache(tsdn_t *tsdn, arena_t *arena, chunk_hooks_t *chunk_hooks,
+-    void *chunk, size_t size, bool committed)
++    void *chunk, size_t size, size_t sn, bool committed)
+ {
+ 
+ 	assert(chunk != NULL);
+ 	assert(CHUNK_ADDR2BASE(chunk) == chunk);
+ 	assert(size != 0);
+ 	assert((size & chunksize_mask) == 0);
+ 
+-	chunk_record(tsdn, arena, chunk_hooks, &arena->chunks_szad_cached,
+-	    &arena->chunks_ad_cached, true, chunk, size, false, committed);
++	chunk_record(tsdn, arena, chunk_hooks, &arena->chunks_szsnad_cached,
++	    &arena->chunks_ad_cached, true, chunk, size, sn, false,
++	    committed);
+ 	arena_maybe_purge(tsdn, arena);
+ }
+ 
+ static bool
+ chunk_dalloc_default_impl(void *chunk, size_t size)
+ {
+ 
+ 	if (!have_dss || !chunk_in_dss(chunk))
+@@ -622,17 +633,17 @@ chunk_dalloc_default(void *chunk, size_t
+     unsigned arena_ind)
+ {
+ 
+ 	return (chunk_dalloc_default_impl(chunk, size));
+ }
+ 
+ void
+ chunk_dalloc_wrapper(tsdn_t *tsdn, arena_t *arena, chunk_hooks_t *chunk_hooks,
+-    void *chunk, size_t size, bool zeroed, bool committed)
++    void *chunk, size_t size, size_t sn, bool zeroed, bool committed)
+ {
+ 	bool err;
+ 
+ 	assert(chunk != NULL);
+ 	assert(CHUNK_ADDR2BASE(chunk) == chunk);
+ 	assert(size != 0);
+ 	assert((size & chunksize_mask) == 0);
+ 
+@@ -648,18 +659,19 @@ chunk_dalloc_wrapper(tsdn_t *tsdn, arena
+ 		return;
+ 	/* Try to decommit; purge if that fails. */
+ 	if (committed) {
+ 		committed = chunk_hooks->decommit(chunk, size, 0, size,
+ 		    arena->ind);
+ 	}
+ 	zeroed = !committed || !chunk_hooks->purge(chunk, size, 0, size,
+ 	    arena->ind);
+-	chunk_record(tsdn, arena, chunk_hooks, &arena->chunks_szad_retained,
+-	    &arena->chunks_ad_retained, false, chunk, size, zeroed, committed);
++	chunk_record(tsdn, arena, chunk_hooks, &arena->chunks_szsnad_retained,
++	    &arena->chunks_ad_retained, false, chunk, size, sn, zeroed,
++	    committed);
+ 
+ 	if (config_stats)
+ 		arena->stats.retained += size;
+ }
+ 
+ static bool
+ chunk_commit_default(void *chunk, size_t size, size_t offset, size_t length,
+     unsigned arena_ind)
+diff --git a/memory/jemalloc/src/src/chunk_dss.c b/memory/jemalloc/src/src/chunk_dss.c
+--- a/memory/jemalloc/src/src/chunk_dss.c
++++ b/memory/jemalloc/src/src/chunk_dss.c
+@@ -157,17 +157,18 @@ chunk_alloc_dss(tsdn_t *tsdn, arena_t *a
+ 			dss_prev = chunk_dss_sbrk(incr);
+ 			if (dss_prev == max_cur) {
+ 				/* Success. */
+ 				if (cpad_size != 0) {
+ 					chunk_hooks_t chunk_hooks =
+ 					    CHUNK_HOOKS_INITIALIZER;
+ 					chunk_dalloc_wrapper(tsdn, arena,
+ 					    &chunk_hooks, cpad, cpad_size,
+-					    false, true);
++					    arena_extent_sn_next(arena), false,
++					    true);
+ 				}
+ 				if (*zero) {
+ 					JEMALLOC_VALGRIND_MAKE_MEM_UNDEFINED(
+ 					    ret, size);
+ 					memset(ret, 0, size);
+ 				}
+ 				if (!*commit)
+ 					*commit = pages_decommit(ret, size);
+diff --git a/memory/jemalloc/src/src/extent.c b/memory/jemalloc/src/src/extent.c
+--- a/memory/jemalloc/src/src/extent.c
++++ b/memory/jemalloc/src/src/extent.c
+@@ -1,53 +1,77 @@
+ #define	JEMALLOC_EXTENT_C_
+ #include "jemalloc/internal/jemalloc_internal.h"
+ 
+ /******************************************************************************/
+ 
++/*
++ * Round down to the nearest chunk size that can actually be requested during
++ * normal huge allocation.
++ */
+ JEMALLOC_INLINE_C size_t
+ extent_quantize(size_t size)
+ {
++	size_t ret;
++	szind_t ind;
+ 
+-	/*
+-	 * Round down to the nearest chunk size that can actually be requested
+-	 * during normal huge allocation.
+-	 */
+-	return (index2size(size2index(size + 1) - 1));
++	assert(size > 0);
++
++	ind = size2index(size + 1);
++	if (ind == 0) {
++		/* Avoid underflow. */
++		return (index2size(0));
++	}
++	ret = index2size(ind - 1);
++	assert(ret <= size);
++	return (ret);
+ }
+ 
+ JEMALLOC_INLINE_C int
+-extent_szad_comp(const extent_node_t *a, const extent_node_t *b)
++extent_sz_comp(const extent_node_t *a, const extent_node_t *b)
+ {
+-	int ret;
+ 	size_t a_qsize = extent_quantize(extent_node_size_get(a));
+ 	size_t b_qsize = extent_quantize(extent_node_size_get(b));
+ 
+-	/*
+-	 * Compare based on quantized size rather than size, in order to sort
+-	 * equally useful extents only by address.
+-	 */
+-	ret = (a_qsize > b_qsize) - (a_qsize < b_qsize);
+-	if (ret == 0) {
+-		uintptr_t a_addr = (uintptr_t)extent_node_addr_get(a);
+-		uintptr_t b_addr = (uintptr_t)extent_node_addr_get(b);
+-
+-		ret = (a_addr > b_addr) - (a_addr < b_addr);
+-	}
+-
+-	return (ret);
++	return ((a_qsize > b_qsize) - (a_qsize < b_qsize));
+ }
+ 
+-/* Generate red-black tree functions. */
+-rb_gen(, extent_tree_szad_, extent_tree_t, extent_node_t, szad_link,
+-    extent_szad_comp)
++JEMALLOC_INLINE_C int
++extent_sn_comp(const extent_node_t *a, const extent_node_t *b)
++{
++	size_t a_sn = extent_node_sn_get(a);
++	size_t b_sn = extent_node_sn_get(b);
++
++	return ((a_sn > b_sn) - (a_sn < b_sn));
++}
+ 
+ JEMALLOC_INLINE_C int
+ extent_ad_comp(const extent_node_t *a, const extent_node_t *b)
+ {
+ 	uintptr_t a_addr = (uintptr_t)extent_node_addr_get(a);
+ 	uintptr_t b_addr = (uintptr_t)extent_node_addr_get(b);
+ 
+ 	return ((a_addr > b_addr) - (a_addr < b_addr));
+ }
+ 
++JEMALLOC_INLINE_C int
++extent_szsnad_comp(const extent_node_t *a, const extent_node_t *b)
++{
++	int ret;
++
++	ret = extent_sz_comp(a, b);
++	if (ret != 0)
++		return (ret);
++
++	ret = extent_sn_comp(a, b);
++	if (ret != 0)
++		return (ret);
++
++	ret = extent_ad_comp(a, b);
++	return (ret);
++}
++
++/* Generate red-black tree functions. */
++rb_gen(, extent_tree_szsnad_, extent_tree_t, extent_node_t, szsnad_link,
++    extent_szsnad_comp)
++
+ /* Generate red-black tree functions. */
+ rb_gen(, extent_tree_ad_, extent_tree_t, extent_node_t, ad_link, extent_ad_comp)
+diff --git a/memory/jemalloc/src/src/huge.c b/memory/jemalloc/src/src/huge.c
+--- a/memory/jemalloc/src/src/huge.c
++++ b/memory/jemalloc/src/src/huge.c
+@@ -51,51 +51,53 @@ huge_malloc(tsdn_t *tsdn, arena_t *arena
+ void *
+ huge_palloc(tsdn_t *tsdn, arena_t *arena, size_t usize, size_t alignment,
+     bool zero)
+ {
+ 	void *ret;
+ 	size_t ausize;
+ 	arena_t *iarena;
+ 	extent_node_t *node;
++	size_t sn;
+ 	bool is_zeroed;
+ 
+ 	/* Allocate one or more contiguous chunks for this request. */
+ 
+ 	assert(!tsdn_null(tsdn) || arena != NULL);
+ 
+ 	ausize = sa2u(usize, alignment);
+ 	if (unlikely(ausize == 0 || ausize > HUGE_MAXCLASS))
+ 		return (NULL);
+ 	assert(ausize >= chunksize);
+ 
+ 	/* Allocate an extent node with which to track the chunk. */
+-	iarena = (!tsdn_null(tsdn)) ? arena_ichoose(tsdn_tsd(tsdn), NULL) : a0get();
++	iarena = (!tsdn_null(tsdn)) ? arena_ichoose(tsdn_tsd(tsdn), NULL) :
++	    a0get();
+ 	node = ipallocztm(tsdn, CACHELINE_CEILING(sizeof(extent_node_t)),
+ 	    CACHELINE, false, NULL, true, iarena);
+ 	if (node == NULL)
+ 		return (NULL);
+ 
+ 	/*
+ 	 * Copy zero into is_zeroed and pass the copy to chunk_alloc(), so that
+ 	 * it is possible to make correct junk/zero fill decisions below.
+ 	 */
+ 	is_zeroed = zero;
+ 	if (likely(!tsdn_null(tsdn)))
+ 		arena = arena_choose(tsdn_tsd(tsdn), arena);
+ 	if (unlikely(arena == NULL) || (ret = arena_chunk_alloc_huge(tsdn,
+-	    arena, usize, alignment, &is_zeroed)) == NULL) {
++	    arena, usize, alignment, &sn, &is_zeroed)) == NULL) {
+ 		idalloctm(tsdn, node, NULL, true, true);
+ 		return (NULL);
+ 	}
+ 
+-	extent_node_init(node, arena, ret, usize, is_zeroed, true);
++	extent_node_init(node, arena, ret, usize, sn, is_zeroed, true);
+ 
+ 	if (huge_node_set(tsdn, ret, node)) {
+-		arena_chunk_dalloc_huge(tsdn, arena, ret, usize);
++		arena_chunk_dalloc_huge(tsdn, arena, ret, usize, sn);
+ 		idalloctm(tsdn, node, NULL, true, true);
+ 		return (NULL);
+ 	}
+ 
+ 	/* Insert node into huge. */
+ 	malloc_mutex_lock(tsdn, &arena->huge_mtx);
+ 	ql_elm_new(node, ql_link);
+ 	ql_tail_insert(&arena->huge, node, ql_link);
+@@ -240,17 +242,18 @@ huge_ralloc_no_move_shrink(tsdn_t *tsdn,
+ 	huge_node_unset(ptr, node);
+ 	extent_node_size_set(node, usize);
+ 	huge_node_reset(tsdn, ptr, node);
+ 	/* Update zeroed. */
+ 	extent_node_zeroed_set(node, post_zeroed);
+ 	malloc_mutex_unlock(tsdn, &arena->huge_mtx);
+ 
+ 	/* Zap the excess chunks. */
+-	arena_chunk_ralloc_huge_shrink(tsdn, arena, ptr, oldsize, usize);
++	arena_chunk_ralloc_huge_shrink(tsdn, arena, ptr, oldsize, usize,
++	    extent_node_sn_get(node));
+ 
+ 	return (false);
+ }
+ 
+ static bool
+ huge_ralloc_no_move_expand(tsdn_t *tsdn, void *ptr, size_t oldsize,
+     size_t usize, bool zero) {
+ 	extent_node_t *node;
+@@ -402,17 +405,18 @@ huge_dalloc(tsdn_t *tsdn, void *ptr)
+ 	huge_node_unset(ptr, node);
+ 	malloc_mutex_lock(tsdn, &arena->huge_mtx);
+ 	ql_remove(&arena->huge, node, ql_link);
+ 	malloc_mutex_unlock(tsdn, &arena->huge_mtx);
+ 
+ 	huge_dalloc_junk(extent_node_addr_get(node),
+ 	    extent_node_size_get(node));
+ 	arena_chunk_dalloc_huge(tsdn, extent_node_arena_get(node),
+-	    extent_node_addr_get(node), extent_node_size_get(node));
++	    extent_node_addr_get(node), extent_node_size_get(node),
++	    extent_node_sn_get(node));
+ 	idalloctm(tsdn, node, NULL, true, true);
+ 
+ 	arena_decay_tick(tsdn, arena);
+ }
+ 
+ arena_t *
+ huge_aalloc(const void *ptr)
+ {
+diff --git a/memory/jemalloc/src/src/jemalloc.c b/memory/jemalloc/src/src/jemalloc.c
+--- a/memory/jemalloc/src/src/jemalloc.c
++++ b/memory/jemalloc/src/src/jemalloc.c
+@@ -1051,51 +1051,62 @@ malloc_conf_init(void)
+ 				else {					\
+ 					malloc_conf_error(		\
+ 					    "Invalid conf value",	\
+ 					    k, klen, v, vlen);		\
+ 				}					\
+ 				if (cont)				\
+ 					continue;			\
+ 			}
+-#define	CONF_HANDLE_T_U(t, o, n, min, max, clip)			\
++#define	CONF_MIN_no(um, min)	false
++#define	CONF_MIN_yes(um, min)	((um) < (min))
++#define	CONF_MAX_no(um, max)	false
++#define	CONF_MAX_yes(um, max)	((um) > (max))
++#define	CONF_HANDLE_T_U(t, o, n, min, max, check_min, check_max, clip)	\
+ 			if (CONF_MATCH(n)) {				\
+ 				uintmax_t um;				\
+ 				char *end;				\
+ 									\
+ 				set_errno(0);				\
+ 				um = malloc_strtoumax(v, &end, 0);	\
+ 				if (get_errno() != 0 || (uintptr_t)end -\
+ 				    (uintptr_t)v != vlen) {		\
+ 					malloc_conf_error(		\
+ 					    "Invalid conf value",	\
+ 					    k, klen, v, vlen);		\
+ 				} else if (clip) {			\
+-					if ((min) != 0 && um < (min))	\
++					if (CONF_MIN_##check_min(um,	\
++					    (min)))			\
+ 						o = (t)(min);		\
+-					else if (um > (max))		\
++					else if (CONF_MAX_##check_max(	\
++					    um, (max)))			\
+ 						o = (t)(max);		\
+ 					else				\
+ 						o = (t)um;		\
+ 				} else {				\
+-					if (((min) != 0 && um < (min))	\
+-					    || um > (max)) {		\
++					if (CONF_MIN_##check_min(um,	\
++					    (min)) ||			\
++					    CONF_MAX_##check_max(um,	\
++					    (max))) {			\
+ 						malloc_conf_error(	\
+ 						    "Out-of-range "	\
+ 						    "conf value",	\
+ 						    k, klen, v, vlen);	\
+ 					} else				\
+ 						o = (t)um;		\
+ 				}					\
+ 				continue;				\
+ 			}
+-#define	CONF_HANDLE_UNSIGNED(o, n, min, max, clip)			\
+-			CONF_HANDLE_T_U(unsigned, o, n, min, max, clip)
+-#define	CONF_HANDLE_SIZE_T(o, n, min, max, clip)			\
+-			CONF_HANDLE_T_U(size_t, o, n, min, max, clip)
++#define	CONF_HANDLE_UNSIGNED(o, n, min, max, check_min, check_max,	\
++    clip)								\
++			CONF_HANDLE_T_U(unsigned, o, n, min, max,	\
++			    check_min, check_max, clip)
++#define	CONF_HANDLE_SIZE_T(o, n, min, max, check_min, check_max, clip)	\
++			CONF_HANDLE_T_U(size_t, o, n, min, max,		\
++			    check_min, check_max, clip)
+ #define	CONF_HANDLE_SSIZE_T(o, n, min, max)				\
+ 			if (CONF_MATCH(n)) {				\
+ 				long l;					\
+ 				char *end;				\
+ 									\
+ 				set_errno(0);				\
+ 				l = strtol(v, &end, 0);			\
+ 				if (get_errno() != 0 || (uintptr_t)end -\
+@@ -1128,17 +1139,17 @@ malloc_conf_init(void)
+ 			 * as many as 2^(LG_SIZE_CLASS_GROUP+1) data pages, and
+ 			 * possibly an additional page in the presence of
+ 			 * redzones.  In order to simplify options processing,
+ 			 * use a conservative bound that accommodates all these
+ 			 * constraints.
+ 			 */
+ 			CONF_HANDLE_SIZE_T(opt_lg_chunk, "lg_chunk", LG_PAGE +
+ 			    LG_SIZE_CLASS_GROUP + (config_fill ? 2 : 1),
+-			    (sizeof(size_t) << 3) - 1, true)
++			    (sizeof(size_t) << 3) - 1, yes, yes, true)
+ 			if (strncmp("dss", k, klen) == 0) {
+ 				int i;
+ 				bool match = false;
+ 				for (i = 0; i < dss_prec_limit; i++) {
+ 					if (strncmp(dss_prec_names[i], v, vlen)
+ 					    == 0) {
+ 						if (chunk_dss_prec_set(i)) {
+ 							malloc_conf_error(
+@@ -1154,17 +1165,17 @@ malloc_conf_init(void)
+ 				}
+ 				if (!match) {
+ 					malloc_conf_error("Invalid conf value",
+ 					    k, klen, v, vlen);
+ 				}
+ 				continue;
+ 			}
+ 			CONF_HANDLE_UNSIGNED(opt_narenas, "narenas", 1,
+-			    UINT_MAX, false)
++			    UINT_MAX, yes, no, false)
+ 			if (strncmp("purge", k, klen) == 0) {
+ 				int i;
+ 				bool match = false;
+ 				for (i = 0; i < purge_mode_limit; i++) {
+ 					if (strncmp(purge_mode_names[i], v,
+ 					    vlen) == 0) {
+ 						opt_purge = (purge_mode_t)i;
+ 						match = true;
+@@ -1225,17 +1236,17 @@ malloc_conf_init(void)
+ 					} else {
+ 						malloc_conf_error(
+ 						    "Invalid conf value", k,
+ 						    klen, v, vlen);
+ 					}
+ 					continue;
+ 				}
+ 				CONF_HANDLE_SIZE_T(opt_quarantine, "quarantine",
+-				    0, SIZE_T_MAX, false)
++				    0, SIZE_T_MAX, no, no, false)
+ 				CONF_HANDLE_BOOL(opt_redzone, "redzone", true)
+ 				CONF_HANDLE_BOOL(opt_zero, "zero", true)
+ 			}
+ 			if (config_utrace) {
+ 				CONF_HANDLE_BOOL(opt_utrace, "utrace", true)
+ 			}
+ 			if (config_xmalloc) {
+ 				CONF_HANDLE_BOOL(opt_xmalloc, "xmalloc", true)
+@@ -1262,34 +1273,41 @@ malloc_conf_init(void)
+ 				CONF_HANDLE_BOOL(opt_prof, "prof", true)
+ 				CONF_HANDLE_CHAR_P(opt_prof_prefix,
+ 				    "prof_prefix", "jeprof")
+ 				CONF_HANDLE_BOOL(opt_prof_active, "prof_active",
+ 				    true)
+ 				CONF_HANDLE_BOOL(opt_prof_thread_active_init,
+ 				    "prof_thread_active_init", true)
+ 				CONF_HANDLE_SIZE_T(opt_lg_prof_sample,
+-				    "lg_prof_sample", 0,
+-				    (sizeof(uint64_t) << 3) - 1, true)
++				    "lg_prof_sample", 0, (sizeof(uint64_t) << 3)
++				    - 1, no, yes, true)
+ 				CONF_HANDLE_BOOL(opt_prof_accum, "prof_accum",
+ 				    true)
+ 				CONF_HANDLE_SSIZE_T(opt_lg_prof_interval,
+ 				    "lg_prof_interval", -1,
+ 				    (sizeof(uint64_t) << 3) - 1)
+ 				CONF_HANDLE_BOOL(opt_prof_gdump, "prof_gdump",
+ 				    true)
+ 				CONF_HANDLE_BOOL(opt_prof_final, "prof_final",
+ 				    true)
+ 				CONF_HANDLE_BOOL(opt_prof_leak, "prof_leak",
+ 				    true)
+ 			}
+ 			malloc_conf_error("Invalid conf pair", k, klen, v,
+ 			    vlen);
+ #undef CONF_MATCH
++#undef CONF_MATCH_VALUE
+ #undef CONF_HANDLE_BOOL
++#undef CONF_MIN_no
++#undef CONF_MIN_yes
++#undef CONF_MAX_no
++#undef CONF_MAX_yes
++#undef CONF_HANDLE_T_U
++#undef CONF_HANDLE_UNSIGNED
+ #undef CONF_HANDLE_SIZE_T
+ #undef CONF_HANDLE_SSIZE_T
+ #undef CONF_HANDLE_CHAR_P
+ 		}
+ 	}
+ }
+ 
+ static bool
+@@ -1388,18 +1406,19 @@ malloc_init_hard_a0(void)
+ static bool
+ malloc_init_hard_recursible(void)
+ {
+ 
+ 	malloc_init_state = malloc_init_recursible;
+ 
+ 	ncpus = malloc_ncpus();
+ 
+-#if (!defined(JEMALLOC_MUTEX_INIT_CB) && !defined(JEMALLOC_ZONE) \
+-    && !defined(_WIN32) && !defined(__native_client__))
++#if (defined(JEMALLOC_HAVE_PTHREAD_ATFORK) && !defined(JEMALLOC_MUTEX_INIT_CB) \
++    && !defined(JEMALLOC_ZONE) && !defined(_WIN32) && \
++    !defined(__native_client__))
+ 	/* LinuxThreads' pthread_atfork() allocates. */
+ 	if (pthread_atfork(jemalloc_prefork, jemalloc_postfork_parent,
+ 	    jemalloc_postfork_child) != 0) {
+ 		malloc_write("<jemalloc>: Error in pthread_atfork()\n");
+ 		if (opt_abort)
+ 			abort();
+ 		return (true);
+ 	}
+@@ -1968,18 +1987,18 @@ je_realloc(void *ptr, size_t size)
+ 		tsd_t *tsd;
+ 
+ 		assert(usize == isalloc(tsdn, ret, config_prof));
+ 		tsd = tsdn_tsd(tsdn);
+ 		*tsd_thread_allocatedp_get(tsd) += usize;
+ 		*tsd_thread_deallocatedp_get(tsd) += old_usize;
+ 	}
+ 	UTRACE(ptr, size, ret);
+-	JEMALLOC_VALGRIND_REALLOC(true, tsdn, ret, usize, true, ptr, old_usize,
+-	    old_rzsize, true, false);
++	JEMALLOC_VALGRIND_REALLOC(maybe, tsdn, ret, usize, maybe, ptr,
++	    old_usize, old_rzsize, maybe, false);
+ 	witness_assert_lockless(tsdn);
+ 	return (ret);
+ }
+ 
+ JEMALLOC_EXPORT void JEMALLOC_NOTHROW
+ je_free(void *ptr)
+ {
+ 
+@@ -2395,18 +2414,18 @@ je_rallocx(void *ptr, size_t size, int f
+ 	}
+ 	assert(alignment == 0 || ((uintptr_t)p & (alignment - 1)) == ZU(0));
+ 
+ 	if (config_stats) {
+ 		*tsd_thread_allocatedp_get(tsd) += usize;
+ 		*tsd_thread_deallocatedp_get(tsd) += old_usize;
+ 	}
+ 	UTRACE(ptr, size, p);
+-	JEMALLOC_VALGRIND_REALLOC(true, tsd_tsdn(tsd), p, usize, false, ptr,
+-	    old_usize, old_rzsize, false, zero);
++	JEMALLOC_VALGRIND_REALLOC(maybe, tsd_tsdn(tsd), p, usize, no, ptr,
++	    old_usize, old_rzsize, no, zero);
+ 	witness_assert_lockless(tsd_tsdn(tsd));
+ 	return (p);
+ label_oom:
+ 	if (config_xmalloc && unlikely(opt_xmalloc)) {
+ 		malloc_write("<jemalloc>: Error in rallocx(): out of memory\n");
+ 		abort();
+ 	}
+ 	UTRACE(ptr, size, 0);
+@@ -2538,18 +2557,18 @@ je_xallocx(void *ptr, size_t size, size_
+ 	}
+ 	if (unlikely(usize == old_usize))
+ 		goto label_not_resized;
+ 
+ 	if (config_stats) {
+ 		*tsd_thread_allocatedp_get(tsd) += usize;
+ 		*tsd_thread_deallocatedp_get(tsd) += old_usize;
+ 	}
+-	JEMALLOC_VALGRIND_REALLOC(false, tsd_tsdn(tsd), ptr, usize, false, ptr,
+-	    old_usize, old_rzsize, false, zero);
++	JEMALLOC_VALGRIND_REALLOC(no, tsd_tsdn(tsd), ptr, usize, no, ptr,
++	    old_usize, old_rzsize, no, zero);
+ label_not_resized:
+ 	UTRACE(ptr, size, ptr);
+ 	witness_assert_lockless(tsd_tsdn(tsd));
+ 	return (usize);
+ }
+ 
+ JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW
+ JEMALLOC_ATTR(pure)
+diff --git a/memory/jemalloc/src/src/pages.c b/memory/jemalloc/src/src/pages.c
+--- a/memory/jemalloc/src/src/pages.c
++++ b/memory/jemalloc/src/src/pages.c
+@@ -165,37 +165,66 @@ pages_decommit(void *addr, size_t size)
+ bool
+ pages_purge(void *addr, size_t size)
+ {
+ 	bool unzeroed;
+ 
+ #ifdef _WIN32
+ 	VirtualAlloc(addr, size, MEM_RESET, PAGE_READWRITE);
+ 	unzeroed = true;
+-#elif defined(JEMALLOC_HAVE_MADVISE)
+-#  ifdef JEMALLOC_PURGE_MADVISE_DONTNEED
++#elif (defined(JEMALLOC_PURGE_MADVISE_FREE) || \
++    defined(JEMALLOC_PURGE_MADVISE_DONTNEED))
++#  if defined(JEMALLOC_PURGE_MADVISE_FREE)
++#    define JEMALLOC_MADV_PURGE MADV_FREE
++#    define JEMALLOC_MADV_ZEROS false
++#  elif defined(JEMALLOC_PURGE_MADVISE_DONTNEED)
+ #    define JEMALLOC_MADV_PURGE MADV_DONTNEED
+ #    define JEMALLOC_MADV_ZEROS true
+-#  elif defined(JEMALLOC_PURGE_MADVISE_FREE)
+-#    define JEMALLOC_MADV_PURGE MADV_FREE
+-#    define JEMALLOC_MADV_ZEROS false
+ #  else
+-#    error "No madvise(2) flag defined for purging unused dirty pages."
++#    error No madvise(2) flag defined for purging unused dirty pages
+ #  endif
+ 	int err = madvise(addr, size, JEMALLOC_MADV_PURGE);
+ 	unzeroed = (!JEMALLOC_MADV_ZEROS || err != 0);
+ #  undef JEMALLOC_MADV_PURGE
+ #  undef JEMALLOC_MADV_ZEROS
+ #else
+ 	/* Last resort no-op. */
+ 	unzeroed = true;
+ #endif
+ 	return (unzeroed);
+ }
+ 
++bool
++pages_huge(void *addr, size_t size)
++{
++
++	assert(PAGE_ADDR2BASE(addr) == addr);
++	assert(PAGE_CEILING(size) == size);
++
++#ifdef JEMALLOC_THP
++	return (madvise(addr, size, MADV_HUGEPAGE) != 0);
++#else
++	return (false);
++#endif
++}
++
++bool
++pages_nohuge(void *addr, size_t size)
++{
++
++	assert(PAGE_ADDR2BASE(addr) == addr);
++	assert(PAGE_CEILING(size) == size);
++
++#ifdef JEMALLOC_THP
++	return (madvise(addr, size, MADV_NOHUGEPAGE) != 0);
++#else
++	return (false);
++#endif
++}
++
+ #ifdef JEMALLOC_SYSCTL_VM_OVERCOMMIT
+ static bool
+ os_overcommits_sysctl(void)
+ {
+ 	int vm_overcommit;
+ 	size_t sz;
+ 
+ 	sz = sizeof(vm_overcommit);
+@@ -214,31 +243,31 @@ os_overcommits_sysctl(void)
+  */
+ static bool
+ os_overcommits_proc(void)
+ {
+ 	int fd;
+ 	char buf[1];
+ 	ssize_t nread;
+ 
+-#if defined(JEMALLOC_HAVE_SYSCALL) && defined(SYS_open)
++#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_open)
+ 	fd = (int)syscall(SYS_open, "/proc/sys/vm/overcommit_memory", O_RDONLY);
+ #else
+ 	fd = open("/proc/sys/vm/overcommit_memory", O_RDONLY);
+ #endif
+ 	if (fd == -1)
+ 		return (false); /* Error. */
+ 
+-#if defined(JEMALLOC_HAVE_SYSCALL) && defined(SYS_read)
++#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_read)
+ 	nread = (ssize_t)syscall(SYS_read, fd, &buf, sizeof(buf));
+ #else
+ 	nread = read(fd, &buf, sizeof(buf));
+ #endif
+ 
+-#if defined(JEMALLOC_HAVE_SYSCALL) && defined(SYS_close)
++#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_close)
+ 	syscall(SYS_close, fd);
+ #else
+ 	close(fd);
+ #endif
+ 
+ 	if (nread < 1)
+ 		return (false); /* Error. */
+ 	/*
+diff --git a/memory/jemalloc/src/src/stats.c b/memory/jemalloc/src/src/stats.c
+--- a/memory/jemalloc/src/src/stats.c
++++ b/memory/jemalloc/src/src/stats.c
+@@ -1,33 +1,33 @@
+ #define	JEMALLOC_STATS_C_
+ #include "jemalloc/internal/jemalloc_internal.h"
+ 
+ #define	CTL_GET(n, v, t) do {						\
+ 	size_t sz = sizeof(t);						\
+-	xmallctl(n, v, &sz, NULL, 0);					\
++	xmallctl(n, (void *)v, &sz, NULL, 0);				\
+ } while (0)
+ 
+ #define	CTL_M2_GET(n, i, v, t) do {					\
+ 	size_t mib[6];							\
+ 	size_t miblen = sizeof(mib) / sizeof(size_t);			\
+ 	size_t sz = sizeof(t);						\
+ 	xmallctlnametomib(n, mib, &miblen);				\
+ 	mib[2] = (i);							\
+-	xmallctlbymib(mib, miblen, v, &sz, NULL, 0);			\
++	xmallctlbymib(mib, miblen, (void *)v, &sz, NULL, 0);		\
+ } while (0)
+ 
+ #define	CTL_M2_M4_GET(n, i, j, v, t) do {				\
+ 	size_t mib[6];							\
+ 	size_t miblen = sizeof(mib) / sizeof(size_t);			\
+ 	size_t sz = sizeof(t);						\
+ 	xmallctlnametomib(n, mib, &miblen);				\
+ 	mib[2] = (i);							\
+ 	mib[4] = (j);							\
+-	xmallctlbymib(mib, miblen, v, &sz, NULL, 0);			\
++	xmallctlbymib(mib, miblen, (void *)v, &sz, NULL, 0);		\
+ } while (0)
+ 
+ /******************************************************************************/
+ /* Data. */
+ 
+ bool	opt_stats_print = false;
+ 
+ size_t	stats_cactive = 0;
+@@ -642,17 +642,17 @@ stats_general_print(void (*write_cb)(voi
+ 		} else {						\
+ 			malloc_cprintf(write_cb, cbopaque,		\
+ 			    "  opt."#n": %s\n", bv ? "true" : "false");	\
+ 		}							\
+ 	}
+ #define	OPT_WRITE_BOOL_MUTABLE(n, m, c) {				\
+ 	bool bv2;							\
+ 	if (je_mallctl("opt."#n, (void *)&bv, &bsz, NULL, 0) == 0 &&	\
+-	    je_mallctl(#m, &bv2, &bsz, NULL, 0) == 0) {			\
++	    je_mallctl(#m, &bv2, (void *)&bsz, NULL, 0) == 0) {		\
+ 		if (json) {						\
+ 			malloc_cprintf(write_cb, cbopaque,		\
+ 			    "\t\t\t\""#n"\": %s%s\n", bv ? "true" :	\
+ 			    "false", (c));				\
+ 		} else {						\
+ 			malloc_cprintf(write_cb, cbopaque,		\
+ 			    "  opt."#n": %s ("#m": %s)\n", bv ? "true"	\
+ 			    : "false", bv2 ? "true" : "false");		\
+@@ -687,17 +687,17 @@ stats_general_print(void (*write_cb)(voi
+ 		} else {						\
+ 			malloc_cprintf(write_cb, cbopaque,		\
+ 			    "  opt."#n": %zd\n", ssv);			\
+ 		}							\
+ 	}
+ #define	OPT_WRITE_SSIZE_T_MUTABLE(n, m, c) {				\
+ 	ssize_t ssv2;							\
+ 	if (je_mallctl("opt."#n, (void *)&ssv, &sssz, NULL, 0) == 0 &&	\
+-	    je_mallctl(#m, &ssv2, &sssz, NULL, 0) == 0) {		\
++	    je_mallctl(#m, (void *)&ssv2, &sssz, NULL, 0) == 0) {	\
+ 		if (json) {						\
+ 			malloc_cprintf(write_cb, cbopaque,		\
+ 			    "\t\t\t\""#n"\": %zd%s\n", ssv, (c));	\
+ 		} else {						\
+ 			malloc_cprintf(write_cb, cbopaque,		\
+ 			    "  opt."#n": %zd ("#m": %zd)\n",		\
+ 			    ssv, ssv2);					\
+ 		}							\
+@@ -1079,17 +1079,18 @@ stats_print(void (*write_cb)(void *, con
+ 	 * Refresh stats, in case mallctl() was called by the application.
+ 	 *
+ 	 * Check for OOM here, since refreshing the ctl cache can trigger
+ 	 * allocation.  In practice, none of the subsequent mallctl()-related
+ 	 * calls in this function will cause OOM if this one succeeds.
+ 	 * */
+ 	epoch = 1;
+ 	u64sz = sizeof(uint64_t);
+-	err = je_mallctl("epoch", &epoch, &u64sz, &epoch, sizeof(uint64_t));
++	err = je_mallctl("epoch", (void *)&epoch, &u64sz, (void *)&epoch,
++	    sizeof(uint64_t));
+ 	if (err != 0) {
+ 		if (err == EAGAIN) {
+ 			malloc_write("<jemalloc>: Memory allocation failure in "
+ 			    "mallctl(\"epoch\", ...)\n");
+ 			return;
+ 		}
+ 		malloc_write("<jemalloc>: Failure in mallctl(\"epoch\", "
+ 		    "...)\n");
+diff --git a/memory/jemalloc/src/src/tcache.c b/memory/jemalloc/src/src/tcache.c
+--- a/memory/jemalloc/src/src/tcache.c
++++ b/memory/jemalloc/src/src/tcache.c
+@@ -512,22 +512,22 @@ bool
+ tcache_boot(tsdn_t *tsdn)
+ {
+ 	unsigned i;
+ 
+ 	/*
+ 	 * If necessary, clamp opt_lg_tcache_max, now that large_maxclass is
+ 	 * known.
+ 	 */
+-	if (opt_lg_tcache_max < 0 || (1U << opt_lg_tcache_max) < SMALL_MAXCLASS)
++	if (opt_lg_tcache_max < 0 || (ZU(1) << opt_lg_tcache_max) < SMALL_MAXCLASS)
+ 		tcache_maxclass = SMALL_MAXCLASS;
+-	else if ((1U << opt_lg_tcache_max) > large_maxclass)
++	else if ((ZU(1) << opt_lg_tcache_max) > large_maxclass)
+ 		tcache_maxclass = large_maxclass;
+ 	else
+-		tcache_maxclass = (1U << opt_lg_tcache_max);
++		tcache_maxclass = (ZU(1) << opt_lg_tcache_max);
+ 
+ 	nhbins = size2index(tcache_maxclass) + 1;
+ 
+ 	/* Initialize tcache_bin_info. */
+ 	tcache_bin_info = (tcache_bin_info_t *)base_alloc(tsdn, nhbins *
+ 	    sizeof(tcache_bin_info_t));
+ 	if (tcache_bin_info == NULL)
+ 		return (true);
+diff --git a/memory/jemalloc/src/src/util.c b/memory/jemalloc/src/src/util.c
+--- a/memory/jemalloc/src/src/util.c
++++ b/memory/jemalloc/src/src/util.c
+@@ -44,17 +44,17 @@ static char	*x2s(uintmax_t x, bool alt_f
+ 
+ /******************************************************************************/
+ 
+ /* malloc_message() setup. */
+ static void
+ wrtmessage(void *cbopaque, const char *s)
+ {
+ 
+-#if defined(JEMALLOC_HAVE_SYSCALL) && defined(SYS_write)
++#if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_write)
+ 	/*
+ 	 * Use syscall(2) rather than write(2) when possible in order to avoid
+ 	 * the possibility of memory allocation within libc.  This is necessary
+ 	 * on FreeBSD; most operating systems do not have this problem though.
+ 	 *
+ 	 * syscall() returns long or int, depending on platform, so capture the
+ 	 * unused result in the widest plausible type to avoid compiler
+ 	 * warnings.
+@@ -195,17 +195,17 @@ malloc_strtoumax(const char *restrict np
+ 			/* Overflow. */
+ 			set_errno(ERANGE);
+ 			ret = UINTMAX_MAX;
+ 			goto label_return;
+ 		}
+ 		p++;
+ 	}
+ 	if (neg)
+-		ret = -ret;
++		ret = (uintmax_t)(-((intmax_t)ret));
+ 
+ 	if (p == ns) {
+ 		/* No conversion performed. */
+ 		set_errno(EINVAL);
+ 		ret = UINTMAX_MAX;
+ 		goto label_return;
+ 	}
+ 
+diff --git a/memory/jemalloc/src/test/integration/MALLOCX_ARENA.c b/memory/jemalloc/src/test/integration/MALLOCX_ARENA.c
+--- a/memory/jemalloc/src/test/integration/MALLOCX_ARENA.c
++++ b/memory/jemalloc/src/test/integration/MALLOCX_ARENA.c
+@@ -14,18 +14,18 @@ void *
+ thd_start(void *arg)
+ {
+ 	unsigned thread_ind = (unsigned)(uintptr_t)arg;
+ 	unsigned arena_ind;
+ 	void *p;
+ 	size_t sz;
+ 
+ 	sz = sizeof(arena_ind);
+-	assert_d_eq(mallctl("arenas.extend", &arena_ind, &sz, NULL, 0), 0,
+-	    "Error in arenas.extend");
++	assert_d_eq(mallctl("arenas.extend", (void *)&arena_ind, &sz, NULL, 0),
++	    0, "Error in arenas.extend");
+ 
+ 	if (thread_ind % 4 != 3) {
+ 		size_t mib[3];
+ 		size_t miblen = sizeof(mib) / sizeof(size_t);
+ 		const char *dss_precs[] = {"disabled", "primary", "secondary"};
+ 		unsigned prec_ind = thread_ind %
+ 		    (sizeof(dss_precs)/sizeof(char*));
+ 		const char *dss = dss_precs[prec_ind];
+diff --git a/memory/jemalloc/src/test/integration/allocated.c b/memory/jemalloc/src/test/integration/allocated.c
+--- a/memory/jemalloc/src/test/integration/allocated.c
++++ b/memory/jemalloc/src/test/integration/allocated.c
+@@ -13,75 +13,76 @@ thd_start(void *arg)
+ {
+ 	int err;
+ 	void *p;
+ 	uint64_t a0, a1, d0, d1;
+ 	uint64_t *ap0, *ap1, *dp0, *dp1;
+ 	size_t sz, usize;
+ 
+ 	sz = sizeof(a0);
+-	if ((err = mallctl("thread.allocated", &a0, &sz, NULL, 0))) {
++	if ((err = mallctl("thread.allocated", (void *)&a0, &sz, NULL, 0))) {
+ 		if (err == ENOENT)
+ 			goto label_ENOENT;
+ 		test_fail("%s(): Error in mallctl(): %s", __func__,
+ 		    strerror(err));
+ 	}
+ 	sz = sizeof(ap0);
+-	if ((err = mallctl("thread.allocatedp", &ap0, &sz, NULL, 0))) {
++	if ((err = mallctl("thread.allocatedp", (void *)&ap0, &sz, NULL, 0))) {
+ 		if (err == ENOENT)
+ 			goto label_ENOENT;
+ 		test_fail("%s(): Error in mallctl(): %s", __func__,
+ 		    strerror(err));
+ 	}
+ 	assert_u64_eq(*ap0, a0,
+ 	    "\"thread.allocatedp\" should provide a pointer to internal "
+ 	    "storage");
+ 
+ 	sz = sizeof(d0);
+-	if ((err = mallctl("thread.deallocated", &d0, &sz, NULL, 0))) {
++	if ((err = mallctl("thread.deallocated", (void *)&d0, &sz, NULL, 0))) {
+ 		if (err == ENOENT)
+ 			goto label_ENOENT;
+ 		test_fail("%s(): Error in mallctl(): %s", __func__,
+ 		    strerror(err));
+ 	}
+ 	sz = sizeof(dp0);
+-	if ((err = mallctl("thread.deallocatedp", &dp0, &sz, NULL, 0))) {
++	if ((err = mallctl("thread.deallocatedp", (void *)&dp0, &sz, NULL,
++	    0))) {
+ 		if (err == ENOENT)
+ 			goto label_ENOENT;
+ 		test_fail("%s(): Error in mallctl(): %s", __func__,
+ 		    strerror(err));
+ 	}
+ 	assert_u64_eq(*dp0, d0,
+ 	    "\"thread.deallocatedp\" should provide a pointer to internal "
+ 	    "storage");
+ 
+ 	p = malloc(1);
+ 	assert_ptr_not_null(p, "Unexpected malloc() error");
+ 
+ 	sz = sizeof(a1);
+-	mallctl("thread.allocated", &a1, &sz, NULL, 0);
++	mallctl("thread.allocated", (void *)&a1, &sz, NULL, 0);
+ 	sz = sizeof(ap1);
+-	mallctl("thread.allocatedp", &ap1, &sz, NULL, 0);
++	mallctl("thread.allocatedp", (void *)&ap1, &sz, NULL, 0);
+ 	assert_u64_eq(*ap1, a1,
+ 	    "Dereferenced \"thread.allocatedp\" value should equal "
+ 	    "\"thread.allocated\" value");
+ 	assert_ptr_eq(ap0, ap1,
+ 	    "Pointer returned by \"thread.allocatedp\" should not change");
+ 
+ 	usize = malloc_usable_size(p);
+ 	assert_u64_le(a0 + usize, a1,
+ 	    "Allocated memory counter should increase by at least the amount "
+ 	    "explicitly allocated");
+ 
+ 	free(p);
+ 
+ 	sz = sizeof(d1);
+-	mallctl("thread.deallocated", &d1, &sz, NULL, 0);
++	mallctl("thread.deallocated", (void *)&d1, &sz, NULL, 0);
+ 	sz = sizeof(dp1);
+-	mallctl("thread.deallocatedp", &dp1, &sz, NULL, 0);
++	mallctl("thread.deallocatedp", (void *)&dp1, &sz, NULL, 0);
+ 	assert_u64_eq(*dp1, d1,
+ 	    "Dereferenced \"thread.deallocatedp\" value should equal "
+ 	    "\"thread.deallocated\" value");
+ 	assert_ptr_eq(dp0, dp1,
+ 	    "Pointer returned by \"thread.deallocatedp\" should not change");
+ 
+ 	assert_u64_le(d0 + usize, d1,
+ 	    "Deallocated memory counter should increase by at least the amount "
+diff --git a/memory/jemalloc/src/test/integration/chunk.c b/memory/jemalloc/src/test/integration/chunk.c
+--- a/memory/jemalloc/src/test/integration/chunk.c
++++ b/memory/jemalloc/src/test/integration/chunk.c
+@@ -132,55 +132,56 @@ TEST_BEGIN(test_chunk)
+ 		chunk_decommit,
+ 		chunk_purge,
+ 		chunk_split,
+ 		chunk_merge
+ 	};
+ 	bool xallocx_success_a, xallocx_success_b, xallocx_success_c;
+ 
+ 	sz = sizeof(unsigned);
+-	assert_d_eq(mallctl("arenas.extend", &arena_ind, &sz, NULL, 0), 0,
+-	    "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("arenas.extend", (void *)&arena_ind, &sz, NULL, 0),
++	    0, "Unexpected mallctl() failure");
+ 	flags = MALLOCX_ARENA(arena_ind) | MALLOCX_TCACHE_NONE;
+ 
+ 	/* Install custom chunk hooks. */
+ 	hooks_miblen = sizeof(hooks_mib)/sizeof(size_t);
+ 	assert_d_eq(mallctlnametomib("arena.0.chunk_hooks", hooks_mib,
+ 	    &hooks_miblen), 0, "Unexpected mallctlnametomib() failure");
+ 	hooks_mib[1] = (size_t)arena_ind;
+ 	old_size = sizeof(chunk_hooks_t);
+ 	new_size = sizeof(chunk_hooks_t);
+-	assert_d_eq(mallctlbymib(hooks_mib, hooks_miblen, &old_hooks, &old_size,
+-	    &new_hooks, new_size), 0, "Unexpected chunk_hooks error");
++	assert_d_eq(mallctlbymib(hooks_mib, hooks_miblen, (void *)&old_hooks,
++	    &old_size, (void *)&new_hooks, new_size), 0,
++	    "Unexpected chunk_hooks error");
+ 	orig_hooks = old_hooks;
+ 	assert_ptr_ne(old_hooks.alloc, chunk_alloc, "Unexpected alloc error");
+ 	assert_ptr_ne(old_hooks.dalloc, chunk_dalloc,
+ 	    "Unexpected dalloc error");
+ 	assert_ptr_ne(old_hooks.commit, chunk_commit,
+ 	    "Unexpected commit error");
+ 	assert_ptr_ne(old_hooks.decommit, chunk_decommit,
+ 	    "Unexpected decommit error");
+ 	assert_ptr_ne(old_hooks.purge, chunk_purge, "Unexpected purge error");
+ 	assert_ptr_ne(old_hooks.split, chunk_split, "Unexpected split error");
+ 	assert_ptr_ne(old_hooks.merge, chunk_merge, "Unexpected merge error");
+ 
+ 	/* Get large size classes. */
+ 	sz = sizeof(size_t);
+-	assert_d_eq(mallctl("arenas.lrun.0.size", &large0, &sz, NULL, 0), 0,
+-	    "Unexpected arenas.lrun.0.size failure");
+-	assert_d_eq(mallctl("arenas.lrun.1.size", &large1, &sz, NULL, 0), 0,
+-	    "Unexpected arenas.lrun.1.size failure");
++	assert_d_eq(mallctl("arenas.lrun.0.size", (void *)&large0, &sz, NULL,
++	    0), 0, "Unexpected arenas.lrun.0.size failure");
++	assert_d_eq(mallctl("arenas.lrun.1.size", (void *)&large1, &sz, NULL,
++	    0), 0, "Unexpected arenas.lrun.1.size failure");
+ 
+ 	/* Get huge size classes. */
+-	assert_d_eq(mallctl("arenas.hchunk.0.size", &huge0, &sz, NULL, 0), 0,
+-	    "Unexpected arenas.hchunk.0.size failure");
+-	assert_d_eq(mallctl("arenas.hchunk.1.size", &huge1, &sz, NULL, 0), 0,
+-	    "Unexpected arenas.hchunk.1.size failure");
+-	assert_d_eq(mallctl("arenas.hchunk.2.size", &huge2, &sz, NULL, 0), 0,
+-	    "Unexpected arenas.hchunk.2.size failure");
++	assert_d_eq(mallctl("arenas.hchunk.0.size", (void *)&huge0, &sz, NULL,
++	    0), 0, "Unexpected arenas.hchunk.0.size failure");
++	assert_d_eq(mallctl("arenas.hchunk.1.size", (void *)&huge1, &sz, NULL,
++	    0), 0, "Unexpected arenas.hchunk.1.size failure");
++	assert_d_eq(mallctl("arenas.hchunk.2.size", (void *)&huge2, &sz, NULL,
++	    0), 0, "Unexpected arenas.hchunk.2.size failure");
+ 
+ 	/* Test dalloc/decommit/purge cascade. */
+ 	purge_miblen = sizeof(purge_mib)/sizeof(size_t);
+ 	assert_d_eq(mallctlnametomib("arena.0.purge", purge_mib, &purge_miblen),
+ 	    0, "Unexpected mallctlnametomib() failure");
+ 	purge_mib[1] = (size_t)arena_ind;
+ 	do_dalloc = false;
+ 	do_decommit = false;
+@@ -260,19 +261,19 @@ TEST_BEGIN(test_chunk)
+ 
+ 	/* Make sure non-huge allocation succeeds. */
+ 	p = mallocx(42, flags);
+ 	assert_ptr_not_null(p, "Unexpected mallocx() error");
+ 	dallocx(p, flags);
+ 
+ 	/* Restore chunk hooks. */
+ 	assert_d_eq(mallctlbymib(hooks_mib, hooks_miblen, NULL, NULL,
+-	    &old_hooks, new_size), 0, "Unexpected chunk_hooks error");
+-	assert_d_eq(mallctlbymib(hooks_mib, hooks_miblen, &old_hooks, &old_size,
+-	    NULL, 0), 0, "Unexpected chunk_hooks error");
++	    (void *)&old_hooks, new_size), 0, "Unexpected chunk_hooks error");
++	assert_d_eq(mallctlbymib(hooks_mib, hooks_miblen, (void *)&old_hooks,
++	    &old_size, NULL, 0), 0, "Unexpected chunk_hooks error");
+ 	assert_ptr_eq(old_hooks.alloc, orig_hooks.alloc,
+ 	    "Unexpected alloc error");
+ 	assert_ptr_eq(old_hooks.dalloc, orig_hooks.dalloc,
+ 	    "Unexpected dalloc error");
+ 	assert_ptr_eq(old_hooks.commit, orig_hooks.commit,
+ 	    "Unexpected commit error");
+ 	assert_ptr_eq(old_hooks.decommit, orig_hooks.decommit,
+ 	    "Unexpected decommit error");
+diff --git a/memory/jemalloc/src/test/integration/mallocx.c b/memory/jemalloc/src/test/integration/mallocx.c
+--- a/memory/jemalloc/src/test/integration/mallocx.c
++++ b/memory/jemalloc/src/test/integration/mallocx.c
+@@ -6,17 +6,17 @@ const char *malloc_conf = "junk:false";
+ 
+ static unsigned
+ get_nsizes_impl(const char *cmd)
+ {
+ 	unsigned ret;
+ 	size_t z;
+ 
+ 	z = sizeof(unsigned);
+-	assert_d_eq(mallctl(cmd, &ret, &z, NULL, 0), 0,
++	assert_d_eq(mallctl(cmd, (void *)&ret, &z, NULL, 0), 0,
+ 	    "Unexpected mallctl(\"%s\", ...) failure", cmd);
+ 
+ 	return (ret);
+ }
+ 
+ static unsigned
+ get_nhuge(void)
+ {
+@@ -32,17 +32,17 @@ get_size_impl(const char *cmd, size_t in
+ 	size_t mib[4];
+ 	size_t miblen = 4;
+ 
+ 	z = sizeof(size_t);
+ 	assert_d_eq(mallctlnametomib(cmd, mib, &miblen),
+ 	    0, "Unexpected mallctlnametomib(\"%s\", ...) failure", cmd);
+ 	mib[2] = ind;
+ 	z = sizeof(size_t);
+-	assert_d_eq(mallctlbymib(mib, miblen, &ret, &z, NULL, 0),
++	assert_d_eq(mallctlbymib(mib, miblen, (void *)&ret, &z, NULL, 0),
+ 	    0, "Unexpected mallctlbymib([\"%s\", %zu], ...) failure", cmd, ind);
+ 
+ 	return (ret);
+ }
+ 
+ static size_t
+ get_huge_size(size_t ind)
+ {
+diff --git a/memory/jemalloc/src/test/integration/overflow.c b/memory/jemalloc/src/test/integration/overflow.c
+--- a/memory/jemalloc/src/test/integration/overflow.c
++++ b/memory/jemalloc/src/test/integration/overflow.c
+@@ -3,27 +3,27 @@
+ TEST_BEGIN(test_overflow)
+ {
+ 	unsigned nhchunks;
+ 	size_t mib[4];
+ 	size_t sz, miblen, max_size_class;
+ 	void *p;
+ 
+ 	sz = sizeof(unsigned);
+-	assert_d_eq(mallctl("arenas.nhchunks", &nhchunks, &sz, NULL, 0), 0,
+-	    "Unexpected mallctl() error");
++	assert_d_eq(mallctl("arenas.nhchunks", (void *)&nhchunks, &sz, NULL, 0),
++	    0, "Unexpected mallctl() error");
+ 
+ 	miblen = sizeof(mib) / sizeof(size_t);
+ 	assert_d_eq(mallctlnametomib("arenas.hchunk.0.size", mib, &miblen), 0,
+ 	    "Unexpected mallctlnametomib() error");
+ 	mib[2] = nhchunks - 1;
+ 
+ 	sz = sizeof(size_t);
+-	assert_d_eq(mallctlbymib(mib, miblen, &max_size_class, &sz, NULL, 0), 0,
+-	    "Unexpected mallctlbymib() error");
++	assert_d_eq(mallctlbymib(mib, miblen, (void *)&max_size_class, &sz,
++	    NULL, 0), 0, "Unexpected mallctlbymib() error");
+ 
+ 	assert_ptr_null(malloc(max_size_class + 1),
+ 	    "Expected OOM due to over-sized allocation request");
+ 	assert_ptr_null(malloc(SIZE_T_MAX),
+ 	    "Expected OOM due to over-sized allocation request");
+ 
+ 	assert_ptr_null(calloc(1, max_size_class + 1),
+ 	    "Expected OOM due to over-sized allocation request");
+diff --git a/memory/jemalloc/src/test/integration/rallocx.c b/memory/jemalloc/src/test/integration/rallocx.c
+--- a/memory/jemalloc/src/test/integration/rallocx.c
++++ b/memory/jemalloc/src/test/integration/rallocx.c
+@@ -2,17 +2,17 @@
+ 
+ static unsigned
+ get_nsizes_impl(const char *cmd)
+ {
+ 	unsigned ret;
+ 	size_t z;
+ 
+ 	z = sizeof(unsigned);
+-	assert_d_eq(mallctl(cmd, &ret, &z, NULL, 0), 0,
++	assert_d_eq(mallctl(cmd, (void *)&ret, &z, NULL, 0), 0,
+ 	    "Unexpected mallctl(\"%s\", ...) failure", cmd);
+ 
+ 	return (ret);
+ }
+ 
+ static unsigned
+ get_nhuge(void)
+ {
+@@ -28,17 +28,17 @@ get_size_impl(const char *cmd, size_t in
+ 	size_t mib[4];
+ 	size_t miblen = 4;
+ 
+ 	z = sizeof(size_t);
+ 	assert_d_eq(mallctlnametomib(cmd, mib, &miblen),
+ 	    0, "Unexpected mallctlnametomib(\"%s\", ...) failure", cmd);
+ 	mib[2] = ind;
+ 	z = sizeof(size_t);
+-	assert_d_eq(mallctlbymib(mib, miblen, &ret, &z, NULL, 0),
++	assert_d_eq(mallctlbymib(mib, miblen, (void *)&ret, &z, NULL, 0),
+ 	    0, "Unexpected mallctlbymib([\"%s\", %zu], ...) failure", cmd, ind);
+ 
+ 	return (ret);
+ }
+ 
+ static size_t
+ get_huge_size(size_t ind)
+ {
+diff --git a/memory/jemalloc/src/test/integration/sdallocx.c b/memory/jemalloc/src/test/integration/sdallocx.c
+--- a/memory/jemalloc/src/test/integration/sdallocx.c
++++ b/memory/jemalloc/src/test/integration/sdallocx.c
+@@ -1,12 +1,12 @@
+ #include "test/jemalloc_test.h"
+ 
+-#define	MAXALIGN (((size_t)1) << 25)
+-#define	NITER 4
++#define	MAXALIGN (((size_t)1) << 22)
++#define	NITER 3
+ 
+ TEST_BEGIN(test_basic)
+ {
+ 	void *ptr = mallocx(64, 0);
+ 	sdallocx(ptr, 64, 0);
+ }
+ TEST_END
+ 
+diff --git a/memory/jemalloc/src/test/integration/thread_arena.c b/memory/jemalloc/src/test/integration/thread_arena.c
+--- a/memory/jemalloc/src/test/integration/thread_arena.c
++++ b/memory/jemalloc/src/test/integration/thread_arena.c
+@@ -11,26 +11,27 @@ thd_start(void *arg)
+ 	size_t size;
+ 	int err;
+ 
+ 	p = malloc(1);
+ 	assert_ptr_not_null(p, "Error in malloc()");
+ 	free(p);
+ 
+ 	size = sizeof(arena_ind);
+-	if ((err = mallctl("thread.arena", &arena_ind, &size, &main_arena_ind,
+-	    sizeof(main_arena_ind)))) {
++	if ((err = mallctl("thread.arena", (void *)&arena_ind, &size,
++	    (void *)&main_arena_ind, sizeof(main_arena_ind)))) {
+ 		char buf[BUFERROR_BUF];
+ 
+ 		buferror(err, buf, sizeof(buf));
+ 		test_fail("Error in mallctl(): %s", buf);
+ 	}
+ 
+ 	size = sizeof(arena_ind);
+-	if ((err = mallctl("thread.arena", &arena_ind, &size, NULL, 0))) {
++	if ((err = mallctl("thread.arena", (void *)&arena_ind, &size, NULL,
++	    0))) {
+ 		char buf[BUFERROR_BUF];
+ 
+ 		buferror(err, buf, sizeof(buf));
+ 		test_fail("Error in mallctl(): %s", buf);
+ 	}
+ 	assert_u_eq(arena_ind, main_arena_ind,
+ 	    "Arena index should be same as for main thread");
+ 
+@@ -45,17 +46,18 @@ TEST_BEGIN(test_thread_arena)
+ 	int err;
+ 	thd_t thds[NTHREADS];
+ 	unsigned i;
+ 
+ 	p = malloc(1);
+ 	assert_ptr_not_null(p, "Error in malloc()");
+ 
+ 	size = sizeof(arena_ind);
+-	if ((err = mallctl("thread.arena", &arena_ind, &size, NULL, 0))) {
++	if ((err = mallctl("thread.arena", (void *)&arena_ind, &size, NULL,
++	    0))) {
+ 		char buf[BUFERROR_BUF];
+ 
+ 		buferror(err, buf, sizeof(buf));
+ 		test_fail("Error in mallctl(): %s", buf);
+ 	}
+ 
+ 	for (i = 0; i < NTHREADS; i++) {
+ 		thd_create(&thds[i], thd_start,
+diff --git a/memory/jemalloc/src/test/integration/thread_tcache_enabled.c b/memory/jemalloc/src/test/integration/thread_tcache_enabled.c
+--- a/memory/jemalloc/src/test/integration/thread_tcache_enabled.c
++++ b/memory/jemalloc/src/test/integration/thread_tcache_enabled.c
+@@ -11,74 +11,75 @@ static const bool config_tcache =
+ void *
+ thd_start(void *arg)
+ {
+ 	int err;
+ 	size_t sz;
+ 	bool e0, e1;
+ 
+ 	sz = sizeof(bool);
+-	if ((err = mallctl("thread.tcache.enabled", &e0, &sz, NULL, 0))) {
++	if ((err = mallctl("thread.tcache.enabled", (void *)&e0, &sz, NULL,
++	    0))) {
+ 		if (err == ENOENT) {
+ 			assert_false(config_tcache,
+ 			    "ENOENT should only be returned if tcache is "
+ 			    "disabled");
+ 		}
+ 		goto label_ENOENT;
+ 	}
+ 
+ 	if (e0) {
+ 		e1 = false;
+-		assert_d_eq(mallctl("thread.tcache.enabled", &e0, &sz, &e1, sz),
+-		    0, "Unexpected mallctl() error");
++		assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
++		    (void *)&e1, sz), 0, "Unexpected mallctl() error");
+ 		assert_true(e0, "tcache should be enabled");
+ 	}
+ 
+ 	e1 = true;
+-	assert_d_eq(mallctl("thread.tcache.enabled", &e0, &sz, &e1, sz), 0,
+-	    "Unexpected mallctl() error");
++	assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
++	    (void *)&e1, sz), 0, "Unexpected mallctl() error");
+ 	assert_false(e0, "tcache should be disabled");
+ 
+ 	e1 = true;
+-	assert_d_eq(mallctl("thread.tcache.enabled", &e0, &sz, &e1, sz), 0,
+-	    "Unexpected mallctl() error");
++	assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
++	    (void *)&e1, sz), 0, "Unexpected mallctl() error");
+ 	assert_true(e0, "tcache should be enabled");
+ 
+ 	e1 = false;
+-	assert_d_eq(mallctl("thread.tcache.enabled", &e0, &sz, &e1, sz), 0,
+-	    "Unexpected mallctl() error");
++	assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
++	    (void *)&e1, sz), 0, "Unexpected mallctl() error");
+ 	assert_true(e0, "tcache should be enabled");
+ 
+ 	e1 = false;
+-	assert_d_eq(mallctl("thread.tcache.enabled", &e0, &sz, &e1, sz), 0,
+-	    "Unexpected mallctl() error");
++	assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
++	    (void *)&e1, sz), 0, "Unexpected mallctl() error");
+ 	assert_false(e0, "tcache should be disabled");
+ 
+ 	free(malloc(1));
+ 	e1 = true;
+-	assert_d_eq(mallctl("thread.tcache.enabled", &e0, &sz, &e1, sz), 0,
+-	    "Unexpected mallctl() error");
++	assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
++	    (void *)&e1, sz), 0, "Unexpected mallctl() error");
+ 	assert_false(e0, "tcache should be disabled");
+ 
+ 	free(malloc(1));
+ 	e1 = true;
+-	assert_d_eq(mallctl("thread.tcache.enabled", &e0, &sz, &e1, sz), 0,
+-	    "Unexpected mallctl() error");
++	assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
++	    (void *)&e1, sz), 0, "Unexpected mallctl() error");
+ 	assert_true(e0, "tcache should be enabled");
+ 
+ 	free(malloc(1));
+ 	e1 = false;
+-	assert_d_eq(mallctl("thread.tcache.enabled", &e0, &sz, &e1, sz), 0,
+-	    "Unexpected mallctl() error");
++	assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
++	    (void *)&e1, sz), 0, "Unexpected mallctl() error");
+ 	assert_true(e0, "tcache should be enabled");
+ 
+ 	free(malloc(1));
+ 	e1 = false;
+-	assert_d_eq(mallctl("thread.tcache.enabled", &e0, &sz, &e1, sz), 0,
+-	    "Unexpected mallctl() error");
++	assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
++	    (void *)&e1, sz), 0, "Unexpected mallctl() error");
+ 	assert_false(e0, "tcache should be disabled");
+ 
+ 	free(malloc(1));
+ 	return (NULL);
+ label_ENOENT:
+ 	test_skip("\"thread.tcache.enabled\" mallctl not available");
+ 	return (NULL);
+ }
+diff --git a/memory/jemalloc/src/test/integration/xallocx.c b/memory/jemalloc/src/test/integration/xallocx.c
+--- a/memory/jemalloc/src/test/integration/xallocx.c
++++ b/memory/jemalloc/src/test/integration/xallocx.c
+@@ -11,18 +11,18 @@ const char *malloc_conf = "junk:false";
+  */
+ static unsigned
+ arena_ind(void)
+ {
+ 	static unsigned ind = 0;
+ 
+ 	if (ind == 0) {
+ 		size_t sz = sizeof(ind);
+-		assert_d_eq(mallctl("arenas.extend", &ind, &sz, NULL, 0), 0,
+-		    "Unexpected mallctl failure creating arena");
++		assert_d_eq(mallctl("arenas.extend", (void *)&ind, &sz, NULL,
++		    0), 0, "Unexpected mallctl failure creating arena");
+ 	}
+ 
+ 	return (ind);
+ }
+ 
+ TEST_BEGIN(test_same_size)
+ {
+ 	void *p;
+@@ -73,17 +73,17 @@ TEST_END
+ 
+ static unsigned
+ get_nsizes_impl(const char *cmd)
+ {
+ 	unsigned ret;
+ 	size_t z;
+ 
+ 	z = sizeof(unsigned);
+-	assert_d_eq(mallctl(cmd, &ret, &z, NULL, 0), 0,
++	assert_d_eq(mallctl(cmd, (void *)&ret, &z, NULL, 0), 0,
+ 	    "Unexpected mallctl(\"%s\", ...) failure", cmd);
+ 
+ 	return (ret);
+ }
+ 
+ static unsigned
+ get_nsmall(void)
+ {
+@@ -113,17 +113,17 @@ get_size_impl(const char *cmd, size_t in
+ 	size_t mib[4];
+ 	size_t miblen = 4;
+ 
+ 	z = sizeof(size_t);
+ 	assert_d_eq(mallctlnametomib(cmd, mib, &miblen),
+ 	    0, "Unexpected mallctlnametomib(\"%s\", ...) failure", cmd);
+ 	mib[2] = ind;
+ 	z = sizeof(size_t);
+-	assert_d_eq(mallctlbymib(mib, miblen, &ret, &z, NULL, 0),
++	assert_d_eq(mallctlbymib(mib, miblen, (void *)&ret, &z, NULL, 0),
+ 	    0, "Unexpected mallctlbymib([\"%s\", %zu], ...) failure", cmd, ind);
+ 
+ 	return (ret);
+ }
+ 
+ static size_t
+ get_small_size(size_t ind)
+ {
+diff --git a/memory/jemalloc/src/test/unit/arena_reset.c b/memory/jemalloc/src/test/unit/arena_reset.c
+--- a/memory/jemalloc/src/test/unit/arena_reset.c
++++ b/memory/jemalloc/src/test/unit/arena_reset.c
+@@ -6,17 +6,17 @@ const char *malloc_conf = "prof:true,lg_
+ 
+ static unsigned
+ get_nsizes_impl(const char *cmd)
+ {
+ 	unsigned ret;
+ 	size_t z;
+ 
+ 	z = sizeof(unsigned);
+-	assert_d_eq(mallctl(cmd, &ret, &z, NULL, 0), 0,
++	assert_d_eq(mallctl(cmd, (void *)&ret, &z, NULL, 0), 0,
+ 	    "Unexpected mallctl(\"%s\", ...) failure", cmd);
+ 
+ 	return (ret);
+ }
+ 
+ static unsigned
+ get_nsmall(void)
+ {
+@@ -46,17 +46,17 @@ get_size_impl(const char *cmd, size_t in
+ 	size_t mib[4];
+ 	size_t miblen = 4;
+ 
+ 	z = sizeof(size_t);
+ 	assert_d_eq(mallctlnametomib(cmd, mib, &miblen),
+ 	    0, "Unexpected mallctlnametomib(\"%s\", ...) failure", cmd);
+ 	mib[2] = ind;
+ 	z = sizeof(size_t);
+-	assert_d_eq(mallctlbymib(mib, miblen, &ret, &z, NULL, 0),
++	assert_d_eq(mallctlbymib(mib, miblen, (void *)&ret, &z, NULL, 0),
+ 	    0, "Unexpected mallctlbymib([\"%s\", %zu], ...) failure", cmd, ind);
+ 
+ 	return (ret);
+ }
+ 
+ static size_t
+ get_small_size(size_t ind)
+ {
+@@ -87,18 +87,18 @@ TEST_BEGIN(test_arena_reset)
+ 	int flags;
+ 	size_t mib[3];
+ 	tsdn_t *tsdn;
+ 
+ 	test_skip_if((config_valgrind && unlikely(in_valgrind)) || (config_fill
+ 	    && unlikely(opt_quarantine)));
+ 
+ 	sz = sizeof(unsigned);
+-	assert_d_eq(mallctl("arenas.extend", &arena_ind, &sz, NULL, 0), 0,
+-	    "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("arenas.extend", (void *)&arena_ind, &sz, NULL, 0),
++	    0, "Unexpected mallctl() failure");
+ 
+ 	flags = MALLOCX_ARENA(arena_ind) | MALLOCX_TCACHE_NONE;
+ 
+ 	nsmall = get_nsmall();
+ 	nlarge = get_nlarge();
+ 	nhuge = get_nhuge() > NHUGE ? NHUGE : get_nhuge();
+ 	nptrs = nsmall + nlarge + nhuge;
+ 	ptrs = (void **)malloc(nptrs * sizeof(void *));
+diff --git a/memory/jemalloc/src/test/unit/decay.c b/memory/jemalloc/src/test/unit/decay.c
+--- a/memory/jemalloc/src/test/unit/decay.c
++++ b/memory/jemalloc/src/test/unit/decay.c
+@@ -35,20 +35,20 @@ TEST_BEGIN(test_decay_ticks)
+ 
+ 	test_skip_if(opt_purge != purge_mode_decay);
+ 
+ 	decay_ticker = decay_ticker_get(tsd_fetch(), 0);
+ 	assert_ptr_not_null(decay_ticker,
+ 	    "Unexpected failure getting decay ticker");
+ 
+ 	sz = sizeof(size_t);
+-	assert_d_eq(mallctl("arenas.hchunk.0.size", &huge0, &sz, NULL, 0), 0,
+-	    "Unexpected mallctl failure");
+-	assert_d_eq(mallctl("arenas.lrun.0.size", &large0, &sz, NULL, 0), 0,
+-	    "Unexpected mallctl failure");
++	assert_d_eq(mallctl("arenas.hchunk.0.size", (void *)&huge0, &sz, NULL,
++	    0), 0, "Unexpected mallctl failure");
++	assert_d_eq(mallctl("arenas.lrun.0.size", (void *)&large0, &sz, NULL,
++	    0), 0, "Unexpected mallctl failure");
+ 
+ 	/*
+ 	 * Test the standard APIs using a huge size class, since we can't
+ 	 * control tcache interactions (except by completely disabling tcache
+ 	 * for the entire test program).
+ 	 */
+ 
+ 	/* malloc(). */
+@@ -170,35 +170,35 @@ TEST_BEGIN(test_decay_ticks)
+ 	 */
+ 	if (config_tcache) {
+ 		unsigned tcache_ind, i;
+ 		size_t tcache_sizes[2];
+ 		tcache_sizes[0] = large0;
+ 		tcache_sizes[1] = 1;
+ 
+ 		sz = sizeof(unsigned);
+-		assert_d_eq(mallctl("tcache.create", &tcache_ind, &sz, NULL, 0),
+-		    0, "Unexpected mallctl failure");
++		assert_d_eq(mallctl("tcache.create", (void *)&tcache_ind, &sz,
++		    NULL, 0), 0, "Unexpected mallctl failure");
+ 
+ 		for (i = 0; i < sizeof(tcache_sizes) / sizeof(size_t); i++) {
+ 			sz = tcache_sizes[i];
+ 
+ 			/* tcache fill. */
+ 			tick0 = ticker_read(decay_ticker);
+ 			p = mallocx(sz, MALLOCX_TCACHE(tcache_ind));
+ 			assert_ptr_not_null(p, "Unexpected mallocx() failure");
+ 			tick1 = ticker_read(decay_ticker);
+ 			assert_u32_ne(tick1, tick0,
+ 			    "Expected ticker to tick during tcache fill "
+ 			    "(sz=%zu)", sz);
+ 			/* tcache flush. */
+ 			dallocx(p, MALLOCX_TCACHE(tcache_ind));
+ 			tick0 = ticker_read(decay_ticker);
+ 			assert_d_eq(mallctl("tcache.flush", NULL, NULL,
+-			    &tcache_ind, sizeof(unsigned)), 0,
++			    (void *)&tcache_ind, sizeof(unsigned)), 0,
+ 			    "Unexpected mallctl failure");
+ 			tick1 = ticker_read(decay_ticker);
+ 			assert_u32_ne(tick1, tick0,
+ 			    "Expected ticker to tick during tcache flush "
+ 			    "(sz=%zu)", sz);
+ 		}
+ 	}
+ }
+@@ -223,32 +223,32 @@ TEST_BEGIN(test_decay_ticker)
+ 	 * objects, restore the clock, then [md]allocx() in a tight loop to
+ 	 * verify the ticker triggers purging.
+ 	 */
+ 
+ 	if (config_tcache) {
+ 		size_t tcache_max;
+ 
+ 		sz = sizeof(size_t);
+-		assert_d_eq(mallctl("arenas.tcache_max", &tcache_max, &sz, NULL,
+-		    0), 0, "Unexpected mallctl failure");
++		assert_d_eq(mallctl("arenas.tcache_max", (void *)&tcache_max,
++		    &sz, NULL, 0), 0, "Unexpected mallctl failure");
+ 		large = nallocx(tcache_max + 1, flags);
+ 	}  else {
+ 		sz = sizeof(size_t);
+-		assert_d_eq(mallctl("arenas.lrun.0.size", &large, &sz, NULL, 0),
+-		    0, "Unexpected mallctl failure");
++		assert_d_eq(mallctl("arenas.lrun.0.size", (void *)&large, &sz,
++		    NULL, 0), 0, "Unexpected mallctl failure");
+ 	}
+ 
+ 	assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
+ 	    "Unexpected mallctl failure");
+-	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(uint64_t)), 0,
+-	    "Unexpected mallctl failure");
++	assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch,
++	    sizeof(uint64_t)), 0, "Unexpected mallctl failure");
+ 	sz = sizeof(uint64_t);
+-	assert_d_eq(mallctl("stats.arenas.0.npurge", &npurge0, &sz, NULL, 0),
+-	    config_stats ? 0 : ENOENT, "Unexpected mallctl result");
++	assert_d_eq(mallctl("stats.arenas.0.npurge", (void *)&npurge0, &sz,
++	    NULL, 0), config_stats ? 0 : ENOENT, "Unexpected mallctl result");
+ 
+ 	for (i = 0; i < NPS; i++) {
+ 		ps[i] = mallocx(large, flags);
+ 		assert_ptr_not_null(ps[i], "Unexpected mallocx() failure");
+ 	}
+ 
+ 	nupdates_mock = 0;
+ 	nstime_init(&time_mock, 0);
+@@ -278,21 +278,21 @@ TEST_BEGIN(test_decay_ticker)
+ 	nstime_copy(&deadline, &time);
+ 	nstime_add(&deadline, &decay_time);
+ 	do {
+ 		for (i = 0; i < DECAY_NTICKS_PER_UPDATE / 2; i++) {
+ 			void *p = mallocx(1, flags);
+ 			assert_ptr_not_null(p, "Unexpected mallocx() failure");
+ 			dallocx(p, flags);
+ 		}
+-		assert_d_eq(mallctl("epoch", NULL, NULL, &epoch,
++		assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch,
+ 		    sizeof(uint64_t)), 0, "Unexpected mallctl failure");
+ 		sz = sizeof(uint64_t);
+-		assert_d_eq(mallctl("stats.arenas.0.npurge", &npurge1, &sz,
+-		    NULL, 0), config_stats ? 0 : ENOENT,
++		assert_d_eq(mallctl("stats.arenas.0.npurge", (void *)&npurge1,
++		    &sz, NULL, 0), config_stats ? 0 : ENOENT,
+ 		    "Unexpected mallctl result");
+ 
+ 		nstime_update(&time);
+ 	} while (nstime_compare(&time, &deadline) <= 0 && npurge1 == npurge0);
+ 
+ 	if (config_stats)
+ 		assert_u64_gt(npurge1, npurge0, "Expected purging to occur");
+ #undef NPS
+@@ -308,26 +308,26 @@ TEST_BEGIN(test_decay_nonmonotonic)
+ 	uint64_t npurge0 = 0;
+ 	uint64_t npurge1 = 0;
+ 	size_t sz, large0;
+ 	unsigned i, nupdates0;
+ 
+ 	test_skip_if(opt_purge != purge_mode_decay);
+ 
+ 	sz = sizeof(size_t);
+-	assert_d_eq(mallctl("arenas.lrun.0.size", &large0, &sz, NULL, 0), 0,
+-	    "Unexpected mallctl failure");
++	assert_d_eq(mallctl("arenas.lrun.0.size", (void *)&large0, &sz, NULL,
++	    0), 0, "Unexpected mallctl failure");
+ 
+ 	assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
+ 	    "Unexpected mallctl failure");
+-	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(uint64_t)), 0,
+-	    "Unexpected mallctl failure");
++	assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch,
++	    sizeof(uint64_t)), 0, "Unexpected mallctl failure");
+ 	sz = sizeof(uint64_t);
+-	assert_d_eq(mallctl("stats.arenas.0.npurge", &npurge0, &sz, NULL, 0),
+-	    config_stats ? 0 : ENOENT, "Unexpected mallctl result");
++	assert_d_eq(mallctl("stats.arenas.0.npurge", (void *)&npurge0, &sz,
++	    NULL, 0), config_stats ? 0 : ENOENT, "Unexpected mallctl result");
+ 
+ 	nupdates_mock = 0;
+ 	nstime_init(&time_mock, 0);
+ 	nstime_update(&time_mock);
+ 	monotonic_mock = false;
+ 
+ 	nstime_monotonic_orig = nstime_monotonic;
+ 	nstime_update_orig = nstime_update;
+@@ -343,21 +343,21 @@ TEST_BEGIN(test_decay_nonmonotonic)
+ 		dallocx(ps[i], flags);
+ 		nupdates0 = nupdates_mock;
+ 		assert_d_eq(mallctl("arena.0.decay", NULL, NULL, NULL, 0), 0,
+ 		    "Unexpected arena.0.decay failure");
+ 		assert_u_gt(nupdates_mock, nupdates0,
+ 		    "Expected nstime_update() to be called");
+ 	}
+ 
+-	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(uint64_t)), 0,
+-	    "Unexpected mallctl failure");
++	assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch,
++	    sizeof(uint64_t)), 0, "Unexpected mallctl failure");
+ 	sz = sizeof(uint64_t);
+-	assert_d_eq(mallctl("stats.arenas.0.npurge", &npurge1, &sz, NULL, 0),
+-	    config_stats ? 0 : ENOENT, "Unexpected mallctl result");
++	assert_d_eq(mallctl("stats.arenas.0.npurge", (void *)&npurge1, &sz,
++	    NULL, 0), config_stats ? 0 : ENOENT, "Unexpected mallctl result");
+ 
+ 	if (config_stats)
+ 		assert_u64_eq(npurge0, npurge1, "Unexpected purging occurred");
+ 
+ 	nstime_monotonic = nstime_monotonic_orig;
+ 	nstime_update = nstime_update_orig;
+ #undef NPS
+ }
+diff --git a/memory/jemalloc/src/test/unit/mallctl.c b/memory/jemalloc/src/test/unit/mallctl.c
+--- a/memory/jemalloc/src/test/unit/mallctl.c
++++ b/memory/jemalloc/src/test/unit/mallctl.c
+@@ -7,26 +7,28 @@ TEST_BEGIN(test_mallctl_errors)
+ 
+ 	assert_d_eq(mallctl("no_such_name", NULL, NULL, NULL, 0), ENOENT,
+ 	    "mallctl() should return ENOENT for non-existent names");
+ 
+ 	assert_d_eq(mallctl("version", NULL, NULL, "0.0.0", strlen("0.0.0")),
+ 	    EPERM, "mallctl() should return EPERM on attempt to write "
+ 	    "read-only value");
+ 
+-	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)-1),
+-	    EINVAL, "mallctl() should return EINVAL for input size mismatch");
+-	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)+1),
+-	    EINVAL, "mallctl() should return EINVAL for input size mismatch");
++	assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch,
++	    sizeof(epoch)-1), EINVAL,
++	    "mallctl() should return EINVAL for input size mismatch");
++	assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch,
++	    sizeof(epoch)+1), EINVAL,
++	    "mallctl() should return EINVAL for input size mismatch");
+ 
+ 	sz = sizeof(epoch)-1;
+-	assert_d_eq(mallctl("epoch", &epoch, &sz, NULL, 0), EINVAL,
++	assert_d_eq(mallctl("epoch", (void *)&epoch, &sz, NULL, 0), EINVAL,
+ 	    "mallctl() should return EINVAL for output size mismatch");
+ 	sz = sizeof(epoch)+1;
+-	assert_d_eq(mallctl("epoch", &epoch, &sz, NULL, 0), EINVAL,
++	assert_d_eq(mallctl("epoch", (void *)&epoch, &sz, NULL, 0), EINVAL,
+ 	    "mallctl() should return EINVAL for output size mismatch");
+ }
+ TEST_END
+ 
+ TEST_BEGIN(test_mallctlnametomib_errors)
+ {
+ 	size_t mib[1];
+ 	size_t miblen;
+@@ -51,55 +53,58 @@ TEST_BEGIN(test_mallctlbymib_errors)
+ 	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, "0.0.0",
+ 	    strlen("0.0.0")), EPERM, "mallctl() should return EPERM on "
+ 	    "attempt to write read-only value");
+ 
+ 	miblen = sizeof(mib)/sizeof(size_t);
+ 	assert_d_eq(mallctlnametomib("epoch", mib, &miblen), 0,
+ 	    "Unexpected mallctlnametomib() failure");
+ 
+-	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, &epoch,
++	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, (void *)&epoch,
+ 	    sizeof(epoch)-1), EINVAL,
+ 	    "mallctlbymib() should return EINVAL for input size mismatch");
+-	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, &epoch,
++	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, (void *)&epoch,
+ 	    sizeof(epoch)+1), EINVAL,
+ 	    "mallctlbymib() should return EINVAL for input size mismatch");
+ 
+ 	sz = sizeof(epoch)-1;
+-	assert_d_eq(mallctlbymib(mib, miblen, &epoch, &sz, NULL, 0), EINVAL,
++	assert_d_eq(mallctlbymib(mib, miblen, (void *)&epoch, &sz, NULL, 0),
++	    EINVAL,
+ 	    "mallctlbymib() should return EINVAL for output size mismatch");
+ 	sz = sizeof(epoch)+1;
+-	assert_d_eq(mallctlbymib(mib, miblen, &epoch, &sz, NULL, 0), EINVAL,
++	assert_d_eq(mallctlbymib(mib, miblen, (void *)&epoch, &sz, NULL, 0),
++	    EINVAL,
+ 	    "mallctlbymib() should return EINVAL for output size mismatch");
+ }
+ TEST_END
+ 
+ TEST_BEGIN(test_mallctl_read_write)
+ {
+ 	uint64_t old_epoch, new_epoch;
+ 	size_t sz = sizeof(old_epoch);
+ 
+ 	/* Blind. */
+ 	assert_d_eq(mallctl("epoch", NULL, NULL, NULL, 0), 0,
+ 	    "Unexpected mallctl() failure");
+ 	assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size");
+ 
+ 	/* Read. */
+-	assert_d_eq(mallctl("epoch", &old_epoch, &sz, NULL, 0), 0,
++	assert_d_eq(mallctl("epoch", (void *)&old_epoch, &sz, NULL, 0), 0,
+ 	    "Unexpected mallctl() failure");
+ 	assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size");
+ 
+ 	/* Write. */
+-	assert_d_eq(mallctl("epoch", NULL, NULL, &new_epoch, sizeof(new_epoch)),
+-	    0, "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&new_epoch,
++	    sizeof(new_epoch)), 0, "Unexpected mallctl() failure");
+ 	assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size");
+ 
+ 	/* Read+write. */
+-	assert_d_eq(mallctl("epoch", &old_epoch, &sz, &new_epoch,
+-	    sizeof(new_epoch)), 0, "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("epoch", (void *)&old_epoch, &sz,
++	    (void *)&new_epoch, sizeof(new_epoch)), 0,
++	    "Unexpected mallctl() failure");
+ 	assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size");
+ }
+ TEST_END
+ 
+ TEST_BEGIN(test_mallctlnametomib_short_mib)
+ {
+ 	size_t mib[4];
+ 	size_t miblen;
+@@ -115,18 +120,18 @@ TEST_BEGIN(test_mallctlnametomib_short_m
+ TEST_END
+ 
+ TEST_BEGIN(test_mallctl_config)
+ {
+ 
+ #define	TEST_MALLCTL_CONFIG(config, t) do {				\
+ 	t oldval;							\
+ 	size_t sz = sizeof(oldval);					\
+-	assert_d_eq(mallctl("config."#config, &oldval, &sz, NULL, 0),	\
+-	    0, "Unexpected mallctl() failure");				\
++	assert_d_eq(mallctl("config."#config, (void *)&oldval, &sz,	\
++	    NULL, 0), 0, "Unexpected mallctl() failure");		\
+ 	assert_b_eq(oldval, config_##config, "Incorrect config value");	\
+ 	assert_zu_eq(sz, sizeof(oldval), "Unexpected output size");	\
+ } while (0)
+ 
+ 	TEST_MALLCTL_CONFIG(cache_oblivious, bool);
+ 	TEST_MALLCTL_CONFIG(debug, bool);
+ 	TEST_MALLCTL_CONFIG(fill, bool);
+ 	TEST_MALLCTL_CONFIG(lazy_lock, bool);
+@@ -149,17 +154,18 @@ TEST_END
+ TEST_BEGIN(test_mallctl_opt)
+ {
+ 	bool config_always = true;
+ 
+ #define	TEST_MALLCTL_OPT(t, opt, config) do {				\
+ 	t oldval;							\
+ 	size_t sz = sizeof(oldval);					\
+ 	int expected = config_##config ? 0 : ENOENT;			\
+-	int result = mallctl("opt."#opt, &oldval, &sz, NULL, 0);	\
++	int result = mallctl("opt."#opt, (void *)&oldval, &sz, NULL,	\
++	    0);								\
+ 	assert_d_eq(result, expected,					\
+ 	    "Unexpected mallctl() result for opt."#opt);		\
+ 	assert_zu_eq(sz, sizeof(oldval), "Unexpected output size");	\
+ } while (0)
+ 
+ 	TEST_MALLCTL_OPT(bool, abort, always);
+ 	TEST_MALLCTL_OPT(size_t, lg_chunk, always);
+ 	TEST_MALLCTL_OPT(const char *, dss, always);
+@@ -192,29 +198,29 @@ TEST_END
+ 
+ TEST_BEGIN(test_manpage_example)
+ {
+ 	unsigned nbins, i;
+ 	size_t mib[4];
+ 	size_t len, miblen;
+ 
+ 	len = sizeof(nbins);
+-	assert_d_eq(mallctl("arenas.nbins", &nbins, &len, NULL, 0), 0,
++	assert_d_eq(mallctl("arenas.nbins", (void *)&nbins, &len, NULL, 0), 0,
+ 	    "Unexpected mallctl() failure");
+ 
+ 	miblen = 4;
+ 	assert_d_eq(mallctlnametomib("arenas.bin.0.size", mib, &miblen), 0,
+ 	    "Unexpected mallctlnametomib() failure");
+ 	for (i = 0; i < nbins; i++) {
+ 		size_t bin_size;
+ 
+ 		mib[2] = i;
+ 		len = sizeof(bin_size);
+-		assert_d_eq(mallctlbymib(mib, miblen, &bin_size, &len, NULL, 0),
+-		    0, "Unexpected mallctlbymib() failure");
++		assert_d_eq(mallctlbymib(mib, miblen, (void *)&bin_size, &len,
++		    NULL, 0), 0, "Unexpected mallctlbymib() failure");
+ 		/* Do something with bin_size... */
+ 	}
+ }
+ TEST_END
+ 
+ TEST_BEGIN(test_tcache_none)
+ {
+ 	void *p0, *q, *p1;
+@@ -253,35 +259,35 @@ TEST_BEGIN(test_tcache)
+ 	test_skip_if(!config_tcache);
+ 
+ 	psz = 42;
+ 	qsz = nallocx(psz, 0) + 1;
+ 
+ 	/* Create tcaches. */
+ 	for (i = 0; i < NTCACHES; i++) {
+ 		sz = sizeof(unsigned);
+-		assert_d_eq(mallctl("tcache.create", &tis[i], &sz, NULL, 0), 0,
+-		    "Unexpected mallctl() failure, i=%u", i);
++		assert_d_eq(mallctl("tcache.create", (void *)&tis[i], &sz, NULL,
++		    0), 0, "Unexpected mallctl() failure, i=%u", i);
+ 	}
+ 
+ 	/* Exercise tcache ID recycling. */
+ 	for (i = 0; i < NTCACHES; i++) {
+-		assert_d_eq(mallctl("tcache.destroy", NULL, NULL, &tis[i],
+-		    sizeof(unsigned)), 0, "Unexpected mallctl() failure, i=%u",
+-		    i);
++		assert_d_eq(mallctl("tcache.destroy", NULL, NULL,
++		    (void *)&tis[i], sizeof(unsigned)), 0,
++		    "Unexpected mallctl() failure, i=%u", i);
+ 	}
+ 	for (i = 0; i < NTCACHES; i++) {
+ 		sz = sizeof(unsigned);
+-		assert_d_eq(mallctl("tcache.create", &tis[i], &sz, NULL, 0), 0,
+-		    "Unexpected mallctl() failure, i=%u", i);
++		assert_d_eq(mallctl("tcache.create", (void *)&tis[i], &sz, NULL,
++		    0), 0, "Unexpected mallctl() failure, i=%u", i);
+ 	}
+ 
+ 	/* Flush empty tcaches. */
+ 	for (i = 0; i < NTCACHES; i++) {
+-		assert_d_eq(mallctl("tcache.flush", NULL, NULL, &tis[i],
++		assert_d_eq(mallctl("tcache.flush", NULL, NULL, (void *)&tis[i],
+ 		    sizeof(unsigned)), 0, "Unexpected mallctl() failure, i=%u",
+ 		    i);
+ 	}
+ 
+ 	/* Cache some allocations. */
+ 	for (i = 0; i < NTCACHES; i++) {
+ 		ps[i] = mallocx(psz, MALLOCX_TCACHE(tis[i]));
+ 		assert_ptr_not_null(ps[i], "Unexpected mallocx() failure, i=%u",
+@@ -316,107 +322,110 @@ TEST_BEGIN(test_tcache)
+ 		if (qs[i] == NULL)
+ 			qs[i] = ps[i];
+ 	}
+ 	for (i = 0; i < NTCACHES; i++)
+ 		dallocx(qs[i], MALLOCX_TCACHE(tis[i]));
+ 
+ 	/* Flush some non-empty tcaches. */
+ 	for (i = 0; i < NTCACHES/2; i++) {
+-		assert_d_eq(mallctl("tcache.flush", NULL, NULL, &tis[i],
++		assert_d_eq(mallctl("tcache.flush", NULL, NULL, (void *)&tis[i],
+ 		    sizeof(unsigned)), 0, "Unexpected mallctl() failure, i=%u",
+ 		    i);
+ 	}
+ 
+ 	/* Destroy tcaches. */
+ 	for (i = 0; i < NTCACHES; i++) {
+-		assert_d_eq(mallctl("tcache.destroy", NULL, NULL, &tis[i],
+-		    sizeof(unsigned)), 0, "Unexpected mallctl() failure, i=%u",
+-		    i);
++		assert_d_eq(mallctl("tcache.destroy", NULL, NULL,
++		    (void *)&tis[i], sizeof(unsigned)), 0,
++		    "Unexpected mallctl() failure, i=%u", i);
+ 	}
+ }
+ TEST_END
+ 
+ TEST_BEGIN(test_thread_arena)
+ {
+ 	unsigned arena_old, arena_new, narenas;
+ 	size_t sz = sizeof(unsigned);
+ 
+-	assert_d_eq(mallctl("arenas.narenas", &narenas, &sz, NULL, 0), 0,
+-	    "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("arenas.narenas", (void *)&narenas, &sz, NULL, 0),
++	    0, "Unexpected mallctl() failure");
+ 	assert_u_eq(narenas, opt_narenas, "Number of arenas incorrect");
+ 	arena_new = narenas - 1;
+-	assert_d_eq(mallctl("thread.arena", &arena_old, &sz, &arena_new,
+-	    sizeof(unsigned)), 0, "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("thread.arena", (void *)&arena_old, &sz,
++	    (void *)&arena_new, sizeof(unsigned)), 0,
++	    "Unexpected mallctl() failure");
+ 	arena_new = 0;
+-	assert_d_eq(mallctl("thread.arena", &arena_old, &sz, &arena_new,
+-	    sizeof(unsigned)), 0, "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("thread.arena", (void *)&arena_old, &sz,
++	    (void *)&arena_new, sizeof(unsigned)), 0,
++	    "Unexpected mallctl() failure");
+ }
+ TEST_END
+ 
+ TEST_BEGIN(test_arena_i_lg_dirty_mult)
+ {
+ 	ssize_t lg_dirty_mult, orig_lg_dirty_mult, prev_lg_dirty_mult;
+ 	size_t sz = sizeof(ssize_t);
+ 
+ 	test_skip_if(opt_purge != purge_mode_ratio);
+ 
+-	assert_d_eq(mallctl("arena.0.lg_dirty_mult", &orig_lg_dirty_mult, &sz,
+-	    NULL, 0), 0, "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("arena.0.lg_dirty_mult",
++	    (void *)&orig_lg_dirty_mult, &sz, NULL, 0), 0,
++	    "Unexpected mallctl() failure");
+ 
+ 	lg_dirty_mult = -2;
+ 	assert_d_eq(mallctl("arena.0.lg_dirty_mult", NULL, NULL,
+-	    &lg_dirty_mult, sizeof(ssize_t)), EFAULT,
++	    (void *)&lg_dirty_mult, sizeof(ssize_t)), EFAULT,
+ 	    "Unexpected mallctl() success");
+ 
+ 	lg_dirty_mult = (sizeof(size_t) << 3);
+ 	assert_d_eq(mallctl("arena.0.lg_dirty_mult", NULL, NULL,
+-	    &lg_dirty_mult, sizeof(ssize_t)), EFAULT,
++	    (void *)&lg_dirty_mult, sizeof(ssize_t)), EFAULT,
+ 	    "Unexpected mallctl() success");
+ 
+ 	for (prev_lg_dirty_mult = orig_lg_dirty_mult, lg_dirty_mult = -1;
+ 	    lg_dirty_mult < (ssize_t)(sizeof(size_t) << 3); prev_lg_dirty_mult
+ 	    = lg_dirty_mult, lg_dirty_mult++) {
+ 		ssize_t old_lg_dirty_mult;
+ 
+-		assert_d_eq(mallctl("arena.0.lg_dirty_mult", &old_lg_dirty_mult,
+-		    &sz, &lg_dirty_mult, sizeof(ssize_t)), 0,
+-		    "Unexpected mallctl() failure");
++		assert_d_eq(mallctl("arena.0.lg_dirty_mult",
++		    (void *)&old_lg_dirty_mult, &sz, (void *)&lg_dirty_mult,
++		    sizeof(ssize_t)), 0, "Unexpected mallctl() failure");
+ 		assert_zd_eq(old_lg_dirty_mult, prev_lg_dirty_mult,
+ 		    "Unexpected old arena.0.lg_dirty_mult");
+ 	}
+ }
+ TEST_END
+ 
+ TEST_BEGIN(test_arena_i_decay_time)
+ {
+ 	ssize_t decay_time, orig_decay_time, prev_decay_time;
+ 	size_t sz = sizeof(ssize_t);
+ 
+ 	test_skip_if(opt_purge != purge_mode_decay);
+ 
+-	assert_d_eq(mallctl("arena.0.decay_time", &orig_decay_time, &sz,
++	assert_d_eq(mallctl("arena.0.decay_time", (void *)&orig_decay_time, &sz,
+ 	    NULL, 0), 0, "Unexpected mallctl() failure");
+ 
+ 	decay_time = -2;
+ 	assert_d_eq(mallctl("arena.0.decay_time", NULL, NULL,
+-	    &decay_time, sizeof(ssize_t)), EFAULT,
++	    (void *)&decay_time, sizeof(ssize_t)), EFAULT,
+ 	    "Unexpected mallctl() success");
+ 
+ 	decay_time = 0x7fffffff;
+ 	assert_d_eq(mallctl("arena.0.decay_time", NULL, NULL,
+-	    &decay_time, sizeof(ssize_t)), 0,
++	    (void *)&decay_time, sizeof(ssize_t)), 0,
+ 	    "Unexpected mallctl() failure");
+ 
+ 	for (prev_decay_time = decay_time, decay_time = -1;
+ 	    decay_time < 20; prev_decay_time = decay_time, decay_time++) {
+ 		ssize_t old_decay_time;
+ 
+-		assert_d_eq(mallctl("arena.0.decay_time", &old_decay_time,
+-		    &sz, &decay_time, sizeof(ssize_t)), 0,
++		assert_d_eq(mallctl("arena.0.decay_time", (void *)&old_decay_time,
++		    &sz, (void *)&decay_time, sizeof(ssize_t)), 0,
+ 		    "Unexpected mallctl() failure");
+ 		assert_zd_eq(old_decay_time, prev_decay_time,
+ 		    "Unexpected old arena.0.decay_time");
+ 	}
+ }
+ TEST_END
+ 
+ TEST_BEGIN(test_arena_i_purge)
+@@ -424,18 +433,18 @@ TEST_BEGIN(test_arena_i_purge)
+ 	unsigned narenas;
+ 	size_t sz = sizeof(unsigned);
+ 	size_t mib[3];
+ 	size_t miblen = 3;
+ 
+ 	assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
+ 	    "Unexpected mallctl() failure");
+ 
+-	assert_d_eq(mallctl("arenas.narenas", &narenas, &sz, NULL, 0), 0,
+-	    "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("arenas.narenas", (void *)&narenas, &sz, NULL, 0),
++	    0, "Unexpected mallctl() failure");
+ 	assert_d_eq(mallctlnametomib("arena.0.purge", mib, &miblen), 0,
+ 	    "Unexpected mallctlnametomib() failure");
+ 	mib[1] = narenas;
+ 	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, NULL, 0), 0,
+ 	    "Unexpected mallctlbymib() failure");
+ }
+ TEST_END
+ 
+@@ -444,18 +453,18 @@ TEST_BEGIN(test_arena_i_decay)
+ 	unsigned narenas;
+ 	size_t sz = sizeof(unsigned);
+ 	size_t mib[3];
+ 	size_t miblen = 3;
+ 
+ 	assert_d_eq(mallctl("arena.0.decay", NULL, NULL, NULL, 0), 0,
+ 	    "Unexpected mallctl() failure");
+ 
+-	assert_d_eq(mallctl("arenas.narenas", &narenas, &sz, NULL, 0), 0,
+-	    "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("arenas.narenas", (void *)&narenas, &sz, NULL, 0),
++	    0, "Unexpected mallctl() failure");
+ 	assert_d_eq(mallctlnametomib("arena.0.decay", mib, &miblen), 0,
+ 	    "Unexpected mallctlnametomib() failure");
+ 	mib[1] = narenas;
+ 	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, NULL, 0), 0,
+ 	    "Unexpected mallctlbymib() failure");
+ }
+ TEST_END
+ 
+@@ -466,138 +475,142 @@ TEST_BEGIN(test_arena_i_dss)
+ 	size_t mib[3];
+ 	size_t miblen;
+ 
+ 	miblen = sizeof(mib)/sizeof(size_t);
+ 	assert_d_eq(mallctlnametomib("arena.0.dss", mib, &miblen), 0,
+ 	    "Unexpected mallctlnametomib() error");
+ 
+ 	dss_prec_new = "disabled";
+-	assert_d_eq(mallctlbymib(mib, miblen, &dss_prec_old, &sz, &dss_prec_new,
+-	    sizeof(dss_prec_new)), 0, "Unexpected mallctl() failure");
++	assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_old, &sz,
++	    (void *)&dss_prec_new, sizeof(dss_prec_new)), 0,
++	    "Unexpected mallctl() failure");
+ 	assert_str_ne(dss_prec_old, "primary",
+ 	    "Unexpected default for dss precedence");
+ 
+-	assert_d_eq(mallctlbymib(mib, miblen, &dss_prec_new, &sz, &dss_prec_old,
+-	    sizeof(dss_prec_old)), 0, "Unexpected mallctl() failure");
++	assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_new, &sz,
++	    (void *)&dss_prec_old, sizeof(dss_prec_old)), 0,
++	    "Unexpected mallctl() failure");
+ 
+-	assert_d_eq(mallctlbymib(mib, miblen, &dss_prec_old, &sz, NULL, 0), 0,
+-	    "Unexpected mallctl() failure");
++	assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_old, &sz, NULL,
++	    0), 0, "Unexpected mallctl() failure");
+ 	assert_str_ne(dss_prec_old, "primary",
+ 	    "Unexpected value for dss precedence");
+ 
+ 	mib[1] = narenas_total_get();
+ 	dss_prec_new = "disabled";
+-	assert_d_eq(mallctlbymib(mib, miblen, &dss_prec_old, &sz, &dss_prec_new,
+-	    sizeof(dss_prec_new)), 0, "Unexpected mallctl() failure");
++	assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_old, &sz,
++	    (void *)&dss_prec_new, sizeof(dss_prec_new)), 0,
++	    "Unexpected mallctl() failure");
+ 	assert_str_ne(dss_prec_old, "primary",
+ 	    "Unexpected default for dss precedence");
+ 
+-	assert_d_eq(mallctlbymib(mib, miblen, &dss_prec_new, &sz, &dss_prec_old,
+-	    sizeof(dss_prec_new)), 0, "Unexpected mallctl() failure");
++	assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_new, &sz,
++	    (void *)&dss_prec_old, sizeof(dss_prec_new)), 0,
++	    "Unexpected mallctl() failure");
+ 
+-	assert_d_eq(mallctlbymib(mib, miblen, &dss_prec_old, &sz, NULL, 0), 0,
+-	    "Unexpected mallctl() failure");
++	assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_old, &sz, NULL,
++	    0), 0, "Unexpected mallctl() failure");
+ 	assert_str_ne(dss_prec_old, "primary",
+ 	    "Unexpected value for dss precedence");
+ }
+ TEST_END
+ 
+ TEST_BEGIN(test_arenas_initialized)
+ {
+ 	unsigned narenas;
+ 	size_t sz = sizeof(narenas);
+ 
+-	assert_d_eq(mallctl("arenas.narenas", &narenas, &sz, NULL, 0), 0,
+-	    "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("arenas.narenas", (void *)&narenas, &sz, NULL, 0),
++	    0, "Unexpected mallctl() failure");
+ 	{
+ 		VARIABLE_ARRAY(bool, initialized, narenas);
+ 
+ 		sz = narenas * sizeof(bool);
+-		assert_d_eq(mallctl("arenas.initialized", initialized, &sz,
+-		    NULL, 0), 0, "Unexpected mallctl() failure");
++		assert_d_eq(mallctl("arenas.initialized", (void *)initialized,
++		    &sz, NULL, 0), 0, "Unexpected mallctl() failure");
+ 	}
+ }
+ TEST_END
+ 
+ TEST_BEGIN(test_arenas_lg_dirty_mult)
+ {
+ 	ssize_t lg_dirty_mult, orig_lg_dirty_mult, prev_lg_dirty_mult;
+ 	size_t sz = sizeof(ssize_t);
+ 
+ 	test_skip_if(opt_purge != purge_mode_ratio);
+ 
+-	assert_d_eq(mallctl("arenas.lg_dirty_mult", &orig_lg_dirty_mult, &sz,
+-	    NULL, 0), 0, "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("arenas.lg_dirty_mult", (void *)&orig_lg_dirty_mult,
++	    &sz, NULL, 0), 0, "Unexpected mallctl() failure");
+ 
+ 	lg_dirty_mult = -2;
+ 	assert_d_eq(mallctl("arenas.lg_dirty_mult", NULL, NULL,
+-	    &lg_dirty_mult, sizeof(ssize_t)), EFAULT,
++	    (void *)&lg_dirty_mult, sizeof(ssize_t)), EFAULT,
+ 	    "Unexpected mallctl() success");
+ 
+ 	lg_dirty_mult = (sizeof(size_t) << 3);
+ 	assert_d_eq(mallctl("arenas.lg_dirty_mult", NULL, NULL,
+-	    &lg_dirty_mult, sizeof(ssize_t)), EFAULT,
++	    (void *)&lg_dirty_mult, sizeof(ssize_t)), EFAULT,
+ 	    "Unexpected mallctl() success");
+ 
+ 	for (prev_lg_dirty_mult = orig_lg_dirty_mult, lg_dirty_mult = -1;
+ 	    lg_dirty_mult < (ssize_t)(sizeof(size_t) << 3); prev_lg_dirty_mult =
+ 	    lg_dirty_mult, lg_dirty_mult++) {
+ 		ssize_t old_lg_dirty_mult;
+ 
+-		assert_d_eq(mallctl("arenas.lg_dirty_mult", &old_lg_dirty_mult,
+-		    &sz, &lg_dirty_mult, sizeof(ssize_t)), 0,
+-		    "Unexpected mallctl() failure");
++		assert_d_eq(mallctl("arenas.lg_dirty_mult",
++		    (void *)&old_lg_dirty_mult, &sz, (void *)&lg_dirty_mult,
++		    sizeof(ssize_t)), 0, "Unexpected mallctl() failure");
+ 		assert_zd_eq(old_lg_dirty_mult, prev_lg_dirty_mult,
+ 		    "Unexpected old arenas.lg_dirty_mult");
+ 	}
+ }
+ TEST_END
+ 
+ TEST_BEGIN(test_arenas_decay_time)
+ {
+ 	ssize_t decay_time, orig_decay_time, prev_decay_time;
+ 	size_t sz = sizeof(ssize_t);
+ 
+ 	test_skip_if(opt_purge != purge_mode_decay);
+ 
+-	assert_d_eq(mallctl("arenas.decay_time", &orig_decay_time, &sz,
++	assert_d_eq(mallctl("arenas.decay_time", (void *)&orig_decay_time, &sz,
+ 	    NULL, 0), 0, "Unexpected mallctl() failure");
+ 
+ 	decay_time = -2;
+ 	assert_d_eq(mallctl("arenas.decay_time", NULL, NULL,
+-	    &decay_time, sizeof(ssize_t)), EFAULT,
++	    (void *)&decay_time, sizeof(ssize_t)), EFAULT,
+ 	    "Unexpected mallctl() success");
+ 
+ 	decay_time = 0x7fffffff;
+ 	assert_d_eq(mallctl("arenas.decay_time", NULL, NULL,
+-	    &decay_time, sizeof(ssize_t)), 0,
++	    (void *)&decay_time, sizeof(ssize_t)), 0,
+ 	    "Expected mallctl() failure");
+ 
+ 	for (prev_decay_time = decay_time, decay_time = -1;
+ 	    decay_time < 20; prev_decay_time = decay_time, decay_time++) {
+ 		ssize_t old_decay_time;
+ 
+-		assert_d_eq(mallctl("arenas.decay_time", &old_decay_time,
+-		    &sz, &decay_time, sizeof(ssize_t)), 0,
+-		    "Unexpected mallctl() failure");
++		assert_d_eq(mallctl("arenas.decay_time",
++		    (void *)&old_decay_time, &sz, (void *)&decay_time,
++		    sizeof(ssize_t)), 0, "Unexpected mallctl() failure");
+ 		assert_zd_eq(old_decay_time, prev_decay_time,
+ 		    "Unexpected old arenas.decay_time");
+ 	}
+ }
+ TEST_END
+ 
+ TEST_BEGIN(test_arenas_constants)
+ {
+ 
+ #define	TEST_ARENAS_CONSTANT(t, name, expected) do {			\
+ 	t name;								\
+ 	size_t sz = sizeof(t);						\
+-	assert_d_eq(mallctl("arenas."#name, &name, &sz, NULL, 0), 0,	\
+-	    "Unexpected mallctl() failure");				\
++	assert_d_eq(mallctl("arenas."#name, (void *)&name, &sz, NULL,	\
++	    0), 0, "Unexpected mallctl() failure");			\
+ 	assert_zu_eq(name, expected, "Incorrect "#name" size");		\
+ } while (0)
+ 
+ 	TEST_ARENAS_CONSTANT(size_t, quantum, QUANTUM);
+ 	TEST_ARENAS_CONSTANT(size_t, page, PAGE);
+ 	TEST_ARENAS_CONSTANT(unsigned, nbins, NBINS);
+ 	TEST_ARENAS_CONSTANT(unsigned, nlruns, nlclasses);
+ 	TEST_ARENAS_CONSTANT(unsigned, nhchunks, nhclasses);
+@@ -607,18 +620,18 @@ TEST_BEGIN(test_arenas_constants)
+ TEST_END
+ 
+ TEST_BEGIN(test_arenas_bin_constants)
+ {
+ 
+ #define	TEST_ARENAS_BIN_CONSTANT(t, name, expected) do {		\
+ 	t name;								\
+ 	size_t sz = sizeof(t);						\
+-	assert_d_eq(mallctl("arenas.bin.0."#name, &name, &sz, NULL, 0),	\
+-	    0, "Unexpected mallctl() failure");				\
++	assert_d_eq(mallctl("arenas.bin.0."#name, (void *)&name, &sz,	\
++	    NULL, 0), 0, "Unexpected mallctl() failure");		\
+ 	assert_zu_eq(name, expected, "Incorrect "#name" size");		\
+ } while (0)
+ 
+ 	TEST_ARENAS_BIN_CONSTANT(size_t, size, arena_bin_info[0].reg_size);
+ 	TEST_ARENAS_BIN_CONSTANT(uint32_t, nregs, arena_bin_info[0].nregs);
+ 	TEST_ARENAS_BIN_CONSTANT(size_t, run_size, arena_bin_info[0].run_size);
+ 
+ #undef TEST_ARENAS_BIN_CONSTANT
+@@ -626,70 +639,70 @@ TEST_BEGIN(test_arenas_bin_constants)
+ TEST_END
+ 
+ TEST_BEGIN(test_arenas_lrun_constants)
+ {
+ 
+ #define	TEST_ARENAS_LRUN_CONSTANT(t, name, expected) do {		\
+ 	t name;								\
+ 	size_t sz = sizeof(t);						\
+-	assert_d_eq(mallctl("arenas.lrun.0."#name, &name, &sz, NULL,	\
+-	    0), 0, "Unexpected mallctl() failure");			\
++	assert_d_eq(mallctl("arenas.lrun.0."#name, (void *)&name, &sz,	\
++	    NULL, 0), 0, "Unexpected mallctl() failure");		\
+ 	assert_zu_eq(name, expected, "Incorrect "#name" size");		\
+ } while (0)
+ 
+ 	TEST_ARENAS_LRUN_CONSTANT(size_t, size, LARGE_MINCLASS);
+ 
+ #undef TEST_ARENAS_LRUN_CONSTANT
+ }
+ TEST_END
+ 
+ TEST_BEGIN(test_arenas_hchunk_constants)
+ {
+ 
+ #define	TEST_ARENAS_HCHUNK_CONSTANT(t, name, expected) do {		\
+ 	t name;								\
+ 	size_t sz = sizeof(t);						\
+-	assert_d_eq(mallctl("arenas.hchunk.0."#name, &name, &sz, NULL,	\
+-	    0), 0, "Unexpected mallctl() failure");			\
++	assert_d_eq(mallctl("arenas.hchunk.0."#name, (void *)&name,	\
++	    &sz, NULL, 0), 0, "Unexpected mallctl() failure");		\
+ 	assert_zu_eq(name, expected, "Incorrect "#name" size");		\
+ } while (0)
+ 
+ 	TEST_ARENAS_HCHUNK_CONSTANT(size_t, size, chunksize);
+ 
+ #undef TEST_ARENAS_HCHUNK_CONSTANT
+ }
+ TEST_END
+ 
+ TEST_BEGIN(test_arenas_extend)
+ {
+ 	unsigned narenas_before, arena, narenas_after;
+ 	size_t sz = sizeof(unsigned);
+ 
+-	assert_d_eq(mallctl("arenas.narenas", &narenas_before, &sz, NULL, 0), 0,
++	assert_d_eq(mallctl("arenas.narenas", (void *)&narenas_before, &sz,
++	    NULL, 0), 0, "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("arenas.extend", (void *)&arena, &sz, NULL, 0), 0,
+ 	    "Unexpected mallctl() failure");
+-	assert_d_eq(mallctl("arenas.extend", &arena, &sz, NULL, 0), 0,
+-	    "Unexpected mallctl() failure");
+-	assert_d_eq(mallctl("arenas.narenas", &narenas_after, &sz, NULL, 0), 0,
+-	    "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("arenas.narenas", (void *)&narenas_after, &sz, NULL,
++	    0), 0, "Unexpected mallctl() failure");
+ 
+ 	assert_u_eq(narenas_before+1, narenas_after,
+ 	    "Unexpected number of arenas before versus after extension");
+ 	assert_u_eq(arena, narenas_after-1, "Unexpected arena index");
+ }
+ TEST_END
+ 
+ TEST_BEGIN(test_stats_arenas)
+ {
+ 
+ #define	TEST_STATS_ARENAS(t, name) do {					\
+ 	t name;								\
+ 	size_t sz = sizeof(t);						\
+-	assert_d_eq(mallctl("stats.arenas.0."#name, &name, &sz, NULL,	\
+-	    0), 0, "Unexpected mallctl() failure");			\
++	assert_d_eq(mallctl("stats.arenas.0."#name, (void *)&name, &sz,	\
++	    NULL, 0), 0, "Unexpected mallctl() failure");		\
+ } while (0)
+ 
+ 	TEST_STATS_ARENAS(unsigned, nthreads);
+ 	TEST_STATS_ARENAS(const char *, dss);
+ 	TEST_STATS_ARENAS(ssize_t, lg_dirty_mult);
+ 	TEST_STATS_ARENAS(ssize_t, decay_time);
+ 	TEST_STATS_ARENAS(size_t, pactive);
+ 	TEST_STATS_ARENAS(size_t, pdirty);
+diff --git a/memory/jemalloc/src/test/unit/pack.c b/memory/jemalloc/src/test/unit/pack.c
+new file mode 100644
+--- /dev/null
++++ b/memory/jemalloc/src/test/unit/pack.c
+@@ -0,0 +1,206 @@
++#include "test/jemalloc_test.h"
++
++const char *malloc_conf =
++    /* Use smallest possible chunk size. */
++    "lg_chunk:0"
++    /* Immediately purge to minimize fragmentation. */
++    ",lg_dirty_mult:-1"
++    ",decay_time:-1"
++    ;
++
++/*
++ * Size class that is a divisor of the page size, ideally 4+ regions per run.
++ */
++#if LG_PAGE <= 14
++#define	SZ	(ZU(1) << (LG_PAGE - 2))
++#else
++#define	SZ	4096
++#endif
++
++/*
++ * Number of chunks to consume at high water mark.  Should be at least 2 so that
++ * if mmap()ed memory grows downward, downward growth of mmap()ed memory is
++ * tested.
++ */
++#define	NCHUNKS	8
++
++static unsigned
++binind_compute(void)
++{
++	size_t sz;
++	unsigned nbins, i;
++
++	sz = sizeof(nbins);
++	assert_d_eq(mallctl("arenas.nbins", (void *)&nbins, &sz, NULL, 0), 0,
++	    "Unexpected mallctl failure");
++
++	for (i = 0; i < nbins; i++) {
++		size_t mib[4];
++		size_t miblen = sizeof(mib)/sizeof(size_t);
++		size_t size;
++
++		assert_d_eq(mallctlnametomib("arenas.bin.0.size", mib,
++		    &miblen), 0, "Unexpected mallctlnametomb failure");
++		mib[2] = (size_t)i;
++
++		sz = sizeof(size);
++		assert_d_eq(mallctlbymib(mib, miblen, (void *)&size, &sz, NULL,
++		    0), 0, "Unexpected mallctlbymib failure");
++		if (size == SZ)
++			return (i);
++	}
++
++	test_fail("Unable to compute nregs_per_run");
++	return (0);
++}
++
++static size_t
++nregs_per_run_compute(void)
++{
++	uint32_t nregs;
++	size_t sz;
++	unsigned binind = binind_compute();
++	size_t mib[4];
++	size_t miblen = sizeof(mib)/sizeof(size_t);
++
++	assert_d_eq(mallctlnametomib("arenas.bin.0.nregs", mib, &miblen), 0,
++	    "Unexpected mallctlnametomb failure");
++	mib[2] = (size_t)binind;
++	sz = sizeof(nregs);
++	assert_d_eq(mallctlbymib(mib, miblen, (void *)&nregs, &sz, NULL,
++	    0), 0, "Unexpected mallctlbymib failure");
++	return (nregs);
++}
++
++static size_t
++npages_per_run_compute(void)
++{
++	size_t sz;
++	unsigned binind = binind_compute();
++	size_t mib[4];
++	size_t miblen = sizeof(mib)/sizeof(size_t);
++	size_t run_size;
++
++	assert_d_eq(mallctlnametomib("arenas.bin.0.run_size", mib, &miblen), 0,
++	    "Unexpected mallctlnametomb failure");
++	mib[2] = (size_t)binind;
++	sz = sizeof(run_size);
++	assert_d_eq(mallctlbymib(mib, miblen, (void *)&run_size, &sz, NULL,
++	    0), 0, "Unexpected mallctlbymib failure");
++	return (run_size >> LG_PAGE);
++}
++
++static size_t
++npages_per_chunk_compute(void)
++{
++
++	return ((chunksize >> LG_PAGE) - map_bias);
++}
++
++static size_t
++nruns_per_chunk_compute(void)
++{
++
++	return (npages_per_chunk_compute() / npages_per_run_compute());
++}
++
++static unsigned
++arenas_extend_mallctl(void)
++{
++	unsigned arena_ind;
++	size_t sz;
++
++	sz = sizeof(arena_ind);
++	assert_d_eq(mallctl("arenas.extend", (void *)&arena_ind, &sz, NULL, 0),
++	    0, "Error in arenas.extend");
++
++	return (arena_ind);
++}
++
++static void
++arena_reset_mallctl(unsigned arena_ind)
++{
++	size_t mib[3];
++	size_t miblen = sizeof(mib)/sizeof(size_t);
++
++	assert_d_eq(mallctlnametomib("arena.0.reset", mib, &miblen), 0,
++	    "Unexpected mallctlnametomib() failure");
++	mib[1] = (size_t)arena_ind;
++	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, NULL, 0), 0,
++	    "Unexpected mallctlbymib() failure");
++}
++
++TEST_BEGIN(test_pack)
++{
++	unsigned arena_ind = arenas_extend_mallctl();
++	size_t nregs_per_run = nregs_per_run_compute();
++	size_t nruns_per_chunk = nruns_per_chunk_compute();
++	size_t nruns = nruns_per_chunk * NCHUNKS;
++	size_t nregs = nregs_per_run * nruns;
++	VARIABLE_ARRAY(void *, ptrs, nregs);
++	size_t i, j, offset;
++
++	/* Fill matrix. */
++	for (i = offset = 0; i < nruns; i++) {
++		for (j = 0; j < nregs_per_run; j++) {
++			void *p = mallocx(SZ, MALLOCX_ARENA(arena_ind) |
++			    MALLOCX_TCACHE_NONE);
++			assert_ptr_not_null(p,
++			    "Unexpected mallocx(%zu, MALLOCX_ARENA(%u) |"
++			    " MALLOCX_TCACHE_NONE) failure, run=%zu, reg=%zu",
++			    SZ, arena_ind, i, j);
++			ptrs[(i * nregs_per_run) + j] = p;
++		}
++	}
++
++	/*
++	 * Free all but one region of each run, but rotate which region is
++	 * preserved, so that subsequent allocations exercise the within-run
++	 * layout policy.
++	 */
++	offset = 0;
++	for (i = offset = 0;
++	    i < nruns;
++	    i++, offset = (offset + 1) % nregs_per_run) {
++		for (j = 0; j < nregs_per_run; j++) {
++			void *p = ptrs[(i * nregs_per_run) + j];
++			if (offset == j)
++				continue;
++			dallocx(p, MALLOCX_ARENA(arena_ind) |
++			    MALLOCX_TCACHE_NONE);
++		}
++	}
++
++	/*
++	 * Logically refill matrix, skipping preserved regions and verifying
++	 * that the matrix is unmodified.
++	 */
++	offset = 0;
++	for (i = offset = 0;
++	    i < nruns;
++	    i++, offset = (offset + 1) % nregs_per_run) {
++		for (j = 0; j < nregs_per_run; j++) {
++			void *p;
++
++			if (offset == j)
++				continue;
++			p = mallocx(SZ, MALLOCX_ARENA(arena_ind) |
++			    MALLOCX_TCACHE_NONE);
++			assert_ptr_eq(p, ptrs[(i * nregs_per_run) + j],
++			    "Unexpected refill discrepancy, run=%zu, reg=%zu\n",
++			    i, j);
++		}
++	}
++
++	/* Clean up. */
++	arena_reset_mallctl(arena_ind);
++}
++TEST_END
++
++int
++main(void)
++{
++
++	return (test(
++	    test_pack));
++}
+diff --git a/memory/jemalloc/src/test/unit/pages.c b/memory/jemalloc/src/test/unit/pages.c
+new file mode 100644
+--- /dev/null
++++ b/memory/jemalloc/src/test/unit/pages.c
+@@ -0,0 +1,27 @@
++#include "test/jemalloc_test.h"
++
++TEST_BEGIN(test_pages_huge)
++{
++	bool commit;
++	void *pages;
++
++	commit = true;
++	pages = pages_map(NULL, PAGE, &commit);
++	assert_ptr_not_null(pages, "Unexpected pages_map() error");
++
++	assert_false(pages_huge(pages, PAGE),
++	    "Unexpected pages_huge() result");
++	assert_false(pages_nohuge(pages, PAGE),
++	    "Unexpected pages_nohuge() result");
++
++	pages_unmap(pages, PAGE);
++}
++TEST_END
++
++int
++main(void)
++{
++
++	return (test(
++	    test_pages_huge));
++}
+diff --git a/memory/jemalloc/src/test/unit/prof_accum.c b/memory/jemalloc/src/test/unit/prof_accum.c
+--- a/memory/jemalloc/src/test/unit/prof_accum.c
++++ b/memory/jemalloc/src/test/unit/prof_accum.c
+@@ -63,18 +63,19 @@ TEST_BEGIN(test_idump)
+ 	bool active;
+ 	thd_t thds[NTHREADS];
+ 	unsigned thd_args[NTHREADS];
+ 	unsigned i;
+ 
+ 	test_skip_if(!config_prof);
+ 
+ 	active = true;
+-	assert_d_eq(mallctl("prof.active", NULL, NULL, &active, sizeof(active)),
+-	    0, "Unexpected mallctl failure while activating profiling");
++	assert_d_eq(mallctl("prof.active", NULL, NULL, (void *)&active,
++	    sizeof(active)), 0,
++	    "Unexpected mallctl failure while activating profiling");
+ 
+ 	prof_dump_open = prof_dump_open_intercept;
+ 
+ 	for (i = 0; i < NTHREADS; i++) {
+ 		thd_args[i] = i;
+ 		thd_create(&thds[i], thd_start, (void *)&thd_args[i]);
+ 	}
+ 	for (i = 0; i < NTHREADS; i++)
+diff --git a/memory/jemalloc/src/test/unit/prof_active.c b/memory/jemalloc/src/test/unit/prof_active.c
+--- a/memory/jemalloc/src/test/unit/prof_active.c
++++ b/memory/jemalloc/src/test/unit/prof_active.c
+@@ -7,31 +7,32 @@ const char *malloc_conf =
+ 
+ static void
+ mallctl_bool_get(const char *name, bool expected, const char *func, int line)
+ {
+ 	bool old;
+ 	size_t sz;
+ 
+ 	sz = sizeof(old);
+-	assert_d_eq(mallctl(name, &old, &sz, NULL, 0), 0,
++	assert_d_eq(mallctl(name, (void *)&old, &sz, NULL, 0), 0,
+ 	    "%s():%d: Unexpected mallctl failure reading %s", func, line, name);
+ 	assert_b_eq(old, expected, "%s():%d: Unexpected %s value", func, line,
+ 	    name);
+ }
+ 
+ static void
+ mallctl_bool_set(const char *name, bool old_expected, bool val_new,
+     const char *func, int line)
+ {
+ 	bool old;
+ 	size_t sz;
+ 
+ 	sz = sizeof(old);
+-	assert_d_eq(mallctl(name, &old, &sz, &val_new, sizeof(val_new)), 0,
++	assert_d_eq(mallctl(name, (void *)&old, &sz, (void *)&val_new,
++	    sizeof(val_new)), 0,
+ 	    "%s():%d: Unexpected mallctl failure reading/writing %s", func,
+ 	    line, name);
+ 	assert_b_eq(old, old_expected, "%s():%d: Unexpected %s value", func,
+ 	    line, name);
+ }
+ 
+ static void
+ mallctl_prof_active_get_impl(bool prof_active_old_expected, const char *func,
+diff --git a/memory/jemalloc/src/test/unit/prof_gdump.c b/memory/jemalloc/src/test/unit/prof_gdump.c
+--- a/memory/jemalloc/src/test/unit/prof_gdump.c
++++ b/memory/jemalloc/src/test/unit/prof_gdump.c
+@@ -23,46 +23,47 @@ TEST_BEGIN(test_gdump)
+ {
+ 	bool active, gdump, gdump_old;
+ 	void *p, *q, *r, *s;
+ 	size_t sz;
+ 
+ 	test_skip_if(!config_prof);
+ 
+ 	active = true;
+-	assert_d_eq(mallctl("prof.active", NULL, NULL, &active, sizeof(active)),
+-	    0, "Unexpected mallctl failure while activating profiling");
++	assert_d_eq(mallctl("prof.active", NULL, NULL, (void *)&active,
++	    sizeof(active)), 0,
++	    "Unexpected mallctl failure while activating profiling");
+ 
+ 	prof_dump_open = prof_dump_open_intercept;
+ 
+ 	did_prof_dump_open = false;
+ 	p = mallocx(chunksize, 0);
+ 	assert_ptr_not_null(p, "Unexpected mallocx() failure");
+ 	assert_true(did_prof_dump_open, "Expected a profile dump");
+ 
+ 	did_prof_dump_open = false;
+ 	q = mallocx(chunksize, 0);
+ 	assert_ptr_not_null(q, "Unexpected mallocx() failure");
+ 	assert_true(did_prof_dump_open, "Expected a profile dump");
+ 
+ 	gdump = false;
+ 	sz = sizeof(gdump_old);
+-	assert_d_eq(mallctl("prof.gdump", &gdump_old, &sz, &gdump,
+-	    sizeof(gdump)), 0,
++	assert_d_eq(mallctl("prof.gdump", (void *)&gdump_old, &sz,
++	    (void *)&gdump, sizeof(gdump)), 0,
+ 	    "Unexpected mallctl failure while disabling prof.gdump");
+ 	assert(gdump_old);
+ 	did_prof_dump_open = false;
+ 	r = mallocx(chunksize, 0);
+ 	assert_ptr_not_null(q, "Unexpected mallocx() failure");
+ 	assert_false(did_prof_dump_open, "Unexpected profile dump");
+ 
+ 	gdump = true;
+ 	sz = sizeof(gdump_old);
+-	assert_d_eq(mallctl("prof.gdump", &gdump_old, &sz, &gdump,
+-	    sizeof(gdump)), 0,
++	assert_d_eq(mallctl("prof.gdump", (void *)&gdump_old, &sz,
++	    (void *)&gdump, sizeof(gdump)), 0,
+ 	    "Unexpected mallctl failure while enabling prof.gdump");
+ 	assert(!gdump_old);
+ 	did_prof_dump_open = false;
+ 	s = mallocx(chunksize, 0);
+ 	assert_ptr_not_null(q, "Unexpected mallocx() failure");
+ 	assert_true(did_prof_dump_open, "Expected a profile dump");
+ 
+ 	dallocx(p, 0);
+diff --git a/memory/jemalloc/src/test/unit/prof_idump.c b/memory/jemalloc/src/test/unit/prof_idump.c
+--- a/memory/jemalloc/src/test/unit/prof_idump.c
++++ b/memory/jemalloc/src/test/unit/prof_idump.c
+@@ -24,18 +24,19 @@ prof_dump_open_intercept(bool propagate_
+ TEST_BEGIN(test_idump)
+ {
+ 	bool active;
+ 	void *p;
+ 
+ 	test_skip_if(!config_prof);
+ 
+ 	active = true;
+-	assert_d_eq(mallctl("prof.active", NULL, NULL, &active, sizeof(active)),
+-	    0, "Unexpected mallctl failure while activating profiling");
++	assert_d_eq(mallctl("prof.active", NULL, NULL, (void *)&active,
++	    sizeof(active)), 0,
++	    "Unexpected mallctl failure while activating profiling");
+ 
+ 	prof_dump_open = prof_dump_open_intercept;
+ 
+ 	did_prof_dump_open = false;
+ 	p = mallocx(1, 0);
+ 	assert_ptr_not_null(p, "Unexpected mallocx() failure");
+ 	dallocx(p, 0);
+ 	assert_true(did_prof_dump_open, "Expected a profile dump");
+diff --git a/memory/jemalloc/src/test/unit/prof_reset.c b/memory/jemalloc/src/test/unit/prof_reset.c
+--- a/memory/jemalloc/src/test/unit/prof_reset.c
++++ b/memory/jemalloc/src/test/unit/prof_reset.c
+@@ -15,52 +15,53 @@ prof_dump_open_intercept(bool propagate_
+ 
+ 	return (fd);
+ }
+ 
+ static void
+ set_prof_active(bool active)
+ {
+ 
+-	assert_d_eq(mallctl("prof.active", NULL, NULL, &active, sizeof(active)),
+-	    0, "Unexpected mallctl failure");
++	assert_d_eq(mallctl("prof.active", NULL, NULL, (void *)&active,
++	    sizeof(active)), 0, "Unexpected mallctl failure");
+ }
+ 
+ static size_t
+ get_lg_prof_sample(void)
+ {
+ 	size_t lg_prof_sample;
+ 	size_t sz = sizeof(size_t);
+ 
+-	assert_d_eq(mallctl("prof.lg_sample", &lg_prof_sample, &sz, NULL, 0), 0,
++	assert_d_eq(mallctl("prof.lg_sample", (void *)&lg_prof_sample, &sz,
++	    NULL, 0), 0,
+ 	    "Unexpected mallctl failure while reading profiling sample rate");
+ 	return (lg_prof_sample);
+ }
+ 
+ static void
+ do_prof_reset(size_t lg_prof_sample)
+ {
+ 	assert_d_eq(mallctl("prof.reset", NULL, NULL,
+-	    &lg_prof_sample, sizeof(size_t)), 0,
++	    (void *)&lg_prof_sample, sizeof(size_t)), 0,
+ 	    "Unexpected mallctl failure while resetting profile data");
+ 	assert_zu_eq(lg_prof_sample, get_lg_prof_sample(),
+ 	    "Expected profile sample rate change");
+ }
+ 
+ TEST_BEGIN(test_prof_reset_basic)
+ {
+ 	size_t lg_prof_sample_orig, lg_prof_sample, lg_prof_sample_next;
+ 	size_t sz;
+ 	unsigned i;
+ 
+ 	test_skip_if(!config_prof);
+ 
+ 	sz = sizeof(size_t);
+-	assert_d_eq(mallctl("opt.lg_prof_sample", &lg_prof_sample_orig, &sz,
+-	    NULL, 0), 0,
++	assert_d_eq(mallctl("opt.lg_prof_sample", (void *)&lg_prof_sample_orig,
++	    &sz, NULL, 0), 0,
+ 	    "Unexpected mallctl failure while reading profiling sample rate");
+ 	assert_zu_eq(lg_prof_sample_orig, 0,
+ 	    "Unexpected profiling sample rate");
+ 	lg_prof_sample = get_lg_prof_sample();
+ 	assert_zu_eq(lg_prof_sample_orig, lg_prof_sample,
+ 	    "Unexpected disagreement between \"opt.lg_prof_sample\" and "
+ 	    "\"prof.lg_sample\"");
+ 
+diff --git a/memory/jemalloc/src/test/unit/prof_thread_name.c b/memory/jemalloc/src/test/unit/prof_thread_name.c
+--- a/memory/jemalloc/src/test/unit/prof_thread_name.c
++++ b/memory/jemalloc/src/test/unit/prof_thread_name.c
+@@ -7,32 +7,33 @@ const char *malloc_conf = "prof:true,pro
+ static void
+ mallctl_thread_name_get_impl(const char *thread_name_expected, const char *func,
+     int line)
+ {
+ 	const char *thread_name_old;
+ 	size_t sz;
+ 
+ 	sz = sizeof(thread_name_old);
+-	assert_d_eq(mallctl("thread.prof.name", &thread_name_old, &sz, NULL, 0),
+-	    0, "%s():%d: Unexpected mallctl failure reading thread.prof.name",
++	assert_d_eq(mallctl("thread.prof.name", (void *)&thread_name_old, &sz,
++	    NULL, 0), 0,
++	    "%s():%d: Unexpected mallctl failure reading thread.prof.name",
+ 	    func, line);
+ 	assert_str_eq(thread_name_old, thread_name_expected,
+ 	    "%s():%d: Unexpected thread.prof.name value", func, line);
+ }
+ #define	mallctl_thread_name_get(a)					\
+ 	mallctl_thread_name_get_impl(a, __func__, __LINE__)
+ 
+ static void
+ mallctl_thread_name_set_impl(const char *thread_name, const char *func,
+     int line)
+ {
+ 
+-	assert_d_eq(mallctl("thread.prof.name", NULL, NULL, &thread_name,
+-	    sizeof(thread_name)), 0,
++	assert_d_eq(mallctl("thread.prof.name", NULL, NULL,
++	    (void *)&thread_name, sizeof(thread_name)), 0,
+ 	    "%s():%d: Unexpected mallctl failure reading thread.prof.name",
+ 	    func, line);
+ 	mallctl_thread_name_get_impl(thread_name, func, line);
+ }
+ #define	mallctl_thread_name_set(a)					\
+ 	mallctl_thread_name_set_impl(a, __func__, __LINE__)
+ 
+ TEST_BEGIN(test_prof_thread_name_validation)
+@@ -41,36 +42,37 @@ TEST_BEGIN(test_prof_thread_name_validat
+ 
+ 	test_skip_if(!config_prof);
+ 
+ 	mallctl_thread_name_get("");
+ 	mallctl_thread_name_set("hi there");
+ 
+ 	/* NULL input shouldn't be allowed. */
+ 	thread_name = NULL;
+-	assert_d_eq(mallctl("thread.prof.name", NULL, NULL, &thread_name,
+-	    sizeof(thread_name)), EFAULT,
++	assert_d_eq(mallctl("thread.prof.name", NULL, NULL,
++	    (void *)&thread_name, sizeof(thread_name)), EFAULT,
+ 	    "Unexpected mallctl result writing \"%s\" to thread.prof.name",
+ 	    thread_name);
+ 
+ 	/* '\n' shouldn't be allowed. */
+ 	thread_name = "hi\nthere";
+-	assert_d_eq(mallctl("thread.prof.name", NULL, NULL, &thread_name,
+-	    sizeof(thread_name)), EFAULT,
++	assert_d_eq(mallctl("thread.prof.name", NULL, NULL,
++	    (void *)&thread_name, sizeof(thread_name)), EFAULT,
+ 	    "Unexpected mallctl result writing \"%s\" to thread.prof.name",
+ 	    thread_name);
+ 
+ 	/* Simultaneous read/write shouldn't be allowed. */
+ 	{
+ 		const char *thread_name_old;
+ 		size_t sz;
+ 
+ 		sz = sizeof(thread_name_old);
+-		assert_d_eq(mallctl("thread.prof.name", &thread_name_old, &sz,
+-		    &thread_name, sizeof(thread_name)), EPERM,
++		assert_d_eq(mallctl("thread.prof.name",
++		    (void *)&thread_name_old, &sz, (void *)&thread_name,
++		    sizeof(thread_name)), EPERM,
+ 		    "Unexpected mallctl result writing \"%s\" to "
+ 		    "thread.prof.name", thread_name);
+ 	}
+ 
+ 	mallctl_thread_name_set("");
+ }
+ TEST_END
+ 
+diff --git a/memory/jemalloc/src/test/unit/run_quantize.c b/memory/jemalloc/src/test/unit/run_quantize.c
+--- a/memory/jemalloc/src/test/unit/run_quantize.c
++++ b/memory/jemalloc/src/test/unit/run_quantize.c
+@@ -8,26 +8,26 @@ TEST_BEGIN(test_small_run_size)
+ 	size_t miblen = sizeof(mib) / sizeof(size_t);
+ 
+ 	/*
+ 	 * Iterate over all small size classes, get their run sizes, and verify
+ 	 * that the quantized size is the same as the run size.
+ 	 */
+ 
+ 	sz = sizeof(unsigned);
+-	assert_d_eq(mallctl("arenas.nbins", &nbins, &sz, NULL, 0), 0,
++	assert_d_eq(mallctl("arenas.nbins", (void *)&nbins, &sz, NULL, 0), 0,
+ 	    "Unexpected mallctl failure");
+ 
+ 	assert_d_eq(mallctlnametomib("arenas.bin.0.run_size", mib, &miblen), 0,
+ 	    "Unexpected mallctlnametomib failure");
+ 	for (i = 0; i < nbins; i++) {
+ 		mib[2] = i;
+ 		sz = sizeof(size_t);
+-		assert_d_eq(mallctlbymib(mib, miblen, &run_size, &sz, NULL, 0),
+-		    0, "Unexpected mallctlbymib failure");
++		assert_d_eq(mallctlbymib(mib, miblen, (void *)&run_size, &sz,
++		    NULL, 0), 0, "Unexpected mallctlbymib failure");
+ 		assert_zu_eq(run_size, run_quantize_floor(run_size),
+ 		    "Small run quantization should be a no-op (run_size=%zu)",
+ 		    run_size);
+ 		assert_zu_eq(run_size, run_quantize_ceil(run_size),
+ 		    "Small run quantization should be a no-op (run_size=%zu)",
+ 		    run_size);
+ 	}
+ }
+@@ -42,32 +42,32 @@ TEST_BEGIN(test_large_run_size)
+ 	size_t miblen = sizeof(mib) / sizeof(size_t);
+ 
+ 	/*
+ 	 * Iterate over all large size classes, get their run sizes, and verify
+ 	 * that the quantized size is the same as the run size.
+ 	 */
+ 
+ 	sz = sizeof(bool);
+-	assert_d_eq(mallctl("config.cache_oblivious", &cache_oblivious, &sz,
+-	    NULL, 0), 0, "Unexpected mallctl failure");
++	assert_d_eq(mallctl("config.cache_oblivious", (void *)&cache_oblivious,
++	    &sz, NULL, 0), 0, "Unexpected mallctl failure");
+ 
+ 	sz = sizeof(unsigned);
+-	assert_d_eq(mallctl("arenas.nlruns", &nlruns, &sz, NULL, 0), 0,
++	assert_d_eq(mallctl("arenas.nlruns", (void *)&nlruns, &sz, NULL, 0), 0,
+ 	    "Unexpected mallctl failure");
+ 
+ 	assert_d_eq(mallctlnametomib("arenas.lrun.0.size", mib, &miblen), 0,
+ 	    "Unexpected mallctlnametomib failure");
+ 	for (i = 0; i < nlruns; i++) {
+ 		size_t lrun_size, run_size, floor, ceil;
+ 
+ 		mib[2] = i;
+ 		sz = sizeof(size_t);
+-		assert_d_eq(mallctlbymib(mib, miblen, &lrun_size, &sz, NULL, 0),
+-		    0, "Unexpected mallctlbymib failure");
++		assert_d_eq(mallctlbymib(mib, miblen, (void *)&lrun_size, &sz,
++		    NULL, 0), 0, "Unexpected mallctlbymib failure");
+ 		run_size = cache_oblivious ? lrun_size + PAGE : lrun_size;
+ 		floor = run_quantize_floor(run_size);
+ 		ceil = run_quantize_ceil(run_size);
+ 
+ 		assert_zu_eq(run_size, floor,
+ 		    "Large run quantization should be a no-op for precise "
+ 		    "size (lrun_size=%zu, run_size=%zu)", lrun_size, run_size);
+ 		assert_zu_eq(run_size, ceil,
+@@ -97,21 +97,21 @@ TEST_BEGIN(test_monotonic)
+ 	size_t sz, floor_prev, ceil_prev;
+ 
+ 	/*
+ 	 * Iterate over all run sizes and verify that
+ 	 * run_quantize_{floor,ceil}() are monotonic.
+ 	 */
+ 
+ 	sz = sizeof(unsigned);
+-	assert_d_eq(mallctl("arenas.nbins", &nbins, &sz, NULL, 0), 0,
++	assert_d_eq(mallctl("arenas.nbins", (void *)&nbins, &sz, NULL, 0), 0,
+ 	    "Unexpected mallctl failure");
+ 
+ 	sz = sizeof(unsigned);
+-	assert_d_eq(mallctl("arenas.nlruns", &nlruns, &sz, NULL, 0), 0,
++	assert_d_eq(mallctl("arenas.nlruns", (void *)&nlruns, &sz, NULL, 0), 0,
+ 	    "Unexpected mallctl failure");
+ 
+ 	floor_prev = 0;
+ 	ceil_prev = 0;
+ 	for (i = 1; i <= chunksize >> LG_PAGE; i++) {
+ 		size_t run_size, floor, ceil;
+ 
+ 		run_size = i << LG_PAGE;
+diff --git a/memory/jemalloc/src/test/unit/size_classes.c b/memory/jemalloc/src/test/unit/size_classes.c
+--- a/memory/jemalloc/src/test/unit/size_classes.c
++++ b/memory/jemalloc/src/test/unit/size_classes.c
+@@ -3,27 +3,27 @@
+ static size_t
+ get_max_size_class(void)
+ {
+ 	unsigned nhchunks;
+ 	size_t mib[4];
+ 	size_t sz, miblen, max_size_class;
+ 
+ 	sz = sizeof(unsigned);
+-	assert_d_eq(mallctl("arenas.nhchunks", &nhchunks, &sz, NULL, 0), 0,
+-	    "Unexpected mallctl() error");
++	assert_d_eq(mallctl("arenas.nhchunks", (void *)&nhchunks, &sz, NULL, 0),
++	    0, "Unexpected mallctl() error");
+ 
+ 	miblen = sizeof(mib) / sizeof(size_t);
+ 	assert_d_eq(mallctlnametomib("arenas.hchunk.0.size", mib, &miblen), 0,
+ 	    "Unexpected mallctlnametomib() error");
+ 	mib[2] = nhchunks - 1;
+ 
+ 	sz = sizeof(size_t);
+-	assert_d_eq(mallctlbymib(mib, miblen, &max_size_class, &sz, NULL, 0), 0,
+-	    "Unexpected mallctlbymib() error");
++	assert_d_eq(mallctlbymib(mib, miblen, (void *)&max_size_class, &sz,
++	    NULL, 0), 0, "Unexpected mallctlbymib() error");
+ 
+ 	return (max_size_class);
+ }
+ 
+ TEST_BEGIN(test_size_classes)
+ {
+ 	size_t size_class, max_size_class;
+ 	szind_t index, max_index;
+diff --git a/memory/jemalloc/src/test/unit/stats.c b/memory/jemalloc/src/test/unit/stats.c
+--- a/memory/jemalloc/src/test/unit/stats.c
++++ b/memory/jemalloc/src/test/unit/stats.c
+@@ -2,28 +2,28 @@
+ 
+ TEST_BEGIN(test_stats_summary)
+ {
+ 	size_t *cactive;
+ 	size_t sz, allocated, active, resident, mapped;
+ 	int expected = config_stats ? 0 : ENOENT;
+ 
+ 	sz = sizeof(cactive);
+-	assert_d_eq(mallctl("stats.cactive", &cactive, &sz, NULL, 0), expected,
+-	    "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.cactive", (void *)&cactive, &sz, NULL, 0),
++	    expected, "Unexpected mallctl() result");
+ 
+ 	sz = sizeof(size_t);
+-	assert_d_eq(mallctl("stats.allocated", &allocated, &sz, NULL, 0),
++	assert_d_eq(mallctl("stats.allocated", (void *)&allocated, &sz, NULL,
++	    0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.active", (void *)&active, &sz, NULL, 0),
+ 	    expected, "Unexpected mallctl() result");
+-	assert_d_eq(mallctl("stats.active", &active, &sz, NULL, 0), expected,
+-	    "Unexpected mallctl() result");
+-	assert_d_eq(mallctl("stats.resident", &resident, &sz, NULL, 0),
++	assert_d_eq(mallctl("stats.resident", (void *)&resident, &sz, NULL, 0),
+ 	    expected, "Unexpected mallctl() result");
+-	assert_d_eq(mallctl("stats.mapped", &mapped, &sz, NULL, 0), expected,
+-	    "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.mapped", (void *)&mapped, &sz, NULL, 0),
++	    expected, "Unexpected mallctl() result");
+ 
+ 	if (config_stats) {
+ 		assert_zu_le(active, *cactive,
+ 		    "active should be no larger than cactive");
+ 		assert_zu_le(allocated, active,
+ 		    "allocated should be no larger than active");
+ 		assert_zu_lt(active, resident,
+ 		    "active should be less than resident");
+@@ -40,29 +40,29 @@ TEST_BEGIN(test_stats_huge)
+ 	size_t allocated;
+ 	uint64_t nmalloc, ndalloc, nrequests;
+ 	size_t sz;
+ 	int expected = config_stats ? 0 : ENOENT;
+ 
+ 	p = mallocx(large_maxclass+1, 0);
+ 	assert_ptr_not_null(p, "Unexpected mallocx() failure");
+ 
+-	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0,
+-	    "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch, sizeof(epoch)),
++	    0, "Unexpected mallctl() failure");
+ 
+ 	sz = sizeof(size_t);
+-	assert_d_eq(mallctl("stats.arenas.0.huge.allocated", &allocated, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.huge.allocated", (void *)&allocated,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
+ 	sz = sizeof(uint64_t);
+-	assert_d_eq(mallctl("stats.arenas.0.huge.nmalloc", &nmalloc, &sz, NULL,
+-	    0), expected, "Unexpected mallctl() result");
+-	assert_d_eq(mallctl("stats.arenas.0.huge.ndalloc", &ndalloc, &sz, NULL,
+-	    0), expected, "Unexpected mallctl() result");
+-	assert_d_eq(mallctl("stats.arenas.0.huge.nrequests", &nrequests, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.huge.nmalloc", (void *)&nmalloc,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.huge.ndalloc", (void *)&ndalloc,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.huge.nrequests", (void *)&nrequests,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
+ 
+ 	if (config_stats) {
+ 		assert_zu_gt(allocated, 0,
+ 		    "allocated should be greater than zero");
+ 		assert_u64_ge(nmalloc, ndalloc,
+ 		    "nmalloc should be at least as large as ndalloc");
+ 		assert_u64_le(nmalloc, nrequests,
+ 		    "nmalloc should no larger than nrequests");
+@@ -78,46 +78,46 @@ TEST_BEGIN(test_stats_arenas_summary)
+ 	void *little, *large, *huge;
+ 	uint64_t epoch;
+ 	size_t sz;
+ 	int expected = config_stats ? 0 : ENOENT;
+ 	size_t mapped;
+ 	uint64_t npurge, nmadvise, purged;
+ 
+ 	arena = 0;
+-	assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)),
+-	    0, "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("thread.arena", NULL, NULL, (void *)&arena,
++	    sizeof(arena)), 0, "Unexpected mallctl() failure");
+ 
+ 	little = mallocx(SMALL_MAXCLASS, 0);
+ 	assert_ptr_not_null(little, "Unexpected mallocx() failure");
+ 	large = mallocx(large_maxclass, 0);
+ 	assert_ptr_not_null(large, "Unexpected mallocx() failure");
+ 	huge = mallocx(chunksize, 0);
+ 	assert_ptr_not_null(huge, "Unexpected mallocx() failure");
+ 
+ 	dallocx(little, 0);
+ 	dallocx(large, 0);
+ 	dallocx(huge, 0);
+ 
+ 	assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
+ 	    "Unexpected mallctl() failure");
+ 
+-	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0,
+-	    "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch, sizeof(epoch)),
++	    0, "Unexpected mallctl() failure");
+ 
+ 	sz = sizeof(size_t);
+-	assert_d_eq(mallctl("stats.arenas.0.mapped", &mapped, &sz, NULL, 0),
+-	    expected, "Unexepected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.mapped", (void *)&mapped, &sz, NULL,
++	    0), expected, "Unexepected mallctl() result");
+ 	sz = sizeof(uint64_t);
+-	assert_d_eq(mallctl("stats.arenas.0.npurge", &npurge, &sz, NULL, 0),
+-	    expected, "Unexepected mallctl() result");
+-	assert_d_eq(mallctl("stats.arenas.0.nmadvise", &nmadvise, &sz, NULL, 0),
+-	    expected, "Unexepected mallctl() result");
+-	assert_d_eq(mallctl("stats.arenas.0.purged", &purged, &sz, NULL, 0),
+-	    expected, "Unexepected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.npurge", (void *)&npurge, &sz, NULL,
++	    0), expected, "Unexepected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.nmadvise", (void *)&nmadvise, &sz,
++	    NULL, 0), expected, "Unexepected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.purged", (void *)&purged, &sz, NULL,
++	    0), expected, "Unexepected mallctl() result");
+ 
+ 	if (config_stats) {
+ 		assert_u64_gt(npurge, 0,
+ 		    "At least one purge should have occurred");
+ 		assert_u64_le(nmadvise, purged,
+ 		    "nmadvise should be no greater than purged");
+ 	}
+ }
+@@ -145,38 +145,40 @@ TEST_BEGIN(test_stats_arenas_small)
+ 	void *p;
+ 	size_t sz, allocated;
+ 	uint64_t epoch, nmalloc, ndalloc, nrequests;
+ 	int expected = config_stats ? 0 : ENOENT;
+ 
+ 	no_lazy_lock(); /* Lazy locking would dodge tcache testing. */
+ 
+ 	arena = 0;
+-	assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)),
+-	    0, "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("thread.arena", NULL, NULL, (void *)&arena,
++	    sizeof(arena)), 0, "Unexpected mallctl() failure");
+ 
+ 	p = mallocx(SMALL_MAXCLASS, 0);
+ 	assert_ptr_not_null(p, "Unexpected mallocx() failure");
+ 
+ 	assert_d_eq(mallctl("thread.tcache.flush", NULL, NULL, NULL, 0),
+ 	    config_tcache ? 0 : ENOENT, "Unexpected mallctl() result");
+ 
+-	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0,
+-	    "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch, sizeof(epoch)),
++	    0, "Unexpected mallctl() failure");
+ 
+ 	sz = sizeof(size_t);
+-	assert_d_eq(mallctl("stats.arenas.0.small.allocated", &allocated, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.small.allocated",
++	    (void *)&allocated, &sz, NULL, 0), expected,
++	    "Unexpected mallctl() result");
+ 	sz = sizeof(uint64_t);
+-	assert_d_eq(mallctl("stats.arenas.0.small.nmalloc", &nmalloc, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
+-	assert_d_eq(mallctl("stats.arenas.0.small.ndalloc", &ndalloc, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
+-	assert_d_eq(mallctl("stats.arenas.0.small.nrequests", &nrequests, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.small.nmalloc", (void *)&nmalloc,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.small.ndalloc", (void *)&ndalloc,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.small.nrequests",
++	    (void *)&nrequests, &sz, NULL, 0), expected,
++	    "Unexpected mallctl() result");
+ 
+ 	if (config_stats) {
+ 		assert_zu_gt(allocated, 0,
+ 		    "allocated should be greater than zero");
+ 		assert_u64_gt(nmalloc, 0,
+ 		    "nmalloc should be no greater than zero");
+ 		assert_u64_ge(nmalloc, ndalloc,
+ 		    "nmalloc should be at least as large as ndalloc");
+@@ -192,35 +194,37 @@ TEST_BEGIN(test_stats_arenas_large)
+ {
+ 	unsigned arena;
+ 	void *p;
+ 	size_t sz, allocated;
+ 	uint64_t epoch, nmalloc, ndalloc, nrequests;
+ 	int expected = config_stats ? 0 : ENOENT;
+ 
+ 	arena = 0;
+-	assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)),
+-	    0, "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("thread.arena", NULL, NULL, (void *)&arena,
++	    sizeof(arena)), 0, "Unexpected mallctl() failure");
+ 
+ 	p = mallocx(large_maxclass, 0);
+ 	assert_ptr_not_null(p, "Unexpected mallocx() failure");
+ 
+-	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0,
+-	    "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch, sizeof(epoch)),
++	    0, "Unexpected mallctl() failure");
+ 
+ 	sz = sizeof(size_t);
+-	assert_d_eq(mallctl("stats.arenas.0.large.allocated", &allocated, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.large.allocated",
++	    (void *)&allocated, &sz, NULL, 0), expected,
++	    "Unexpected mallctl() result");
+ 	sz = sizeof(uint64_t);
+-	assert_d_eq(mallctl("stats.arenas.0.large.nmalloc", &nmalloc, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
+-	assert_d_eq(mallctl("stats.arenas.0.large.ndalloc", &ndalloc, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
+-	assert_d_eq(mallctl("stats.arenas.0.large.nrequests", &nrequests, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.large.nmalloc", (void *)&nmalloc,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.large.ndalloc", (void *)&ndalloc,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.large.nrequests",
++	    (void *)&nrequests, &sz, NULL, 0), expected,
++	    "Unexpected mallctl() result");
+ 
+ 	if (config_stats) {
+ 		assert_zu_gt(allocated, 0,
+ 		    "allocated should be greater than zero");
+ 		assert_u64_gt(nmalloc, 0,
+ 		    "nmalloc should be greater than zero");
+ 		assert_u64_ge(nmalloc, ndalloc,
+ 		    "nmalloc should be at least as large as ndalloc");
+@@ -236,33 +240,33 @@ TEST_BEGIN(test_stats_arenas_huge)
+ {
+ 	unsigned arena;
+ 	void *p;
+ 	size_t sz, allocated;
+ 	uint64_t epoch, nmalloc, ndalloc;
+ 	int expected = config_stats ? 0 : ENOENT;
+ 
+ 	arena = 0;
+-	assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)),
+-	    0, "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("thread.arena", NULL, NULL, (void *)&arena,
++	    sizeof(arena)), 0, "Unexpected mallctl() failure");
+ 
+ 	p = mallocx(chunksize, 0);
+ 	assert_ptr_not_null(p, "Unexpected mallocx() failure");
+ 
+-	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0,
+-	    "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch, sizeof(epoch)),
++	    0, "Unexpected mallctl() failure");
+ 
+ 	sz = sizeof(size_t);
+-	assert_d_eq(mallctl("stats.arenas.0.huge.allocated", &allocated, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.huge.allocated", (void *)&allocated,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
+ 	sz = sizeof(uint64_t);
+-	assert_d_eq(mallctl("stats.arenas.0.huge.nmalloc", &nmalloc, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
+-	assert_d_eq(mallctl("stats.arenas.0.huge.ndalloc", &ndalloc, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.huge.nmalloc", (void *)&nmalloc,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.huge.ndalloc", (void *)&ndalloc,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
+ 
+ 	if (config_stats) {
+ 		assert_zu_gt(allocated, 0,
+ 		    "allocated should be greater than zero");
+ 		assert_u64_gt(nmalloc, 0,
+ 		    "nmalloc should be greater than zero");
+ 		assert_u64_ge(nmalloc, ndalloc,
+ 		    "nmalloc should be at least as large as ndalloc");
+@@ -277,54 +281,55 @@ TEST_BEGIN(test_stats_arenas_bins)
+ 	unsigned arena;
+ 	void *p;
+ 	size_t sz, curruns, curregs;
+ 	uint64_t epoch, nmalloc, ndalloc, nrequests, nfills, nflushes;
+ 	uint64_t nruns, nreruns;
+ 	int expected = config_stats ? 0 : ENOENT;
+ 
+ 	arena = 0;
+-	assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)),
+-	    0, "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("thread.arena", NULL, NULL, (void *)&arena,
++	    sizeof(arena)), 0, "Unexpected mallctl() failure");
+ 
+ 	p = mallocx(arena_bin_info[0].reg_size, 0);
+ 	assert_ptr_not_null(p, "Unexpected mallocx() failure");
+ 
+ 	assert_d_eq(mallctl("thread.tcache.flush", NULL, NULL, NULL, 0),
+ 	    config_tcache ? 0 : ENOENT, "Unexpected mallctl() result");
+ 
+-	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0,
+-	    "Unexpected mallctl() failure");
+-
+-	sz = sizeof(uint64_t);
+-	assert_d_eq(mallctl("stats.arenas.0.bins.0.nmalloc", &nmalloc, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
+-	assert_d_eq(mallctl("stats.arenas.0.bins.0.ndalloc", &ndalloc, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
+-	assert_d_eq(mallctl("stats.arenas.0.bins.0.nrequests", &nrequests, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
+-	sz = sizeof(size_t);
+-	assert_d_eq(mallctl("stats.arenas.0.bins.0.curregs", &curregs, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch, sizeof(epoch)),
++	    0, "Unexpected mallctl() failure");
+ 
+ 	sz = sizeof(uint64_t);
+-	assert_d_eq(mallctl("stats.arenas.0.bins.0.nfills", &nfills, &sz,
+-	    NULL, 0), config_tcache ? expected : ENOENT,
++	assert_d_eq(mallctl("stats.arenas.0.bins.0.nmalloc", (void *)&nmalloc,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.bins.0.ndalloc", (void *)&ndalloc,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.bins.0.nrequests",
++	    (void *)&nrequests, &sz, NULL, 0), expected,
+ 	    "Unexpected mallctl() result");
+-	assert_d_eq(mallctl("stats.arenas.0.bins.0.nflushes", &nflushes, &sz,
+-	    NULL, 0), config_tcache ? expected : ENOENT,
++	sz = sizeof(size_t);
++	assert_d_eq(mallctl("stats.arenas.0.bins.0.curregs", (void *)&curregs,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
++
++	sz = sizeof(uint64_t);
++	assert_d_eq(mallctl("stats.arenas.0.bins.0.nfills", (void *)&nfills,
++	    &sz, NULL, 0), config_tcache ? expected : ENOENT,
++	    "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.bins.0.nflushes", (void *)&nflushes,
++	    &sz, NULL, 0), config_tcache ? expected : ENOENT,
+ 	    "Unexpected mallctl() result");
+ 
+-	assert_d_eq(mallctl("stats.arenas.0.bins.0.nruns", &nruns, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
+-	assert_d_eq(mallctl("stats.arenas.0.bins.0.nreruns", &nreruns, &sz,
++	assert_d_eq(mallctl("stats.arenas.0.bins.0.nruns", (void *)&nruns, &sz,
+ 	    NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.bins.0.nreruns", (void *)&nreruns,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
+ 	sz = sizeof(size_t);
+-	assert_d_eq(mallctl("stats.arenas.0.bins.0.curruns", &curruns, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.bins.0.curruns", (void *)&curruns,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
+ 
+ 	if (config_stats) {
+ 		assert_u64_gt(nmalloc, 0,
+ 		    "nmalloc should be greater than zero");
+ 		assert_u64_ge(nmalloc, ndalloc,
+ 		    "nmalloc should be at least as large as ndalloc");
+ 		assert_u64_gt(nrequests, 0,
+ 		    "nrequests should be greater than zero");
+@@ -350,35 +355,36 @@ TEST_BEGIN(test_stats_arenas_lruns)
+ {
+ 	unsigned arena;
+ 	void *p;
+ 	uint64_t epoch, nmalloc, ndalloc, nrequests;
+ 	size_t curruns, sz;
+ 	int expected = config_stats ? 0 : ENOENT;
+ 
+ 	arena = 0;
+-	assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)),
+-	    0, "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("thread.arena", NULL, NULL, (void *)&arena,
++	    sizeof(arena)), 0, "Unexpected mallctl() failure");
+ 
+ 	p = mallocx(LARGE_MINCLASS, 0);
+ 	assert_ptr_not_null(p, "Unexpected mallocx() failure");
+ 
+-	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0,
+-	    "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch, sizeof(epoch)),
++	    0, "Unexpected mallctl() failure");
+ 
+ 	sz = sizeof(uint64_t);
+-	assert_d_eq(mallctl("stats.arenas.0.lruns.0.nmalloc", &nmalloc, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
+-	assert_d_eq(mallctl("stats.arenas.0.lruns.0.ndalloc", &ndalloc, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
+-	assert_d_eq(mallctl("stats.arenas.0.lruns.0.nrequests", &nrequests, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.lruns.0.nmalloc", (void *)&nmalloc,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.lruns.0.ndalloc", (void *)&ndalloc,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.lruns.0.nrequests",
++	    (void *)&nrequests, &sz, NULL, 0), expected,
++	    "Unexpected mallctl() result");
+ 	sz = sizeof(size_t);
+-	assert_d_eq(mallctl("stats.arenas.0.lruns.0.curruns", &curruns, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.lruns.0.curruns", (void *)&curruns,
++	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
+ 
+ 	if (config_stats) {
+ 		assert_u64_gt(nmalloc, 0,
+ 		    "nmalloc should be greater than zero");
+ 		assert_u64_ge(nmalloc, ndalloc,
+ 		    "nmalloc should be at least as large as ndalloc");
+ 		assert_u64_gt(nrequests, 0,
+ 		    "nrequests should be greater than zero");
+@@ -394,33 +400,36 @@ TEST_BEGIN(test_stats_arenas_hchunks)
+ {
+ 	unsigned arena;
+ 	void *p;
+ 	uint64_t epoch, nmalloc, ndalloc;
+ 	size_t curhchunks, sz;
+ 	int expected = config_stats ? 0 : ENOENT;
+ 
+ 	arena = 0;
+-	assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)),
+-	    0, "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("thread.arena", NULL, NULL, (void *)&arena,
++	    sizeof(arena)), 0, "Unexpected mallctl() failure");
+ 
+ 	p = mallocx(chunksize, 0);
+ 	assert_ptr_not_null(p, "Unexpected mallocx() failure");
+ 
+-	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0,
+-	    "Unexpected mallctl() failure");
++	assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch, sizeof(epoch)),
++	    0, "Unexpected mallctl() failure");
+ 
+ 	sz = sizeof(uint64_t);
+-	assert_d_eq(mallctl("stats.arenas.0.hchunks.0.nmalloc", &nmalloc, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
+-	assert_d_eq(mallctl("stats.arenas.0.hchunks.0.ndalloc", &ndalloc, &sz,
+-	    NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.hchunks.0.nmalloc",
++	    (void *)&nmalloc, &sz, NULL, 0), expected,
++	    "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.hchunks.0.ndalloc",
++	    (void *)&ndalloc, &sz, NULL, 0), expected,
++	    "Unexpected mallctl() result");
+ 	sz = sizeof(size_t);
+-	assert_d_eq(mallctl("stats.arenas.0.hchunks.0.curhchunks", &curhchunks,
+-	    &sz, NULL, 0), expected, "Unexpected mallctl() result");
++	assert_d_eq(mallctl("stats.arenas.0.hchunks.0.curhchunks",
++	    (void *)&curhchunks, &sz, NULL, 0), expected,
++	    "Unexpected mallctl() result");
+ 
+ 	if (config_stats) {
+ 		assert_u64_gt(nmalloc, 0,
+ 		    "nmalloc should be greater than zero");
+ 		assert_u64_ge(nmalloc, ndalloc,
+ 		    "nmalloc should be at least as large as ndalloc");
+ 		assert_u64_gt(curhchunks, 0,
+ 		    "At least one chunk should be currently allocated");
+diff --git a/memory/jemalloc/src/test/unit/tsd.c b/memory/jemalloc/src/test/unit/tsd.c
+--- a/memory/jemalloc/src/test/unit/tsd.c
++++ b/memory/jemalloc/src/test/unit/tsd.c
+@@ -74,17 +74,17 @@ thd_start(void *arg)
+ 
+ 	free(p);
+ 	return (NULL);
+ }
+ 
+ TEST_BEGIN(test_tsd_main_thread)
+ {
+ 
+-	thd_start((void *) 0xa5f3e329);
++	thd_start((void *)(uintptr_t)0xa5f3e329);
+ }
+ TEST_END
+ 
+ TEST_BEGIN(test_tsd_sub_thread)
+ {
+ 	thd_t thd;
+ 
+ 	data_cleanup_executed = false;
+diff --git a/memory/jemalloc/src/test/unit/util.c b/memory/jemalloc/src/test/unit/util.c
+--- a/memory/jemalloc/src/test/unit/util.c
++++ b/memory/jemalloc/src/test/unit/util.c
+@@ -70,35 +70,36 @@ TEST_BEGIN(test_malloc_strtoumax)
+ 		const char *expected_remainder;
+ 		int base;
+ 		int expected_errno;
+ 		const char *expected_errno_name;
+ 		uintmax_t expected_x;
+ 	};
+ #define	ERR(e)		e, #e
+ #define	KUMAX(x)	((uintmax_t)x##ULL)
++#define	KSMAX(x)	((uintmax_t)(intmax_t)x##LL)
+ 	struct test_s tests[] = {
+ 		{"0",		"0",	-1,	ERR(EINVAL),	UINTMAX_MAX},
+ 		{"0",		"0",	1,	ERR(EINVAL),	UINTMAX_MAX},
+ 		{"0",		"0",	37,	ERR(EINVAL),	UINTMAX_MAX},
+ 
+ 		{"",		"",	0,	ERR(EINVAL),	UINTMAX_MAX},
+ 		{"+",		"+",	0,	ERR(EINVAL),	UINTMAX_MAX},
+ 		{"++3",		"++3",	0,	ERR(EINVAL),	UINTMAX_MAX},
+ 		{"-",		"-",	0,	ERR(EINVAL),	UINTMAX_MAX},
+ 
+ 		{"42",		"",	0,	ERR(0),		KUMAX(42)},
+ 		{"+42",		"",	0,	ERR(0),		KUMAX(42)},
+-		{"-42",		"",	0,	ERR(0),		KUMAX(-42)},
++		{"-42",		"",	0,	ERR(0),		KSMAX(-42)},
+ 		{"042",		"",	0,	ERR(0),		KUMAX(042)},
+ 		{"+042",	"",	0,	ERR(0),		KUMAX(042)},
+-		{"-042",	"",	0,	ERR(0),		KUMAX(-042)},
++		{"-042",	"",	0,	ERR(0),		KSMAX(-042)},
+ 		{"0x42",	"",	0,	ERR(0),		KUMAX(0x42)},
+ 		{"+0x42",	"",	0,	ERR(0),		KUMAX(0x42)},
+-		{"-0x42",	"",	0,	ERR(0),		KUMAX(-0x42)},
++		{"-0x42",	"",	0,	ERR(0),		KSMAX(-0x42)},
+ 
+ 		{"0",		"",	0,	ERR(0),		KUMAX(0)},
+ 		{"1",		"",	0,	ERR(0),		KUMAX(1)},
+ 
+ 		{"42",		"",	0,	ERR(0),		KUMAX(42)},
+ 		{" 42",		"",	0,	ERR(0),		KUMAX(42)},
+ 		{"42 ",		" ",	0,	ERR(0),		KUMAX(42)},
+ 		{"0x",		"x",	0,	ERR(0),		KUMAX(0)},
+@@ -125,16 +126,17 @@ TEST_BEGIN(test_malloc_strtoumax)
+ 		{"FG",		"G",	16,	ERR(0),		KUMAX(15)},
+ 		{"0xfg",	"g",	16,	ERR(0),		KUMAX(15)},
+ 		{"0XFG",	"G",	16,	ERR(0),		KUMAX(15)},
+ 		{"z_",		"_",	36,	ERR(0),		KUMAX(35)},
+ 		{"Z_",		"_",	36,	ERR(0),		KUMAX(35)}
+ 	};
+ #undef ERR
+ #undef KUMAX
++#undef KSMAX
+ 	unsigned i;
+ 
+ 	for (i = 0; i < sizeof(tests)/sizeof(struct test_s); i++) {
+ 		struct test_s *test = &tests[i];
+ 		int err;
+ 		uintmax_t result;
+ 		char *remainder;
+ 
+diff --git a/memory/jemalloc/upstream.info b/memory/jemalloc/upstream.info
+--- a/memory/jemalloc/upstream.info
++++ b/memory/jemalloc/upstream.info
+@@ -1,2 +1,2 @@
+ UPSTREAM_REPO=https://github.com/jemalloc/jemalloc
+-UPSTREAM_COMMIT=4.3.1
++UPSTREAM_COMMIT=4.4.0

+ 32 - 0
mozilla-esr52/patches/mozilla-esr52-push_355263.patch

@@ -0,0 +1,32 @@
+# HG changeset patch
+# User Ryan VanderMeulen <ryanvm@gmail.com>
+# Date 1484143488 18000
+#      Wed Jan 11 09:04:48 2017 -0500
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID 7770a9083198bca021de3c6fe3b48a4f7daff7cc
+# Parent  301a46b075293261115b39da1ff5f4d06cc08406
+Bug 1322027 - Don't disable hugepage support since it no longer causes PGO issues. a=jorgk
+
+diff --git a/build/autoconf/jemalloc.m4 b/build/autoconf/jemalloc.m4
+--- a/build/autoconf/jemalloc.m4
++++ b/build/autoconf/jemalloc.m4
+@@ -83,19 +83,16 @@ if test "$MOZ_BUILD_APP" != js -o -n "$J
+     # their mozconfig.
+     if test "$_MSC_VER"; then
+        ac_configure_args="$ac_configure_args CFLAGS="
+     fi
+ 
+     # Force disable DSS support in jemalloc.
+     ac_configure_args="$ac_configure_args ac_cv_func_sbrk=false"
+ 
+-    # Force disable hugepage support in jemalloc.
+-    ac_configure_args="$ac_configure_args je_cv_thp=no"
+-
+     # Make Linux builds munmap freed chunks instead of recycling them.
+     ac_configure_args="$ac_configure_args --enable-munmap"
+ 
+     # Disable cache oblivious behavior that appears to have a performance
+     # impact on Firefox.
+     ac_configure_args="$ac_configure_args --disable-cache-oblivious"
+ 
+     if ! test -e memory/jemalloc; then

+ 92 - 0
mozilla-esr52/patches/mozilla-esr52-push_355264.patch

@@ -0,0 +1,92 @@
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1478134926 -32400
+#      Thu Nov 03 10:02:06 2016 +0900
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID 693fe5c8555069d6a88cc9c08a62f2b073d39d43
+# Parent  7770a9083198bca021de3c6fe3b48a4f7daff7cc
+Bug 1311039 - Properly detect the default malloc zone on OSX 10.12. r=njn a=jorgk
+
+diff --git a/memory/mozjemalloc/jemalloc.c b/memory/mozjemalloc/jemalloc.c
+--- a/memory/mozjemalloc/jemalloc.c
++++ b/memory/mozjemalloc/jemalloc.c
+@@ -1499,16 +1499,17 @@ static bool osx_use_jemalloc = false;
+ 
+ 
+ static lion_malloc_zone l_szone;
+ static malloc_zone_t * szone = (malloc_zone_t*)(&l_szone);
+ 
+ static lion_malloc_introspection l_ozone_introspect;
+ static malloc_introspection_t * const ozone_introspect =
+ 	(malloc_introspection_t*)(&l_ozone_introspect);
++static malloc_zone_t *get_default_zone();
+ static void szone2ozone(malloc_zone_t *zone, size_t size);
+ static size_t zone_version_size(int version);
+ #else
+ static const bool osx_use_jemalloc = true;
+ #endif
+ 
+ #endif
+ 
+@@ -6076,17 +6077,17 @@ MALLOC_OUT:
+ 		malloc_printf("<jemalloc>: Error in pthread_key_create()\n");
+ 	}
+ #endif
+ 
+ #if defined(MOZ_MEMORY_DARWIN) && !defined(MOZ_REPLACE_MALLOC)
+ 	/*
+ 	* Overwrite the default memory allocator to use jemalloc everywhere.
+ 	*/
+-	default_zone = malloc_default_zone();
++	default_zone = get_default_zone();
+ 
+ 	/*
+ 	 * We only use jemalloc with MacOS 10.6 and 10.7.  jemalloc is disabled
+ 	 * on 32-bit builds (10.5 and 32-bit 10.6) due to bug 702250, an
+ 	 * apparent MacOS bug.  In fact, this code isn't even compiled on
+ 	 * 32-bit builds.
+ 	 *
+ 	 * We'll have to update our code to work with newer versions, because
+@@ -7057,16 +7058,42 @@ zone_version_size(int version)
+         case LEOPARD_MALLOC_ZONE_T_VERSION:
+             return sizeof(leopard_malloc_zone);
+         default:
+         case LION_MALLOC_ZONE_T_VERSION:
+             return sizeof(lion_malloc_zone);
+     }
+ }
+ 
++static malloc_zone_t *get_default_zone()
++{
++  malloc_zone_t **zones = NULL;
++  unsigned int num_zones = 0;
++
++  /*
++   * On OSX 10.12, malloc_default_zone returns a special zone that is not
++   * present in the list of registered zones. That zone uses a "lite zone"
++   * if one is present (apparently enabled when malloc stack logging is
++   * enabled), or the first registered zone otherwise. In practice this
++   * means unless malloc stack logging is enabled, the first registered
++   * zone is the default.
++   * So get the list of zones to get the first one, instead of relying on
++   * malloc_default_zone.
++   */
++  if (KERN_SUCCESS != malloc_get_all_zones(0, NULL, (vm_address_t**) &zones,
++                                           &num_zones)) {
++    /* Reset the value in case the failure happened after it was set. */
++    num_zones = 0;
++  }
++  if (num_zones) {
++    return zones[0];
++  }
++  return malloc_default_zone();
++}
++
+ /*
+  * Overlay the default scalable zone (szone) such that existing allocations are
+  * drained, and further allocations come from jemalloc. This is necessary
+  * because Core Foundation directly accesses and uses the szone before the
+  * jemalloc library is even loaded.
+  */
+ static void
+ szone2ozone(malloc_zone_t *default_zone, size_t size)

+ 31 - 0
mozilla-esr52/patches/mozilla-esr52-push_355265.patch

@@ -0,0 +1,31 @@
+# HG changeset patch
+# User John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
+# Date 1481560294 -3600
+#      Mon Dec 12 17:31:34 2016 +0100
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID 0d2f32e3bd87543d1b686a5c1f790be68a7bfdb2
+# Parent  693fe5c8555069d6a88cc9c08a62f2b073d39d43
+Bug 1275204 - mozjemalloc: Use better pre-processor defines for sparc64. r=glandium a=jorgk
+
+diff --git a/memory/mozjemalloc/jemalloc.c b/memory/mozjemalloc/jemalloc.c
+--- a/memory/mozjemalloc/jemalloc.c
++++ b/memory/mozjemalloc/jemalloc.c
+@@ -486,17 +486,17 @@ static const bool isthreaded = true;
+ #  define QUANTUM_2POW_MIN	4
+ #  define SIZEOF_PTR_2POW	3
+ #endif
+ #ifdef __alpha__
+ #  define QUANTUM_2POW_MIN	4
+ #  define SIZEOF_PTR_2POW	3
+ #  define NO_TLS
+ #endif
+-#ifdef __sparc64__
++#if defined(__sparc__) && defined(__arch64__)
+ #  define QUANTUM_2POW_MIN	4
+ #  define SIZEOF_PTR_2POW	3
+ #  define NO_TLS
+ #endif
+ #ifdef __amd64__
+ #  define QUANTUM_2POW_MIN	4
+ #  define SIZEOF_PTR_2POW	3
+ #  define CPU_SPINWAIT		__asm__ volatile("pause")

+ 103 - 0
mozilla-esr52/patches/mozilla-esr52-push_355266.patch

@@ -0,0 +1,103 @@
+# HG changeset patch
+# User John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
+# Date 1481560515 -3600
+#      Mon Dec 12 17:35:15 2016 +0100
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID e2be59496c8626bc9f194d2a993ac77dbde41835
+# Parent  0d2f32e3bd87543d1b686a5c1f790be68a7bfdb2
+Bug 1275204 - mozjemalloc: Use the JS arm64 allocator on Linux/sparc64. r=glandium a=jorgk
+
+diff --git a/memory/mozjemalloc/jemalloc.c b/memory/mozjemalloc/jemalloc.c
+--- a/memory/mozjemalloc/jemalloc.c
++++ b/memory/mozjemalloc/jemalloc.c
+@@ -2414,17 +2414,17 @@ pages_map_align(size_t size, size_t alig
+ 	return (ret);
+ }
+ #endif
+ 
+ static void *
+ pages_map(void *addr, size_t size)
+ {
+ 	void *ret;
+-#if defined(__ia64__)
++#if defined(__ia64__) || (defined(__sparc__) && defined(__arch64__) && defined(__linux__))
+         /*
+          * The JS engine assumes that all allocated pointers have their high 17 bits clear,
+          * which ia64's mmap doesn't support directly. However, we can emulate it by passing
+          * mmap an "addr" parameter with those bits clear. The mmap will return that address,
+          * or the nearest available memory above that address, providing a near-guarantee
+          * that those bits are clear. If they are not, we return NULL below to indicate
+          * out-of-memory.
+          *
+@@ -2435,28 +2435,50 @@ pages_map(void *addr, size_t size)
+          */
+ 	bool check_placement = true;
+         if (addr == NULL) {
+ 		addr = (void*)0x0000070000000000;
+ 		check_placement = false;
+ 	}
+ #endif
+ 
++#if defined(__sparc__) && defined(__arch64__) && defined(__linux__)
++    const uintptr_t start = 0x0000070000000000ULL;
++    const uintptr_t end   = 0x0000800000000000ULL;
++
++    /* Copied from js/src/gc/Memory.cpp and adapted for this source */
++
++    uintptr_t hint;
++    void* region = MAP_FAILED;
++    for (hint = start; region == MAP_FAILED && hint + size <= end; hint += chunksize) {
++           region = mmap((void*)hint, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
++           if (region != MAP_FAILED) {
++                   if (((size_t) region + (size - 1)) & 0xffff800000000000) {
++                           if (munmap(region, size)) {
++                                   MOZ_ASSERT(errno == ENOMEM);
++                           }
++                           region = MAP_FAILED;
++                   }
++           }
++    }
++    ret = region;
++#else
++
+ 	/*
+ 	 * We don't use MAP_FIXED here, because it can cause the *replacement*
+ 	 * of existing mappings, and we only want to create new mappings.
+ 	 */
+ 	ret = mmap(addr, size, PROT_READ | PROT_WRITE,
+ 		MAP_PRIVATE | MAP_ANON, -1, 0);
+ 	assert(ret != NULL);
+-
++#endif
+ 	if (ret == MAP_FAILED) {
+ 		ret = NULL;
+ 	}
+-#if defined(__ia64__)
++#if defined(__ia64__) || (defined(__sparc__) && defined(__arch64__) && defined(__linux__))
+         /*
+          * If the allocated memory doesn't have its upper 17 bits clear, consider it
+          * as out of memory.
+         */
+         else if ((long long)ret & 0xffff800000000000) {
+ 		munmap(ret, size);
+                 ret = NULL;
+         }
+@@ -2479,17 +2501,17 @@ pages_map(void *addr, size_t size)
+ 				abort();
+ 		}
+ 		ret = NULL;
+ 	}
+ 	if (ret != NULL) {
+ 		MozTagAnonymousMemory(ret, size, "jemalloc");
+ 	}
+ 
+-#if defined(__ia64__)
++#if defined(__ia64__) || (defined(__sparc__) && defined(__arch64__) && defined(__linux__))
+ 	assert(ret == NULL || (!check_placement && ret != NULL)
+ 	    || (check_placement && ret == addr));
+ #else
+ 	assert(ret == NULL || (addr == NULL && ret != addr)
+ 	    || (addr != NULL && ret == addr));
+ #endif
+ 	return (ret);
+ }

+ 131 - 0
mozilla-esr52/patches/mozilla-esr52-push_355267.patch

@@ -0,0 +1,131 @@
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1484786242 -32400
+#      Thu Jan 19 09:37:22 2017 +0900
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID 80b0b75f8b0d069a87d3c24fcf78901fe51258dc
+# Parent  e2be59496c8626bc9f194d2a993ac77dbde41835
+Bug 1286613 - Properly call mozjemalloc pre/post fork hooks on OSX when replace-malloc is enabled. r=njn a=jorgk
+
+Somehow, we never called those hooks when replace-malloc is enabled. I'd
+expect this to cause random deadlocks when forking, and I'm surprised
+this hasn't surfaced. Maybe it actually causes some intermittent oranges
+on automation, who knows.
+
+This also brings consistency with what is done for jemalloc 4, and with
+the mozjemalloc implementation, too, that we're going to replace with
+this one in a subsequent changeset.
+
+diff --git a/memory/build/replace_malloc.c b/memory/build/replace_malloc.c
+--- a/memory/build/replace_malloc.c
++++ b/memory/build/replace_malloc.c
+@@ -411,26 +411,33 @@ zone_force_unlock(malloc_zone_t *zone)
+   if (isthreaded)
+     jemalloc_postfork_parent();
+ }
+ 
+ #else
+ 
+ #define JEMALLOC_ZONE_VERSION 6
+ 
+-/* Empty implementations are needed, because fork() calls zone->force_(un)lock
+- * unconditionally. */
++extern void _malloc_prefork(void);
++extern void _malloc_postfork(void);
++
+ static void
+ zone_force_lock(malloc_zone_t *zone)
+ {
++  /* /!\ This calls into mozjemalloc. It works because we're linked in the
++   * same library. */
++  _malloc_prefork();
+ }
+ 
+ static void
+ zone_force_unlock(malloc_zone_t *zone)
+ {
++  /* /!\ This calls into mozjemalloc. It works because we're linked in the
++   * same library. */
++  _malloc_postfork();
+ }
+ 
+ #endif
+ 
+ static malloc_zone_t zone;
+ static struct malloc_introspection_t zone_introspect;
+ 
+ static malloc_zone_t *get_default_zone()
+diff --git a/memory/mozjemalloc/jemalloc.c b/memory/mozjemalloc/jemalloc.c
+--- a/memory/mozjemalloc/jemalloc.c
++++ b/memory/mozjemalloc/jemalloc.c
+@@ -1446,18 +1446,24 @@ static void	*huge_palloc(size_t size, si
+ static void	*huge_ralloc(void *ptr, size_t size, size_t oldsize);
+ static void	huge_dalloc(void *ptr);
+ static void	malloc_print_stats(void);
+ #ifndef MOZ_MEMORY_WINDOWS
+ static
+ #endif
+ bool		malloc_init_hard(void);
+ 
+-static void	_malloc_prefork(void);
+-static void	_malloc_postfork(void);
++#ifndef MOZ_MEMORY_DARWIN
++static
++#endif
++void	_malloc_prefork(void);
++#ifndef MOZ_MEMORY_DARWIN
++static
++#endif
++void	_malloc_postfork(void);
+ 
+ #ifdef MOZ_MEMORY_DARWIN
+ /*
+  * MALLOC_ZONE_T_NOTE
+  *
+  * On Darwin, we hook into the memory allocator using a malloc_zone_t struct.
+  * We must be very careful around this struct because of different behaviour on
+  * different versions of OSX.
+@@ -6880,17 +6886,20 @@ jemalloc_free_dirty_pages_impl(void)
+ /******************************************************************************/
+ /*
+  * Begin library-private functions, used by threading libraries for protection
+  * of malloc during fork().  These functions are only called if the program is
+  * running in threaded mode, so there is no need to check whether the program
+  * is threaded here.
+  */
+ 
+-static void
++#ifndef MOZ_MEMORY_DARWIN
++static
++#endif
++void
+ _malloc_prefork(void)
+ {
+ 	unsigned i;
+ 
+ 	/* Acquire all mutexes in a safe order. */
+ 
+ 	malloc_spin_lock(&arenas_lock);
+ 	for (i = 0; i < narenas; i++) {
+@@ -6898,17 +6907,20 @@ static void
+ 			malloc_spin_lock(&arenas[i]->lock);
+ 	}
+ 
+ 	malloc_mutex_lock(&base_mtx);
+ 
+ 	malloc_mutex_lock(&huge_mtx);
+ }
+ 
+-static void
++#ifndef MOZ_MEMORY_DARWIN
++static
++#endif
++void
+ _malloc_postfork(void)
+ {
+ 	unsigned i;
+ 
+ 	/* Release all mutexes, now that fork() has completed. */
+ 
+ 	malloc_mutex_unlock(&huge_mtx);
+ 

+ 616 - 0
mozilla-esr52/patches/mozilla-esr52-push_355268.patch

@@ -0,0 +1,616 @@
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1484707169 -32400
+#      Wed Jan 18 11:39:29 2017 +0900
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID 7d0dd01d7dd4712ea8be076e9e03d67a5948b1f8
+# Parent  cd763eda1079e3d3f87cb8faf0cde7cde35db468
+Bug 1286613 - Move replace-malloc zone allocator to a separate file. r=njn a=jorgk
+
+The intent here is to reuse the zone allocator for mozjemalloc, to avoid
+all the shortcomings of mozjemalloc using a different one. This change
+only moves the replace-malloc zone allocator out of replace-malloc.c, to
+make changes for mozjemalloc integration clearer.
+
+diff --git a/memory/build/moz.build b/memory/build/moz.build
+--- a/memory/build/moz.build
++++ b/memory/build/moz.build
+@@ -39,6 +39,11 @@
+         'replace_malloc.c',
+     ]
+ 
++    if CONFIG['OS_TARGET'] == 'Darwin':
++        SOURCES += [
++            'zone.c',
++        ]
++
+ Library('memory')
+ 
+ if CONFIG['MOZ_GLUE_IN_PROGRAM']:
+diff --git a/memory/build/replace_malloc.c b/memory/build/replace_malloc.c
+--- a/memory/build/replace_malloc.c
++++ b/memory/build/replace_malloc.c
+@@ -300,260 +300,3 @@
+ MOZ_MEMORY_API __memalign_hook_type __memalign_hook = memalign_impl;
+ 
+ #endif
+-
+-/*
+- * The following is a OSX zone allocator implementation.
+- * /!\ WARNING. It assumes the underlying malloc implementation's
+- * malloc_usable_size returns 0 when the given pointer is not owned by
+- * the allocator. Sadly, OSX does call zone_size with pointers not
+- * owned by the allocator.
+- */
+-
+-#ifdef XP_DARWIN
+-#include <stdlib.h>
+-#include <malloc/malloc.h>
+-#include "mozilla/Assertions.h"
+-
+-static size_t
+-zone_size(malloc_zone_t *zone, void *ptr)
+-{
+-  return malloc_usable_size_impl(ptr);
+-}
+-
+-static void *
+-zone_malloc(malloc_zone_t *zone, size_t size)
+-{
+-  return malloc_impl(size);
+-}
+-
+-static void *
+-zone_calloc(malloc_zone_t *zone, size_t num, size_t size)
+-{
+-  return calloc_impl(num, size);
+-}
+-
+-static void *
+-zone_realloc(malloc_zone_t *zone, void *ptr, size_t size)
+-{
+-  if (malloc_usable_size_impl(ptr))
+-    return realloc_impl(ptr, size);
+-  return realloc(ptr, size);
+-}
+-
+-static void
+-zone_free(malloc_zone_t *zone, void *ptr)
+-{
+-  if (malloc_usable_size_impl(ptr)) {
+-    free_impl(ptr);
+-    return;
+-  }
+-  free(ptr);
+-}
+-
+-static void
+-zone_free_definite_size(malloc_zone_t *zone, void *ptr, size_t size)
+-{
+-  size_t current_size = malloc_usable_size_impl(ptr);
+-  if (current_size) {
+-    MOZ_ASSERT(current_size == size);
+-    free_impl(ptr);
+-    return;
+-  }
+-  free(ptr);
+-}
+-
+-static void *
+-zone_memalign(malloc_zone_t *zone, size_t alignment, size_t size)
+-{
+-  void *ptr;
+-  if (posix_memalign_impl(&ptr, alignment, size) == 0)
+-    return ptr;
+-  return NULL;
+-}
+-
+-static void *
+-zone_valloc(malloc_zone_t *zone, size_t size)
+-{
+-  return valloc_impl(size);
+-}
+-
+-static void *
+-zone_destroy(malloc_zone_t *zone)
+-{
+-  /* This function should never be called. */
+-  MOZ_CRASH();
+-}
+-
+-static size_t
+-zone_good_size(malloc_zone_t *zone, size_t size)
+-{
+-  return malloc_good_size_impl(size);
+-}
+-
+-#ifdef MOZ_JEMALLOC
+-
+-#include "jemalloc/internal/jemalloc_internal.h"
+-
+-static void
+-zone_force_lock(malloc_zone_t *zone)
+-{
+-  /* /!\ This calls into jemalloc. It works because we're linked in the
+-   * same library. Stolen from jemalloc's zone.c. */
+-  if (isthreaded)
+-    jemalloc_prefork();
+-}
+-
+-static void
+-zone_force_unlock(malloc_zone_t *zone)
+-{
+-  /* /!\ This calls into jemalloc. It works because we're linked in the
+-   * same library. Stolen from jemalloc's zone.c. */
+-  if (isthreaded)
+-    jemalloc_postfork_parent();
+-}
+-
+-#else
+-
+-#define JEMALLOC_ZONE_VERSION 6
+-
+-extern void _malloc_prefork(void);
+-extern void _malloc_postfork(void);
+-
+-static void
+-zone_force_lock(malloc_zone_t *zone)
+-{
+-  /* /!\ This calls into mozjemalloc. It works because we're linked in the
+-   * same library. */
+-  _malloc_prefork();
+-}
+-
+-static void
+-zone_force_unlock(malloc_zone_t *zone)
+-{
+-  /* /!\ This calls into mozjemalloc. It works because we're linked in the
+-   * same library. */
+-  _malloc_postfork();
+-}
+-
+-#endif
+-
+-static malloc_zone_t zone;
+-static struct malloc_introspection_t zone_introspect;
+-
+-static malloc_zone_t *get_default_zone()
+-{
+-  malloc_zone_t **zones = NULL;
+-  unsigned int num_zones = 0;
+-
+-  /*
+-   * On OSX 10.12, malloc_default_zone returns a special zone that is not
+-   * present in the list of registered zones. That zone uses a "lite zone"
+-   * if one is present (apparently enabled when malloc stack logging is
+-   * enabled), or the first registered zone otherwise. In practice this
+-   * means unless malloc stack logging is enabled, the first registered
+-   * zone is the default.
+-   * So get the list of zones to get the first one, instead of relying on
+-   * malloc_default_zone.
+-   */
+-  if (KERN_SUCCESS != malloc_get_all_zones(0, NULL, (vm_address_t**) &zones,
+-                                           &num_zones)) {
+-    /* Reset the value in case the failure happened after it was set. */
+-    num_zones = 0;
+-  }
+-  if (num_zones) {
+-    return zones[0];
+-  }
+-  return malloc_default_zone();
+-}
+-
+-
+-__attribute__((constructor)) void
+-register_zone(void)
+-{
+-  malloc_zone_t *default_zone = get_default_zone();
+-
+-  zone.size = (void *)zone_size;
+-  zone.malloc = (void *)zone_malloc;
+-  zone.calloc = (void *)zone_calloc;
+-  zone.valloc = (void *)zone_valloc;
+-  zone.free = (void *)zone_free;
+-  zone.realloc = (void *)zone_realloc;
+-  zone.destroy = (void *)zone_destroy;
+-  zone.zone_name = "replace_malloc_zone";
+-  zone.batch_malloc = NULL;
+-  zone.batch_free = NULL;
+-  zone.introspect = &zone_introspect;
+-  zone.version = JEMALLOC_ZONE_VERSION;
+-  zone.memalign = zone_memalign;
+-  zone.free_definite_size = zone_free_definite_size;
+-#if (JEMALLOC_ZONE_VERSION >= 8)
+-  zone.pressure_relief = NULL;
+-#endif
+-  zone_introspect.enumerator = NULL;
+-  zone_introspect.good_size = (void *)zone_good_size;
+-  zone_introspect.check = NULL;
+-  zone_introspect.print = NULL;
+-  zone_introspect.log = NULL;
+-  zone_introspect.force_lock = (void *)zone_force_lock;
+-  zone_introspect.force_unlock = (void *)zone_force_unlock;
+-  zone_introspect.statistics = NULL;
+-  zone_introspect.zone_locked = NULL;
+-#if (JEMALLOC_ZONE_VERSION >= 7)
+-  zone_introspect.enable_discharge_checking = NULL;
+-  zone_introspect.disable_discharge_checking = NULL;
+-  zone_introspect.discharge = NULL;
+-#ifdef __BLOCKS__
+-  zone_introspect.enumerate_discharged_pointers = NULL;
+-#else
+-  zone_introspect.enumerate_unavailable_without_blocks = NULL;
+-#endif
+-#endif
+-
+-  /*
+-   * The default purgeable zone is created lazily by OSX's libc.  It uses
+-   * the default zone when it is created for "small" allocations
+-   * (< 15 KiB), but assumes the default zone is a scalable_zone.  This
+-   * obviously fails when the default zone is the jemalloc zone, so
+-   * malloc_default_purgeable_zone is called beforehand so that the
+-   * default purgeable zone is created when the default zone is still
+-   * a scalable_zone.
+-   */
+-  malloc_zone_t *purgeable_zone = malloc_default_purgeable_zone();
+-
+-  // There is a problem related to the above with the system nano zone, which
+-  // is hard to work around from here, and that is instead worked around by
+-  // disabling the nano zone through an environment variable
+-  // (MallocNanoZone=0). In Firefox, we do that through
+-  // browser/app/macbuild/Contents/Info.plist.in.
+-
+-  /* Register the custom zone.  At this point it won't be the default. */
+-  malloc_zone_register(&zone);
+-
+-  do {
+-    /*
+-     * Unregister and reregister the default zone.  On OSX >= 10.6,
+-     * unregistering takes the last registered zone and places it at the
+-     * location of the specified zone.  Unregistering the default zone thus
+-     * makes the last registered one the default.  On OSX < 10.6,
+-     * unregistering shifts all registered zones.  The first registered zone
+-     * then becomes the default.
+-     */
+-    malloc_zone_unregister(default_zone);
+-    malloc_zone_register(default_zone);
+-    /*
+-     * On OSX 10.6, having the default purgeable zone appear before the default
+-     * zone makes some things crash because it thinks it owns the default
+-     * zone allocated pointers. We thus unregister/re-register it in order to
+-     * ensure it's always after the default zone. On OSX < 10.6, as
+-     * unregistering shifts registered zones, this simply removes the purgeable
+-     * zone from the list and adds it back at the end, after the default zone.
+-     * On OSX >= 10.6, unregistering replaces the purgeable zone with the last
+-     * registered zone above, i.e the default zone. Registering it again then
+-     * puts it at the end, obviously after the default zone.
+-     */
+-    malloc_zone_unregister(purgeable_zone);
+-    malloc_zone_register(purgeable_zone);
+-    default_zone = get_default_zone();
+-  } while (default_zone != &zone);
+-}
+-#endif
+diff --git a/memory/build/replace_malloc.c b/memory/build/zone.c
+copy from memory/build/replace_malloc.c
+copy to memory/build/zone.c
+--- a/memory/build/replace_malloc.c
++++ b/memory/build/zone.c
+@@ -2,107 +2,11 @@
+  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+  * You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
+-#ifndef MOZ_MEMORY
+-#  error Should not compile this file when MOZ_MEMORY is not set
+-#endif
+-
+-#ifndef MOZ_REPLACE_MALLOC
+-#  error Should not compile this file when replace-malloc is disabled
+-#endif
+-
+-#ifdef MOZ_SYSTEM_JEMALLOC
+-#  error Should not compile this file when we want to use native jemalloc
+-#endif
+-
+ #include "mozmemory_wrap.h"
+ 
+-/* Declare all je_* functions */
+-#define MALLOC_DECL(name, return_type, ...) \
+-  return_type je_ ## name(__VA_ARGS__);
+-#include "malloc_decls.h"
+-
+-#include "mozilla/Likely.h"
+-
+-/*
+- * Windows doesn't come with weak imports as they are possible with
+- * LD_PRELOAD or DYLD_INSERT_LIBRARIES on Linux/OSX. On this platform,
+- * the replacement functions are defined as variable pointers to the
+- * function resolved with GetProcAddress() instead of weak definitions
+- * of functions. On Android, the same needs to happen as well, because
+- * the Android linker doesn't handle weak linking with non LD_PRELOADed
+- * libraries, but LD_PRELOADing is not very convenient on Android, with
+- * the zygote.
+- */
+-#ifdef XP_DARWIN
+-#  define MOZ_REPLACE_WEAK __attribute__((weak_import))
+-#elif defined(XP_WIN) || defined(MOZ_WIDGET_ANDROID)
+-#  define MOZ_NO_REPLACE_FUNC_DECL
+-#elif defined(__GNUC__)
+-#  define MOZ_REPLACE_WEAK __attribute__((weak))
+-#endif
+-
+-#include "replace_malloc.h"
+-
+-#define MALLOC_DECL(name, return_type, ...) \
+-    je_ ## name,
+-
+-static const malloc_table_t malloc_table = {
+-#include "malloc_decls.h"
+-};
+-
+-#ifdef MOZ_NO_REPLACE_FUNC_DECL
+-#  define MALLOC_DECL(name, return_type, ...) \
+-    typedef return_type (replace_ ## name ## _impl_t)(__VA_ARGS__); \
+-    replace_ ## name ## _impl_t *replace_ ## name = NULL;
+-#  define MALLOC_FUNCS MALLOC_FUNCS_ALL
+-#  include "malloc_decls.h"
+-
+-#  ifdef XP_WIN
+-#    include <windows.h>
+-static void
+-replace_malloc_init_funcs()
+-{
+-  char replace_malloc_lib[1024];
+-  if (GetEnvironmentVariableA("MOZ_REPLACE_MALLOC_LIB", (LPSTR)&replace_malloc_lib,
+-                              sizeof(replace_malloc_lib)) > 0) {
+-    HMODULE handle = LoadLibraryA(replace_malloc_lib);
+-    if (handle) {
+-#define MALLOC_DECL(name, ...) \
+-  replace_ ## name = (replace_ ## name ## _impl_t *) GetProcAddress(handle, "replace_" # name);
+-
+-#  define MALLOC_FUNCS MALLOC_FUNCS_ALL
+-#include "malloc_decls.h"
+-    }
+-  }
+-}
+-#  elif defined(MOZ_WIDGET_ANDROID)
+-#    include <dlfcn.h>
+-#    include <stdlib.h>
+-static void
+-replace_malloc_init_funcs()
+-{
+-  const char *replace_malloc_lib = getenv("MOZ_REPLACE_MALLOC_LIB");
+-  if (replace_malloc_lib && *replace_malloc_lib) {
+-    void *handle = dlopen(replace_malloc_lib, RTLD_LAZY);
+-    if (handle) {
+-#define MALLOC_DECL(name, ...) \
+-  replace_ ## name = (replace_ ## name ## _impl_t *) dlsym(handle, "replace_" # name);
+-
+-#  define MALLOC_FUNCS MALLOC_FUNCS_ALL
+-#include "malloc_decls.h"
+-    }
+-  }
+-}
+-#  else
+-#    error No implementation for replace_malloc_init_funcs()
+-#  endif
+-
+-#endif /* MOZ_NO_REPLACE_FUNC_DECL */
+-
+-/*
+- * Below is the malloc implementation overriding jemalloc and calling the
+- * replacement functions if they exist.
+- */
++#include <stdlib.h>
++#include <malloc/malloc.h>
++#include "mozilla/Assertions.h"
+ 
+ /*
+  * Malloc implementation functions are MOZ_MEMORY_API, and jemalloc
+@@ -118,189 +22,6 @@
+ #define MALLOC_FUNCS MALLOC_FUNCS_JEMALLOC
+ #include "malloc_decls.h"
+ 
+-static int replace_malloc_initialized = 0;
+-static void
+-init()
+-{
+-#ifdef MOZ_NO_REPLACE_FUNC_DECL
+-  replace_malloc_init_funcs();
+-#endif
+-  // Set this *before* calling replace_init, otherwise if replace_init calls
+-  // malloc() we'll get an infinite loop.
+-  replace_malloc_initialized = 1;
+-  if (replace_init)
+-    replace_init(&malloc_table);
+-}
+-
+-MFBT_API struct ReplaceMallocBridge*
+-get_bridge(void)
+-{
+-  if (MOZ_UNLIKELY(!replace_malloc_initialized))
+-    init();
+-  if (MOZ_LIKELY(!replace_get_bridge))
+-    return NULL;
+-  return replace_get_bridge();
+-}
+-
+-void*
+-malloc_impl(size_t size)
+-{
+-  if (MOZ_UNLIKELY(!replace_malloc_initialized))
+-    init();
+-  if (MOZ_LIKELY(!replace_malloc))
+-    return je_malloc(size);
+-  return replace_malloc(size);
+-}
+-
+-int
+-posix_memalign_impl(void **memptr, size_t alignment, size_t size)
+-{
+-  if (MOZ_UNLIKELY(!replace_malloc_initialized))
+-    init();
+-  if (MOZ_LIKELY(!replace_posix_memalign))
+-    return je_posix_memalign(memptr, alignment, size);
+-  return replace_posix_memalign(memptr, alignment, size);
+-}
+-
+-void*
+-aligned_alloc_impl(size_t alignment, size_t size)
+-{
+-  if (MOZ_UNLIKELY(!replace_malloc_initialized))
+-    init();
+-  if (MOZ_LIKELY(!replace_aligned_alloc))
+-    return je_aligned_alloc(alignment, size);
+-  return replace_aligned_alloc(alignment, size);
+-}
+-
+-void*
+-calloc_impl(size_t num, size_t size)
+-{
+-  if (MOZ_UNLIKELY(!replace_malloc_initialized))
+-    init();
+-  if (MOZ_LIKELY(!replace_calloc))
+-    return je_calloc(num, size);
+-  return replace_calloc(num, size);
+-}
+-
+-void*
+-realloc_impl(void *ptr, size_t size)
+-{
+-  if (MOZ_UNLIKELY(!replace_malloc_initialized))
+-    init();
+-  if (MOZ_LIKELY(!replace_realloc))
+-    return je_realloc(ptr, size);
+-  return replace_realloc(ptr, size);
+-}
+-
+-void
+-free_impl(void *ptr)
+-{
+-  if (MOZ_UNLIKELY(!replace_malloc_initialized))
+-    init();
+-  if (MOZ_LIKELY(!replace_free))
+-    je_free(ptr);
+-  else
+-    replace_free(ptr);
+-}
+-
+-void*
+-memalign_impl(size_t alignment, size_t size)
+-{
+-  if (MOZ_UNLIKELY(!replace_malloc_initialized))
+-    init();
+-  if (MOZ_LIKELY(!replace_memalign))
+-    return je_memalign(alignment, size);
+-  return replace_memalign(alignment, size);
+-}
+-
+-void*
+-valloc_impl(size_t size)
+-{
+-  if (MOZ_UNLIKELY(!replace_malloc_initialized))
+-    init();
+-  if (MOZ_LIKELY(!replace_valloc))
+-    return je_valloc(size);
+-  return replace_valloc(size);
+-}
+-
+-size_t
+-malloc_usable_size_impl(usable_ptr_t ptr)
+-{
+-  if (MOZ_UNLIKELY(!replace_malloc_initialized))
+-    init();
+-  if (MOZ_LIKELY(!replace_malloc_usable_size))
+-    return je_malloc_usable_size(ptr);
+-  return replace_malloc_usable_size(ptr);
+-}
+-
+-size_t
+-malloc_good_size_impl(size_t size)
+-{
+-  if (MOZ_UNLIKELY(!replace_malloc_initialized))
+-    init();
+-  if (MOZ_LIKELY(!replace_malloc_good_size))
+-    return je_malloc_good_size(size);
+-  return replace_malloc_good_size(size);
+-}
+-
+-void
+-jemalloc_stats_impl(jemalloc_stats_t *stats)
+-{
+-  if (MOZ_UNLIKELY(!replace_malloc_initialized))
+-    init();
+-  if (MOZ_LIKELY(!replace_jemalloc_stats))
+-    je_jemalloc_stats(stats);
+-  else
+-    replace_jemalloc_stats(stats);
+-}
+-
+-void
+-jemalloc_purge_freed_pages_impl()
+-{
+-  if (MOZ_UNLIKELY(!replace_malloc_initialized))
+-    init();
+-  if (MOZ_LIKELY(!replace_jemalloc_purge_freed_pages))
+-    je_jemalloc_purge_freed_pages();
+-  else
+-    replace_jemalloc_purge_freed_pages();
+-}
+-
+-void
+-jemalloc_free_dirty_pages_impl()
+-{
+-  if (MOZ_UNLIKELY(!replace_malloc_initialized))
+-    init();
+-  if (MOZ_LIKELY(!replace_jemalloc_free_dirty_pages))
+-    je_jemalloc_free_dirty_pages();
+-  else
+-    replace_jemalloc_free_dirty_pages();
+-}
+-
+-/* The following comment and definitions are from jemalloc.c: */
+-#if defined(__GLIBC__) && !defined(__UCLIBC__)
+-
+-/*
+- * glibc provides the RTLD_DEEPBIND flag for dlopen which can make it possible
+- * to inconsistently reference libc's malloc(3)-compatible functions
+- * (https://bugzilla.mozilla.org/show_bug.cgi?id=493541).
+- *
+- * These definitions interpose hooks in glibc.  The functions are actually
+- * passed an extra argument for the caller return address, which will be
+- * ignored.
+- */
+-
+-typedef void (* __free_hook_type)(void *ptr);
+-typedef void *(* __malloc_hook_type)(size_t size);
+-typedef void *(* __realloc_hook_type)(void *ptr, size_t size);
+-typedef void *(* __memalign_hook_type)(size_t alignment, size_t size);
+-
+-MOZ_MEMORY_API __free_hook_type __free_hook = free_impl;
+-MOZ_MEMORY_API __malloc_hook_type __malloc_hook = malloc_impl;
+-MOZ_MEMORY_API __realloc_hook_type __realloc_hook = realloc_impl;
+-MOZ_MEMORY_API __memalign_hook_type __memalign_hook = memalign_impl;
+-
+-#endif
+-
+ /*
+  * The following is a OSX zone allocator implementation.
+  * /!\ WARNING. It assumes the underlying malloc implementation's
+@@ -309,11 +30,6 @@
+  * owned by the allocator.
+  */
+ 
+-#ifdef XP_DARWIN
+-#include <stdlib.h>
+-#include <malloc/malloc.h>
+-#include "mozilla/Assertions.h"
+-
+ static size_t
+ zone_size(malloc_zone_t *zone, void *ptr)
+ {
+@@ -556,4 +272,3 @@
+     default_zone = get_default_zone();
+   } while (default_zone != &zone);
+ }
+-#endif

+ 848 - 0
mozilla-esr52/patches/mozilla-esr52-push_355269.patch

@@ -0,0 +1,848 @@
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1484707545 -32400
+#      Wed Jan 18 11:45:45 2017 +0900
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID e2289a5148001a8b680875adbe11ce7835f15292
+# Parent  7d0dd01d7dd4712ea8be076e9e03d67a5948b1f8
+Bug 1286613 - Use the same zone allocator implementation as replace-malloc for mozjemalloc. r=njn a=jorgk
+
+We have been using a different zone allocator between mozjemalloc and
+replace-malloc for a long time. Jemalloc 4 uses the same as
+replace-malloc, albeit as part of the jemalloc upstream code base.
+
+We've been bitten many times in the past with Apple changes breaking the
+zone allocator, and each time we've had to make changes to the three
+instances, although two of them are similar and the changes there are
+straightforward.
+
+It also turns out that the way the mozjemalloc zone allocator is set up,
+when a new version of OSX appears with a new version of the system zone
+allocator, Firefox ends up using the system allocator, because the zone
+allocator version is not supported.
+
+So, we use the same zone allocator for both replace-malloc and
+mozjemalloc, making everything on par with jemalloc 4.
+
+diff --git a/memory/build/moz.build b/memory/build/moz.build
+--- a/memory/build/moz.build
++++ b/memory/build/moz.build
+@@ -34,20 +34,21 @@ if CONFIG['MOZ_JEMALLOC4']:
+         if not CONFIG['HAVE_INTTYPES_H']:
+             LOCAL_INCLUDES += ['/memory/jemalloc/src/include/msvc_compat/C99']
+ 
+ if CONFIG['MOZ_REPLACE_MALLOC']:
+     SOURCES += [
+         'replace_malloc.c',
+     ]
+ 
+-    if CONFIG['OS_TARGET'] == 'Darwin':
+-        SOURCES += [
+-            'zone.c',
+-        ]
++if CONFIG['OS_TARGET'] == 'Darwin' and (CONFIG['MOZ_REPLACE_MALLOC'] or
++        CONFIG['MOZ_MEMORY'] and not CONFIG['MOZ_JEMALLOC4']):
++    SOURCES += [
++        'zone.c',
++    ]
+ 
+ Library('memory')
+ 
+ if CONFIG['MOZ_GLUE_IN_PROGRAM']:
+     SDK_LIBRARY = True
+     DIST_INSTALL = True
+ 
+ # Keep jemalloc separated when mozglue is statically linked
+diff --git a/memory/build/zone.c b/memory/build/zone.c
+--- a/memory/build/zone.c
++++ b/memory/build/zone.c
+@@ -178,29 +178,36 @@ static malloc_zone_t *get_default_zone()
+   }
+   if (num_zones) {
+     return zones[0];
+   }
+   return malloc_default_zone();
+ }
+ 
+ 
+-__attribute__((constructor)) void
++#ifdef MOZ_REPLACE_MALLOC
++__attribute__((constructor))
++#endif
++void
+ register_zone(void)
+ {
+   malloc_zone_t *default_zone = get_default_zone();
+ 
+   zone.size = (void *)zone_size;
+   zone.malloc = (void *)zone_malloc;
+   zone.calloc = (void *)zone_calloc;
+   zone.valloc = (void *)zone_valloc;
+   zone.free = (void *)zone_free;
+   zone.realloc = (void *)zone_realloc;
+   zone.destroy = (void *)zone_destroy;
++#ifdef MOZ_REPLACE_MALLOC
+   zone.zone_name = "replace_malloc_zone";
++#else
++  zone.zone_name = "jemalloc_zone";
++#endif
+   zone.batch_malloc = NULL;
+   zone.batch_free = NULL;
+   zone.introspect = &zone_introspect;
+   zone.version = JEMALLOC_ZONE_VERSION;
+   zone.memalign = zone_memalign;
+   zone.free_definite_size = zone_free_definite_size;
+ #if (JEMALLOC_ZONE_VERSION >= 8)
+   zone.pressure_relief = NULL;
+diff --git a/memory/mozjemalloc/jemalloc.c b/memory/mozjemalloc/jemalloc.c
+--- a/memory/mozjemalloc/jemalloc.c
++++ b/memory/mozjemalloc/jemalloc.c
+@@ -1455,75 +1455,16 @@ bool		malloc_init_hard(void);
+ static
+ #endif
+ void	_malloc_prefork(void);
+ #ifndef MOZ_MEMORY_DARWIN
+ static
+ #endif
+ void	_malloc_postfork(void);
+ 
+-#ifdef MOZ_MEMORY_DARWIN
+-/*
+- * MALLOC_ZONE_T_NOTE
+- *
+- * On Darwin, we hook into the memory allocator using a malloc_zone_t struct.
+- * We must be very careful around this struct because of different behaviour on
+- * different versions of OSX.
+- *
+- * Each of OSX 10.5, 10.6 and 10.7 use different versions of the struct
+- * (with version numbers 3, 6 and 8 respectively). The binary we use on each of
+- * these platforms will not necessarily be built using the correct SDK [1].
+- * This means we need to statically know the correct struct size to use on all
+- * OSX releases, and have a fallback for unknown future versions. The struct
+- * sizes defined in osx_zone_types.h.
+- *
+- * For OSX 10.8 and later, we may expect the malloc_zone_t struct to change
+- * again, and need to dynamically account for this. By simply leaving
+- * malloc_zone_t alone, we don't quite deal with the problem, because there
+- * remain calls to jemalloc through the mozalloc interface. We check this
+- * dynamically on each allocation, using the CHECK_DARWIN macro and
+- * osx_use_jemalloc.
+- *
+- *
+- * [1] Mozilla is built as a universal binary on Mac, supporting i386 and
+- *     x86_64. The i386 target is built using the 10.5 SDK, even if it runs on
+- *     10.6. The x86_64 target is built using the 10.6 SDK, even if it runs on
+- *     10.7 or later, or 10.5.
+- *
+- * FIXME:
+- *   When later versions of OSX come out (10.8 and up), we need to check their
+- *   malloc_zone_t versions. If they're greater than 8, we need a new version
+- *   of malloc_zone_t adapted into osx_zone_types.h.
+- */
+-
+-#ifndef MOZ_REPLACE_MALLOC
+-#include "osx_zone_types.h"
+-
+-#define LEOPARD_MALLOC_ZONE_T_VERSION 3
+-#define SNOW_LEOPARD_MALLOC_ZONE_T_VERSION 6
+-#define LION_MALLOC_ZONE_T_VERSION 8
+-
+-static bool osx_use_jemalloc = false;
+-
+-
+-static lion_malloc_zone l_szone;
+-static malloc_zone_t * szone = (malloc_zone_t*)(&l_szone);
+-
+-static lion_malloc_introspection l_ozone_introspect;
+-static malloc_introspection_t * const ozone_introspect =
+-	(malloc_introspection_t*)(&l_ozone_introspect);
+-static malloc_zone_t *get_default_zone();
+-static void szone2ozone(malloc_zone_t *zone, size_t size);
+-static size_t zone_version_size(int version);
+-#else
+-static const bool osx_use_jemalloc = true;
+-#endif
+-
+-#endif
+-
+ /*
+  * End function prototypes.
+  */
+ /******************************************************************************/
+ 
+ static inline size_t
+ load_acquire_z(size_t *p)
+ {
+@@ -5581,32 +5522,33 @@ malloc_init(void)
+ 
+ 	if (malloc_initialized == false)
+ 		return (malloc_init_hard());
+ 
+ 	return (false);
+ }
+ #endif
+ 
++#if defined(MOZ_MEMORY_DARWIN) && !defined(MOZ_REPLACE_MALLOC)
++extern void register_zone(void);
++#endif
++
+ #if !defined(MOZ_MEMORY_WINDOWS)
+ static
+ #endif
+ bool
+ malloc_init_hard(void)
+ {
+ 	unsigned i;
+ 	char buf[PATH_MAX + 1];
+ 	const char *opts;
+ 	long result;
+ #ifndef MOZ_MEMORY_WINDOWS
+ 	int linklen;
+ #endif
+-#ifdef MOZ_MEMORY_DARWIN
+-    malloc_zone_t* default_zone;
+-#endif
+ 
+ #ifndef MOZ_MEMORY_WINDOWS
+ 	malloc_mutex_lock(&init_lock);
+ #endif
+ 
+ 	if (malloc_initialized) {
+ 		/*
+ 		 * Another thread initialized the allocator before this one
+@@ -6102,55 +6044,17 @@ MALLOC_OUT:
+ 
+ #if defined(NEEDS_PTHREAD_MMAP_UNALIGNED_TSD)
+ 	if (pthread_key_create(&mmap_unaligned_tsd, NULL) != 0) {
+ 		malloc_printf("<jemalloc>: Error in pthread_key_create()\n");
+ 	}
+ #endif
+ 
+ #if defined(MOZ_MEMORY_DARWIN) && !defined(MOZ_REPLACE_MALLOC)
+-	/*
+-	* Overwrite the default memory allocator to use jemalloc everywhere.
+-	*/
+-	default_zone = get_default_zone();
+-
+-	/*
+-	 * We only use jemalloc with MacOS 10.6 and 10.7.  jemalloc is disabled
+-	 * on 32-bit builds (10.5 and 32-bit 10.6) due to bug 702250, an
+-	 * apparent MacOS bug.  In fact, this code isn't even compiled on
+-	 * 32-bit builds.
+-	 *
+-	 * We'll have to update our code to work with newer versions, because
+-	 * the malloc zone layout is likely to change.
+-	 */
+-
+-	osx_use_jemalloc = (default_zone->version == SNOW_LEOPARD_MALLOC_ZONE_T_VERSION ||
+-			    default_zone->version == LION_MALLOC_ZONE_T_VERSION);
+-
+-	/* Allow us dynamically turn off jemalloc for testing. */
+-	if (getenv("NO_MAC_JEMALLOC")) {
+-		osx_use_jemalloc = false;
+-#ifdef __i386__
+-		malloc_printf("Warning: NO_MAC_JEMALLOC has no effect on "
+-			      "i386 machines (such as this one).\n");
+-#endif
+-	}
+-
+-	if (osx_use_jemalloc) {
+-		/*
+-		 * Convert the default szone to an "overlay zone" that is capable
+-		 * of deallocating szone-allocated objects, but allocating new
+-		 * objects from jemalloc.
+-		 */
+-		size_t size = zone_version_size(default_zone->version);
+-		szone2ozone(default_zone, size);
+-	}
+-	else {
+-		szone = default_zone;
+-	}
++	register_zone();
+ #endif
+ 
+ #ifndef MOZ_MEMORY_WINDOWS
+ 	malloc_mutex_unlock(&init_lock);
+ #endif
+ 	return (false);
+ }
+ 
+@@ -6167,42 +6071,21 @@ malloc_shutdown()
+ /*
+  * End general internal functions.
+  */
+ /******************************************************************************/
+ /*
+  * Begin malloc(3)-compatible functions.
+  */
+ 
+-/*
+- * Even though we compile with MOZ_MEMORY, we may have to dynamically decide
+- * not to use jemalloc, as discussed above. However, we call jemalloc
+- * functions directly from mozalloc. Since it's pretty dangerous to mix the
+- * allocators, we need to call the OSX allocators from the functions below,
+- * when osx_use_jemalloc is not (dynamically) set.
+- *
+- * Note that we assume jemalloc is enabled on i386.  This is safe because the
+- * only i386 versions of MacOS are 10.5 and 10.6, which we support.  We have to
+- * do this because madvise isn't in the malloc zone struct for 10.5.
+- *
+- * This means that NO_MAC_JEMALLOC doesn't work on i386.
+- */
+-#if defined(MOZ_MEMORY_DARWIN) && !defined(__i386__) && !defined(MOZ_REPLACE_MALLOC)
+-#define DARWIN_ONLY(A) if (!osx_use_jemalloc) { A; }
+-#else
+-#define DARWIN_ONLY(A)
+-#endif
+-
+ MOZ_MEMORY_API void *
+ malloc_impl(size_t size)
+ {
+ 	void *ret;
+ 
+-	DARWIN_ONLY(return (szone->malloc)(szone, size));
+-
+ 	if (malloc_init()) {
+ 		ret = NULL;
+ 		goto RETURN;
+ 	}
+ 
+ 	if (size == 0) {
+ #ifdef MALLOC_SYSV
+ 		if (opt_sysv == false)
+@@ -6275,18 +6158,16 @@ memalign_impl(size_t alignment, size_t s
+ #ifndef MOZ_MEMORY_ELF
+ MOZ_MEMORY_API
+ #endif
+ void *
+ MEMALIGN(size_t alignment, size_t size)
+ {
+ 	void *ret;
+ 
+-	DARWIN_ONLY(return (szone->memalign)(szone, alignment, size));
+-
+ 	assert(((alignment - 1) & alignment) == 0);
+ 
+ 	if (malloc_init()) {
+ 		ret = NULL;
+ 		goto RETURN;
+ 	}
+ 
+ 	if (size == 0) {
+@@ -6375,18 +6256,16 @@ valloc_impl(size_t size)
+ }
+ 
+ MOZ_MEMORY_API void *
+ calloc_impl(size_t num, size_t size)
+ {
+ 	void *ret;
+ 	size_t num_size;
+ 
+-	DARWIN_ONLY(return (szone->calloc)(szone, num, size));
+-
+ 	if (malloc_init()) {
+ 		num_size = 0;
+ 		ret = NULL;
+ 		goto RETURN;
+ 	}
+ 
+ 	num_size = num * size;
+ 	if (num_size == 0) {
+@@ -6431,18 +6310,16 @@ RETURN:
+ 	return (ret);
+ }
+ 
+ MOZ_MEMORY_API void *
+ realloc_impl(void *ptr, size_t size)
+ {
+ 	void *ret;
+ 
+-	DARWIN_ONLY(return (szone->realloc)(szone, ptr, size));
+-
+ 	if (size == 0) {
+ #ifdef MALLOC_SYSV
+ 		if (opt_sysv == false)
+ #endif
+ 			size = 1;
+ #ifdef MALLOC_SYSV
+ 		else {
+ 			if (ptr != NULL)
+@@ -6495,18 +6372,16 @@ RETURN:
+ 	return (ret);
+ }
+ 
+ MOZ_MEMORY_API void
+ free_impl(void *ptr)
+ {
+ 	size_t offset;
+ 
+-	DARWIN_ONLY((szone->free)(szone, ptr); return);
+-
+ 	UTRACE(ptr, 0, 0);
+ 
+ 	/*
+ 	 * A version of idalloc that checks for NULL pointer but only for
+ 	 * huge allocations assuming that CHUNK_ADDR2OFFSET(NULL) == 0.
+ 	 */
+ 	assert(CHUNK_ADDR2OFFSET(NULL) == 0);
+ 	offset = CHUNK_ADDR2OFFSET(ptr);
+@@ -6520,22 +6395,17 @@ free_impl(void *ptr)
+  * End malloc(3)-compatible functions.
+  */
+ /******************************************************************************/
+ /*
+  * Begin non-standard functions.
+  */
+ 
+ /* This was added by Mozilla for use by SQLite. */
+-#if defined(MOZ_MEMORY_DARWIN) && !defined(MOZ_REPLACE_MALLOC)
+-static
+-#else
+-MOZ_MEMORY_API
+-#endif
+-size_t
++MOZ_MEMORY_API size_t
+ malloc_good_size_impl(size_t size)
+ {
+ 	/*
+ 	 * This duplicates the logic in imalloc(), arena_malloc() and
+ 	 * arena_malloc_small().
+ 	 */
+ 	if (size < small_min) {
+ 		/* Small (tiny). */
+@@ -6567,18 +6437,16 @@ malloc_good_size_impl(size_t size)
+ 	}
+ 	return size;
+ }
+ 
+ 
+ MOZ_MEMORY_API size_t
+ malloc_usable_size_impl(MALLOC_USABLE_SIZE_CONST_PTR void *ptr)
+ {
+-	DARWIN_ONLY(return (szone->size)(szone, ptr));
+-
+ #ifdef MALLOC_VALIDATE
+ 	return (isalloc_validate(ptr));
+ #else
+ 	assert(ptr != NULL);
+ 
+ 	return (isalloc(ptr));
+ #endif
+ }
+@@ -6939,264 +6807,16 @@ void
+ /******************************************************************************/
+ 
+ #ifdef HAVE_DLOPEN
+ #  include <dlfcn.h>
+ #endif
+ 
+ #if defined(MOZ_MEMORY_DARWIN)
+ 
+-#if !defined(MOZ_REPLACE_MALLOC)
+-static void *
+-zone_malloc(malloc_zone_t *zone, size_t size)
+-{
+-
+-	return (malloc_impl(size));
+-}
+-
+-static void *
+-zone_calloc(malloc_zone_t *zone, size_t num, size_t size)
+-{
+-
+-	return (calloc_impl(num, size));
+-}
+-
+-static void *
+-zone_valloc(malloc_zone_t *zone, size_t size)
+-{
+-	void *ret = NULL; /* Assignment avoids useless compiler warning. */
+-
+-	posix_memalign_impl(&ret, pagesize, size);
+-
+-	return (ret);
+-}
+-
+-static void *
+-zone_memalign(malloc_zone_t *zone, size_t alignment, size_t size)
+-{
+-	return (memalign_impl(alignment, size));
+-}
+-
+-static void *
+-zone_destroy(malloc_zone_t *zone)
+-{
+-
+-	/* This function should never be called. */
+-	assert(false);
+-	return (NULL);
+-}
+-
+-static size_t
+-zone_good_size(malloc_zone_t *zone, size_t size)
+-{
+-	return malloc_good_size_impl(size);
+-}
+-
+-static size_t
+-ozone_size(malloc_zone_t *zone, void *ptr)
+-{
+-	size_t ret = isalloc_validate(ptr);
+-	if (ret == 0)
+-		ret = szone->size(zone, ptr);
+-
+-	return ret;
+-}
+-
+-static void
+-ozone_free(malloc_zone_t *zone, void *ptr)
+-{
+-	if (isalloc_validate(ptr) != 0)
+-		free_impl(ptr);
+-	else {
+-		size_t size = szone->size(zone, ptr);
+-		if (size != 0)
+-			(szone->free)(zone, ptr);
+-		/* Otherwise we leak. */
+-	}
+-}
+-
+-static void *
+-ozone_realloc(malloc_zone_t *zone, void *ptr, size_t size)
+-{
+-    size_t oldsize;
+-	if (ptr == NULL)
+-		return (malloc_impl(size));
+-
+-	oldsize = isalloc_validate(ptr);
+-	if (oldsize != 0)
+-		return (realloc_impl(ptr, size));
+-	else {
+-		oldsize = szone->size(zone, ptr);
+-		if (oldsize == 0)
+-			return (malloc_impl(size));
+-		else {
+-			void *ret = malloc_impl(size);
+-			if (ret != NULL) {
+-				memcpy(ret, ptr, (oldsize < size) ? oldsize :
+-				    size);
+-				(szone->free)(zone, ptr);
+-			}
+-			return (ret);
+-		}
+-	}
+-}
+-
+-static unsigned
+-ozone_batch_malloc(malloc_zone_t *zone, size_t size, void **results,
+-    unsigned num_requested)
+-{
+-	/* Don't bother implementing this interface, since it isn't required. */
+-	return 0;
+-}
+-
+-static void
+-ozone_batch_free(malloc_zone_t *zone, void **to_be_freed, unsigned num)
+-{
+-	unsigned i;
+-
+-	for (i = 0; i < num; i++)
+-		ozone_free(zone, to_be_freed[i]);
+-}
+-
+-static void
+-ozone_free_definite_size(malloc_zone_t *zone, void *ptr, size_t size)
+-{
+-	if (isalloc_validate(ptr) != 0) {
+-		assert(isalloc_validate(ptr) == size);
+-		free_impl(ptr);
+-	} else {
+-		assert(size == szone->size(zone, ptr));
+-		l_szone.m16(zone, ptr, size);
+-	}
+-}
+-
+-static void
+-ozone_force_lock(malloc_zone_t *zone)
+-{
+-	_malloc_prefork();
+-	szone->introspect->force_lock(zone);
+-}
+-
+-static void
+-ozone_force_unlock(malloc_zone_t *zone)
+-{
+-	szone->introspect->force_unlock(zone);
+-        _malloc_postfork();
+-}
+-
+-static size_t
+-zone_version_size(int version)
+-{
+-    switch (version)
+-    {
+-        case SNOW_LEOPARD_MALLOC_ZONE_T_VERSION:
+-            return sizeof(snow_leopard_malloc_zone);
+-        case LEOPARD_MALLOC_ZONE_T_VERSION:
+-            return sizeof(leopard_malloc_zone);
+-        default:
+-        case LION_MALLOC_ZONE_T_VERSION:
+-            return sizeof(lion_malloc_zone);
+-    }
+-}
+-
+-static malloc_zone_t *get_default_zone()
+-{
+-  malloc_zone_t **zones = NULL;
+-  unsigned int num_zones = 0;
+-
+-  /*
+-   * On OSX 10.12, malloc_default_zone returns a special zone that is not
+-   * present in the list of registered zones. That zone uses a "lite zone"
+-   * if one is present (apparently enabled when malloc stack logging is
+-   * enabled), or the first registered zone otherwise. In practice this
+-   * means unless malloc stack logging is enabled, the first registered
+-   * zone is the default.
+-   * So get the list of zones to get the first one, instead of relying on
+-   * malloc_default_zone.
+-   */
+-  if (KERN_SUCCESS != malloc_get_all_zones(0, NULL, (vm_address_t**) &zones,
+-                                           &num_zones)) {
+-    /* Reset the value in case the failure happened after it was set. */
+-    num_zones = 0;
+-  }
+-  if (num_zones) {
+-    return zones[0];
+-  }
+-  return malloc_default_zone();
+-}
+-
+-/*
+- * Overlay the default scalable zone (szone) such that existing allocations are
+- * drained, and further allocations come from jemalloc. This is necessary
+- * because Core Foundation directly accesses and uses the szone before the
+- * jemalloc library is even loaded.
+- */
+-static void
+-szone2ozone(malloc_zone_t *default_zone, size_t size)
+-{
+-    lion_malloc_zone *l_zone;
+-	assert(malloc_initialized);
+-
+-	/*
+-	 * Stash a copy of the original szone so that we can call its
+-	 * functions as needed. Note that internally, the szone stores its
+-	 * bookkeeping data structures immediately following the malloc_zone_t
+-	 * header, so when calling szone functions, we need to pass a pointer to
+-	 * the original zone structure.
+-	 */
+-	memcpy(szone, default_zone, size);
+-
+-	/* OSX 10.7 allocates the default zone in protected memory. */
+-	if (default_zone->version >= LION_MALLOC_ZONE_T_VERSION) {
+-		void* start_of_page = (void*)((size_t)(default_zone) & ~pagesize_mask);
+-		mprotect (start_of_page, size, PROT_READ | PROT_WRITE);
+-	}
+-
+-	default_zone->size = (void *)ozone_size;
+-	default_zone->malloc = (void *)zone_malloc;
+-	default_zone->calloc = (void *)zone_calloc;
+-	default_zone->valloc = (void *)zone_valloc;
+-	default_zone->free = (void *)ozone_free;
+-	default_zone->realloc = (void *)ozone_realloc;
+-	default_zone->destroy = (void *)zone_destroy;
+-	default_zone->batch_malloc = NULL;
+-	default_zone->batch_free = ozone_batch_free;
+-	default_zone->introspect = ozone_introspect;
+-
+-	/* Don't modify default_zone->zone_name; Mac libc may rely on the name
+-	 * being unchanged.  See Mozilla bug 694896. */
+-
+-	ozone_introspect->enumerator = NULL;
+-	ozone_introspect->good_size = (void *)zone_good_size;
+-	ozone_introspect->check = NULL;
+-	ozone_introspect->print = NULL;
+-	ozone_introspect->log = NULL;
+-	ozone_introspect->force_lock = (void *)ozone_force_lock;
+-	ozone_introspect->force_unlock = (void *)ozone_force_unlock;
+-	ozone_introspect->statistics = NULL;
+-
+-    /* Platform-dependent structs */
+-    l_zone = (lion_malloc_zone*)(default_zone);
+-
+-    if (default_zone->version >= SNOW_LEOPARD_MALLOC_ZONE_T_VERSION) {
+-        l_zone->m15 = (void (*)())zone_memalign;
+-        l_zone->m16 = (void (*)())ozone_free_definite_size;
+-        l_ozone_introspect.m9 = NULL;
+-    }
+-
+-    if (default_zone->version >= LION_MALLOC_ZONE_T_VERSION) {
+-        l_zone->m17 = NULL;
+-        l_ozone_introspect.m10 = NULL;
+-        l_ozone_introspect.m11 = NULL;
+-        l_ozone_introspect.m12 = NULL;
+-        l_ozone_introspect.m13 = NULL;
+-    }
+-}
+-#endif
+-
+ __attribute__((constructor))
+ void
+ jemalloc_darwin_init(void)
+ {
+ 	if (malloc_init_hard())
+ 		abort();
+ }
+ 
+diff --git a/memory/mozjemalloc/osx_zone_types.h b/memory/mozjemalloc/osx_zone_types.h
+deleted file mode 100644
+--- a/memory/mozjemalloc/osx_zone_types.h
++++ /dev/null
+@@ -1,147 +0,0 @@
+-/* -*- Mode: C; tab-width: 8; c-basic-offset: 8 -*- */
+-/* vim:set softtabstop=8 shiftwidth=8: */
+-/*-
+- * Copyright (C) 2006-2008 Jason Evans <jasone@FreeBSD.org>.
+- * All rights reserved.
+- *
+- * Redistribution and use in source and binary forms, with or without
+- * modification, are permitted provided that the following conditions
+- * are met:
+- * 1. Redistributions of source code must retain the above copyright
+- *    notice(s), this list of conditions and the following disclaimer as
+- *    the first lines of this file unmodified other than the possible
+- *    addition of one or more copyright notices.
+- * 2. Redistributions in binary form must reproduce the above copyright
+- *    notice(s), this list of conditions and the following disclaimer in
+- *    the documentation and/or other materials provided with the
+- *    distribution.
+- *
+- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
+- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE
+- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+- * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+- */
+-
+-/*
+- * The purpose of these structs is described in jemalloc.c, in the comment
+- * marked MALLOC_ZONE_T_NOTE.
+- *
+- * We need access to some structs that come with a specific version of OSX 
+- * but can't copy them here because of licensing restrictions (see bug
+- * 603655). The structs below are equivalent in that they'll always be
+- * compiled to the same representation on all platforms.
+- *
+- * `void*` and `void (*)()` may not be the same size on weird platforms, but
+- * the size of a function pointer shouldn't vary according to its parameters
+- * or return type.
+- *
+- * Apple's version of these structures, complete with member names and
+- * comments, is available online at
+- *
+- * http://www.opensource.apple.com/source/Libc/Libc-763.12/include/malloc/malloc.h
+- *
+- */
+-
+-/*
+- * OSX 10.5 - Leopard
+- */
+-typedef struct _leopard_malloc_zone {
+- 	void *m1;
+-	void *m2;
+-	void (*m3)();
+-	void (*m4)();
+-	void (*m5)();
+-	void (*m6)();
+-	void (*m7)();
+-	void (*m8)();
+-	void (*m9)();
+-	void *m10;
+-	void (*m11)();
+-	void (*m12)();
+-	void *m13;
+-	unsigned m14;
+-} leopard_malloc_zone;
+-
+-/*
+- * OSX 10.6 - Snow Leopard
+- */
+-typedef struct _snow_leopard_malloc_zone {
+-	void *m1;
+-	void *m2;
+-	void (*m3)();
+-	void (*m4)();
+-	void (*m5)();
+-	void (*m6)();
+-	void (*m7)();
+-	void (*m8)();
+-	void (*m9)();
+-	void *m10;
+-	void (*m11)();
+-	void (*m12)();
+-	void *m13;
+-	unsigned m14;
+-	void (*m15)(); // this member added in 10.6
+-	void (*m16)(); // this member added in 10.6
+-} snow_leopard_malloc_zone;
+-
+-typedef struct _snow_leopard_malloc_introspection {
+-    void (*m1)();
+-    void (*m2)();
+-    void (*m3)();
+-    void (*m4)();
+-    void (*m5)();
+-    void (*m6)();
+-    void (*m7)();
+-    void (*m8)();
+-    void (*m9)(); // this member added in 10.6
+-} snow_leopard_malloc_introspection;
+-
+-/*
+- * OSX 10.7 - Lion
+- */
+-typedef struct _lion_malloc_zone {
+-	void *m1;
+-	void *m2;
+-	void (*m3)();
+-	void (*m4)();
+-	void (*m5)();
+-	void (*m6)();
+-	void (*m7)();
+-	void (*m8)();
+-	void (*m9)();
+-	void *m10;
+-	void (*m11)();
+-	void (*m12)();
+-	void *m13;
+-	unsigned m14;
+-	void (*m15)();
+-	void (*m16)();
+-	void (*m17)(); // this member added in 10.7
+-} lion_malloc_zone;
+-
+-typedef struct _lion_malloc_introspection {
+-    void (*m1)();
+-    void (*m2)();
+-    void (*m3)();
+-    void (*m4)();
+-    void (*m5)();
+-    void (*m6)();
+-    void (*m7)();
+-    void (*m8)();
+-    void (*m9)();
+-    void (*m10)(); // this member added in 10.7
+-    void (*m11)(); // this member added in 10.7
+-    void (*m12)(); // this member added in 10.7
+-#ifdef __BLOCKS__
+-    void (*m13)(); // this member added in 10.7
+-#else
+-    void *m13; // this member added in 10.7
+-#endif
+-} lion_malloc_introspection;

+ 247 - 0
mozilla-esr52/patches/mozilla-esr52-push_355270.patch

@@ -0,0 +1,247 @@
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1484715035 -32400
+#      Wed Jan 18 13:50:35 2017 +0900
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID 7b2c4625fa0fe62cd659f3f7b226bd1b295185d5
+# Parent  e2289a5148001a8b680875adbe11ce7835f15292
+Bug 1286613 - Don't rely on OSX SDK malloc/malloc.h for malloc_zone struct definitions. r=njn a=jorgk
+
+The SDK jemalloc is built against might be not be the latest for various
+reasons, but the resulting binary ought to work on newer versions of
+OSX.
+
+In order to ensure this, we need the fullest definitions possible, so
+copy what we need from the latest version of malloc/malloc.h available
+on opensource.apple.com.
+
+[Adapted from
+https://github.com/jemalloc/jemalloc/commit/c68bb4179312665e22d375aecf9f4306607c7c1a]
+
+diff --git a/memory/build/zone.c b/memory/build/zone.c
+--- a/memory/build/zone.c
++++ b/memory/build/zone.c
+@@ -1,16 +1,16 @@
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+  * You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
+ #include "mozmemory_wrap.h"
+ 
+ #include <stdlib.h>
+-#include <malloc/malloc.h>
++#include <mach/mach_types.h>
+ #include "mozilla/Assertions.h"
+ 
+ /*
+  * Malloc implementation functions are MOZ_MEMORY_API, and jemalloc
+  * specific functions MOZ_JEMALLOC_API; see mozmemory_wrap.h
+  */
+ #define MALLOC_DECL(name, return_type, ...) \
+   MOZ_MEMORY_API return_type name ## _impl(__VA_ARGS__);
+@@ -18,25 +18,98 @@
+ #include "malloc_decls.h"
+ 
+ #define MALLOC_DECL(name, return_type, ...) \
+   MOZ_JEMALLOC_API return_type name ## _impl(__VA_ARGS__);
+ #define MALLOC_FUNCS MALLOC_FUNCS_JEMALLOC
+ #include "malloc_decls.h"
+ 
+ /*
++ * Definitions of the following structs in malloc/malloc.h might be too old
++ * for the built binary to run on newer versions of OSX. So use the newest
++ * possible version of those structs.
++ */
++typedef struct _malloc_zone_t {
++  void *reserved1;
++  void *reserved2;
++  size_t (*size)(struct _malloc_zone_t *, const void *);
++  void *(*malloc)(struct _malloc_zone_t *, size_t);
++  void *(*calloc)(struct _malloc_zone_t *, size_t, size_t);
++  void *(*valloc)(struct _malloc_zone_t *, size_t);
++  void (*free)(struct _malloc_zone_t *, void *);
++  void *(*realloc)(struct _malloc_zone_t *, void *, size_t);
++  void (*destroy)(struct _malloc_zone_t *);
++  const char *zone_name;
++  unsigned (*batch_malloc)(struct _malloc_zone_t *, size_t, void **, unsigned);
++  void (*batch_free)(struct _malloc_zone_t *, void **, unsigned);
++  struct malloc_introspection_t *introspect;
++  unsigned version;
++  void *(*memalign)(struct _malloc_zone_t *, size_t, size_t);
++  void (*free_definite_size)(struct _malloc_zone_t *, void *, size_t);
++  size_t (*pressure_relief)(struct _malloc_zone_t *, size_t);
++} malloc_zone_t;
++
++typedef struct {
++  vm_address_t address;
++  vm_size_t size;
++} vm_range_t;
++
++typedef struct malloc_statistics_t {
++  unsigned blocks_in_use;
++  size_t size_in_use;
++  size_t max_size_in_use;
++  size_t size_allocated;
++} malloc_statistics_t;
++
++typedef kern_return_t memory_reader_t(task_t, vm_address_t, vm_size_t, void **);
++
++typedef void vm_range_recorder_t(task_t, void *, unsigned type, vm_range_t *, unsigned);
++
++typedef struct malloc_introspection_t {
++  kern_return_t (*enumerator)(task_t, void *, unsigned, vm_address_t, memory_reader_t, vm_range_recorder_t);
++  size_t (*good_size)(malloc_zone_t *, size_t);
++  boolean_t (*check)(malloc_zone_t *);
++  void (*print)(malloc_zone_t *, boolean_t);
++  void (*log)(malloc_zone_t *, void *);
++  void (*force_lock)(malloc_zone_t *);
++  void (*force_unlock)(malloc_zone_t *);
++  void (*statistics)(malloc_zone_t *, malloc_statistics_t *);
++  boolean_t (*zone_locked)(malloc_zone_t *);
++  boolean_t (*enable_discharge_checking)(malloc_zone_t *);
++  boolean_t (*disable_discharge_checking)(malloc_zone_t *);
++  void (*discharge)(malloc_zone_t *, void *);
++#ifdef __BLOCKS__
++  void (*enumerate_discharged_pointers)(malloc_zone_t *, void (^)(void *, void *));
++#else
++  void *enumerate_unavailable_without_blocks;
++#endif
++  void (*reinit_lock)(malloc_zone_t *);
++} malloc_introspection_t;
++
++extern kern_return_t malloc_get_all_zones(task_t, memory_reader_t, vm_address_t **, unsigned *);
++
++extern malloc_zone_t *malloc_default_zone(void);
++
++extern void malloc_zone_register(malloc_zone_t *zone);
++
++extern void malloc_zone_unregister(malloc_zone_t *zone);
++
++extern malloc_zone_t *malloc_default_purgeable_zone(void);
++
++
++/*
+  * The following is a OSX zone allocator implementation.
+  * /!\ WARNING. It assumes the underlying malloc implementation's
+  * malloc_usable_size returns 0 when the given pointer is not owned by
+  * the allocator. Sadly, OSX does call zone_size with pointers not
+  * owned by the allocator.
+  */
+ 
+ static size_t
+-zone_size(malloc_zone_t *zone, void *ptr)
++zone_size(malloc_zone_t *zone, const void *ptr)
+ {
+   return malloc_usable_size_impl(ptr);
+ }
+ 
+ static void *
+ zone_malloc(malloc_zone_t *zone, size_t size)
+ {
+   return malloc_impl(size);
+@@ -88,17 +161,17 @@ zone_memalign(malloc_zone_t *zone, size_
+ }
+ 
+ static void *
+ zone_valloc(malloc_zone_t *zone, size_t size)
+ {
+   return valloc_impl(size);
+ }
+ 
+-static void *
++static void
+ zone_destroy(malloc_zone_t *zone)
+ {
+   /* This function should never be called. */
+   MOZ_CRASH();
+ }
+ 
+ static size_t
+ zone_good_size(malloc_zone_t *zone, size_t size)
+@@ -125,18 +198,16 @@ zone_force_unlock(malloc_zone_t *zone)
+   /* /!\ This calls into jemalloc. It works because we're linked in the
+    * same library. Stolen from jemalloc's zone.c. */
+   if (isthreaded)
+     jemalloc_postfork_parent();
+ }
+ 
+ #else
+ 
+-#define JEMALLOC_ZONE_VERSION 6
+-
+ extern void _malloc_prefork(void);
+ extern void _malloc_postfork(void);
+ 
+ static void
+ zone_force_lock(malloc_zone_t *zone)
+ {
+   /* /!\ This calls into mozjemalloc. It works because we're linked in the
+    * same library. */
+@@ -186,56 +257,52 @@ static malloc_zone_t *get_default_zone()
+ #ifdef MOZ_REPLACE_MALLOC
+ __attribute__((constructor))
+ #endif
+ void
+ register_zone(void)
+ {
+   malloc_zone_t *default_zone = get_default_zone();
+ 
+-  zone.size = (void *)zone_size;
+-  zone.malloc = (void *)zone_malloc;
+-  zone.calloc = (void *)zone_calloc;
+-  zone.valloc = (void *)zone_valloc;
+-  zone.free = (void *)zone_free;
+-  zone.realloc = (void *)zone_realloc;
+-  zone.destroy = (void *)zone_destroy;
++  zone.size = zone_size;
++  zone.malloc = zone_malloc;
++  zone.calloc = zone_calloc;
++  zone.valloc = zone_valloc;
++  zone.free = zone_free;
++  zone.realloc = zone_realloc;
++  zone.destroy = zone_destroy;
+ #ifdef MOZ_REPLACE_MALLOC
+   zone.zone_name = "replace_malloc_zone";
+ #else
+   zone.zone_name = "jemalloc_zone";
+ #endif
+   zone.batch_malloc = NULL;
+   zone.batch_free = NULL;
+   zone.introspect = &zone_introspect;
+-  zone.version = JEMALLOC_ZONE_VERSION;
++  zone.version = 8;
+   zone.memalign = zone_memalign;
+   zone.free_definite_size = zone_free_definite_size;
+-#if (JEMALLOC_ZONE_VERSION >= 8)
+   zone.pressure_relief = NULL;
+-#endif
+   zone_introspect.enumerator = NULL;
+-  zone_introspect.good_size = (void *)zone_good_size;
++  zone_introspect.good_size = zone_good_size;
+   zone_introspect.check = NULL;
+   zone_introspect.print = NULL;
+   zone_introspect.log = NULL;
+-  zone_introspect.force_lock = (void *)zone_force_lock;
+-  zone_introspect.force_unlock = (void *)zone_force_unlock;
++  zone_introspect.force_lock = zone_force_lock;
++  zone_introspect.force_unlock = zone_force_unlock;
+   zone_introspect.statistics = NULL;
+   zone_introspect.zone_locked = NULL;
+-#if (JEMALLOC_ZONE_VERSION >= 7)
+   zone_introspect.enable_discharge_checking = NULL;
+   zone_introspect.disable_discharge_checking = NULL;
+   zone_introspect.discharge = NULL;
+ #ifdef __BLOCKS__
+   zone_introspect.enumerate_discharged_pointers = NULL;
+ #else
+   zone_introspect.enumerate_unavailable_without_blocks = NULL;
+ #endif
+-#endif
+ 
+   /*
+    * The default purgeable zone is created lazily by OSX's libc.  It uses
+    * the default zone when it is created for "small" allocations
+    * (< 15 KiB), but assumes the default zone is a scalable_zone.  This
+    * obviously fails when the default zone is the jemalloc zone, so
+    * malloc_default_purgeable_zone is called beforehand so that the
+    * default purgeable zone is created when the default zone is still

+ 212 - 0
mozilla-esr52/patches/mozilla-esr52-push_355271.patch

@@ -0,0 +1,212 @@
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1484717711 -32400
+#      Wed Jan 18 14:35:11 2017 +0900
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID 2070ab8bedb27c8c85324a4083655f499e48e78b
+# Parent  7b2c4625fa0fe62cd659f3f7b226bd1b295185d5
+Bug 1286613 - Add dummy implementations for most remaining OSX zone allocator functions. r=njn a=jorgk
+
+Some system libraries are using malloc_default_zone() and then using
+some of the malloc_zone_* API. Under normal conditions, those functions
+check the malloc_zone_t/malloc_introspection_t struct for the values
+that are allowed to be NULL, so that a NULL deref doesn't happen.
+
+As of OSX 10.12, malloc_default_zone() doesn't return the actual default
+zone anymore, but returns a fake, wrapper zone. The wrapper zone defines
+all the possible functions in the malloc_zone_t/malloc_introspection_t
+struct (almost), and calls the function from the registered default zone
+(jemalloc in our case) on its own. Without checking whether the pointers
+are NULL.
+
+This means that a system library that calls e.g.
+malloc_zone_batch_malloc(malloc_default_zone(), ...) ends up trying to
+call jemalloc_zone.batch_malloc, which is NULL, and crash follows.
+
+So as of OSX 10.12, the default zone is required to have all the
+functions available (really, the same as the wrapper zone), even if they
+do nothing.
+
+This is arguably a bug in libsystem_malloc in OSX 10.12, but jemalloc
+still needs to work in that case.
+
+[Adapted from
+https://github.com/jemalloc/jemalloc/commit/c6943acb3c56d1b3d1e82dd43b3fcfeae7771990]
+
+diff --git a/memory/build/zone.c b/memory/build/zone.c
+--- a/memory/build/zone.c
++++ b/memory/build/zone.c
+@@ -168,22 +168,79 @@ zone_valloc(malloc_zone_t *zone, size_t 
+ 
+ static void
+ zone_destroy(malloc_zone_t *zone)
+ {
+   /* This function should never be called. */
+   MOZ_CRASH();
+ }
+ 
++static unsigned
++zone_batch_malloc(malloc_zone_t *zone, size_t size, void **results,
++    unsigned num_requested)
++{
++  unsigned i;
++
++  for (i = 0; i < num_requested; i++) {
++    results[i] = malloc_impl(size);
++    if (!results[i])
++      break;
++  }
++
++  return i;
++}
++
++static void
++zone_batch_free(malloc_zone_t *zone, void **to_be_freed,
++    unsigned num_to_be_freed)
++{
++  unsigned i;
++
++  for (i = 0; i < num_to_be_freed; i++) {
++    zone_free(zone, to_be_freed[i]);
++    to_be_freed[i] = NULL;
++  }
++}
++
++static size_t
++zone_pressure_relief(malloc_zone_t *zone, size_t goal)
++{
++  return 0;
++}
++
+ static size_t
+ zone_good_size(malloc_zone_t *zone, size_t size)
+ {
+   return malloc_good_size_impl(size);
+ }
+ 
++static kern_return_t
++zone_enumerator(task_t task, void *data, unsigned type_mask,
++    vm_address_t zone_address, memory_reader_t reader,
++    vm_range_recorder_t recorder)
++{
++  return KERN_SUCCESS;
++}
++
++static boolean_t
++zone_check(malloc_zone_t *zone)
++{
++  return true;
++}
++
++static void
++zone_print(malloc_zone_t *zone, boolean_t verbose)
++{
++}
++
++static void
++zone_log(malloc_zone_t *zone, void *address)
++{
++}
++
+ #ifdef MOZ_JEMALLOC
+ 
+ #include "jemalloc/internal/jemalloc_internal.h"
+ 
+ static void
+ zone_force_lock(malloc_zone_t *zone)
+ {
+   /* /!\ This calls into jemalloc. It works because we're linked in the
+@@ -219,16 +276,41 @@ zone_force_unlock(malloc_zone_t *zone)
+ {
+   /* /!\ This calls into mozjemalloc. It works because we're linked in the
+    * same library. */
+   _malloc_postfork();
+ }
+ 
+ #endif
+ 
++static void
++zone_statistics(malloc_zone_t *zone, malloc_statistics_t *stats)
++{
++  /* We make no effort to actually fill the values */
++  stats->blocks_in_use = 0;
++  stats->size_in_use = 0;
++  stats->max_size_in_use = 0;
++  stats->size_allocated = 0;
++}
++
++static boolean_t
++zone_locked(malloc_zone_t *zone)
++{
++  /* Pretend no lock is being held */
++  return false;
++}
++
++static void
++zone_reinit_lock(malloc_zone_t *zone)
++{
++  /* As of OSX 10.12, this function is only used when force_unlock would
++   * be used if the zone version were < 9. So just use force_unlock. */
++  zone_force_unlock(zone);
++}
++
+ static malloc_zone_t zone;
+ static struct malloc_introspection_t zone_introspect;
+ 
+ static malloc_zone_t *get_default_zone()
+ {
+   malloc_zone_t **zones = NULL;
+   unsigned int num_zones = 0;
+ 
+@@ -269,40 +351,41 @@ register_zone(void)
+   zone.free = zone_free;
+   zone.realloc = zone_realloc;
+   zone.destroy = zone_destroy;
+ #ifdef MOZ_REPLACE_MALLOC
+   zone.zone_name = "replace_malloc_zone";
+ #else
+   zone.zone_name = "jemalloc_zone";
+ #endif
+-  zone.batch_malloc = NULL;
+-  zone.batch_free = NULL;
++  zone.batch_malloc = zone_batch_malloc;
++  zone.batch_free = zone_batch_free;
+   zone.introspect = &zone_introspect;
+-  zone.version = 8;
++  zone.version = 9;
+   zone.memalign = zone_memalign;
+   zone.free_definite_size = zone_free_definite_size;
+-  zone.pressure_relief = NULL;
+-  zone_introspect.enumerator = NULL;
++  zone.pressure_relief = zone_pressure_relief;
++  zone_introspect.enumerator = zone_enumerator;
+   zone_introspect.good_size = zone_good_size;
+-  zone_introspect.check = NULL;
+-  zone_introspect.print = NULL;
+-  zone_introspect.log = NULL;
++  zone_introspect.check = zone_check;
++  zone_introspect.print = zone_print;
++  zone_introspect.log = zone_log;
+   zone_introspect.force_lock = zone_force_lock;
+   zone_introspect.force_unlock = zone_force_unlock;
+-  zone_introspect.statistics = NULL;
+-  zone_introspect.zone_locked = NULL;
++  zone_introspect.statistics = zone_statistics;
++  zone_introspect.zone_locked = zone_locked;
+   zone_introspect.enable_discharge_checking = NULL;
+   zone_introspect.disable_discharge_checking = NULL;
+   zone_introspect.discharge = NULL;
+ #ifdef __BLOCKS__
+   zone_introspect.enumerate_discharged_pointers = NULL;
+ #else
+   zone_introspect.enumerate_unavailable_without_blocks = NULL;
+ #endif
++  zone_introspect.reinit_lock = zone_reinit_lock;
+ 
+   /*
+    * The default purgeable zone is created lazily by OSX's libc.  It uses
+    * the default zone when it is created for "small" allocations
+    * (< 15 KiB), but assumes the default zone is a scalable_zone.  This
+    * obviously fails when the default zone is the jemalloc zone, so
+    * malloc_default_purgeable_zone is called beforehand so that the
+    * default purgeable zone is created when the default zone is still

+ 690 - 0
mozilla-esr52/patches/mozilla-esr52-push_355272.patch

@@ -0,0 +1,690 @@
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1484722073 -32400
+#      Wed Jan 18 15:47:53 2017 +0900
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID 22d22554507f6db7c1ecd8e467516bd194e48e7e
+# Parent  2070ab8bedb27c8c85324a4083655f499e48e78b
+Bug 1286613 - Update jemalloc 4 to c6943ac. r=njn a=jorgk
+
+This picks the same changes as the ones we just did to
+memory/build/zone.c, plus a oneliner for sparc64.
+
+diff --git a/memory/jemalloc/src/VERSION b/memory/jemalloc/src/VERSION
+--- a/memory/jemalloc/src/VERSION
++++ b/memory/jemalloc/src/VERSION
+@@ -1,1 +1,1 @@
+-4.4.0-0-gf1f76357313e7dcad7262f17a48ff0a2e005fcdc
++4.4.0-3-gc6943acb3c56d1b3d1e82dd43b3fcfeae7771990
+diff --git a/memory/jemalloc/src/configure b/memory/jemalloc/src/configure
+--- a/memory/jemalloc/src/configure
++++ b/memory/jemalloc/src/configure
+@@ -9002,166 +9002,16 @@ fi
+ 
+ 
+ if test "x${enable_zone_allocator}" = "x1" ; then
+   if test "x${abi}" != "xmacho"; then
+     as_fn_error $? "--enable-zone-allocator is only supported on Darwin" "$LINENO" 5
+   fi
+   $as_echo "#define JEMALLOC_ZONE  " >>confdefs.h
+ 
+-
+-        { $as_echo "$as_me:${as_lineno-$LINENO}: checking malloc zone version" >&5
+-$as_echo_n "checking malloc zone version... " >&6; }
+-
+-
+-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+-/* end confdefs.h.  */
+-#include <malloc/malloc.h>
+-int
+-main ()
+-{
+-static int foo[sizeof(malloc_zone_t) == sizeof(void *) * 14 ? 1 : -1]
+-
+-  ;
+-  return 0;
+-}
+-_ACEOF
+-if ac_fn_c_try_compile "$LINENO"; then :
+-  JEMALLOC_ZONE_VERSION=3
+-else
+-
+-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+-/* end confdefs.h.  */
+-#include <malloc/malloc.h>
+-int
+-main ()
+-{
+-static int foo[sizeof(malloc_zone_t) == sizeof(void *) * 15 ? 1 : -1]
+-
+-  ;
+-  return 0;
+-}
+-_ACEOF
+-if ac_fn_c_try_compile "$LINENO"; then :
+-  JEMALLOC_ZONE_VERSION=5
+-else
+-
+-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+-/* end confdefs.h.  */
+-#include <malloc/malloc.h>
+-int
+-main ()
+-{
+-static int foo[sizeof(malloc_zone_t) == sizeof(void *) * 16 ? 1 : -1]
+-
+-  ;
+-  return 0;
+-}
+-_ACEOF
+-if ac_fn_c_try_compile "$LINENO"; then :
+-
+-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+-/* end confdefs.h.  */
+-#include <malloc/malloc.h>
+-int
+-main ()
+-{
+-static int foo[sizeof(malloc_introspection_t) == sizeof(void *) * 9 ? 1 : -1]
+-
+-  ;
+-  return 0;
+-}
+-_ACEOF
+-if ac_fn_c_try_compile "$LINENO"; then :
+-  JEMALLOC_ZONE_VERSION=6
+-else
+-
+-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+-/* end confdefs.h.  */
+-#include <malloc/malloc.h>
+-int
+-main ()
+-{
+-static int foo[sizeof(malloc_introspection_t) == sizeof(void *) * 13 ? 1 : -1]
+-
+-  ;
+-  return 0;
+-}
+-_ACEOF
+-if ac_fn_c_try_compile "$LINENO"; then :
+-  JEMALLOC_ZONE_VERSION=7
+-else
+-  JEMALLOC_ZONE_VERSION=
+-
+-fi
+-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+-fi
+-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+-else
+-
+-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+-/* end confdefs.h.  */
+-#include <malloc/malloc.h>
+-int
+-main ()
+-{
+-static int foo[sizeof(malloc_zone_t) == sizeof(void *) * 17 ? 1 : -1]
+-
+-  ;
+-  return 0;
+-}
+-_ACEOF
+-if ac_fn_c_try_compile "$LINENO"; then :
+-  JEMALLOC_ZONE_VERSION=8
+-else
+-
+-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+-/* end confdefs.h.  */
+-#include <malloc/malloc.h>
+-int
+-main ()
+-{
+-static int foo[sizeof(malloc_zone_t) > sizeof(void *) * 17 ? 1 : -1]
+-
+-  ;
+-  return 0;
+-}
+-_ACEOF
+-if ac_fn_c_try_compile "$LINENO"; then :
+-  JEMALLOC_ZONE_VERSION=9
+-else
+-  JEMALLOC_ZONE_VERSION=
+-
+-fi
+-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+-fi
+-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+-fi
+-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+-fi
+-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+-fi
+-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+-  if test "x${JEMALLOC_ZONE_VERSION}" = "x"; then
+-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+-$as_echo "unsupported" >&6; }
+-    as_fn_error $? "Unsupported malloc zone version" "$LINENO" 5
+-  fi
+-  if test "${JEMALLOC_ZONE_VERSION}" = 9; then
+-    JEMALLOC_ZONE_VERSION=8
+-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: > 8" >&5
+-$as_echo "> 8" >&6; }
+-  else
+-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JEMALLOC_ZONE_VERSION" >&5
+-$as_echo "$JEMALLOC_ZONE_VERSION" >&6; }
+-  fi
+-  cat >>confdefs.h <<_ACEOF
+-#define JEMALLOC_ZONE_VERSION $JEMALLOC_ZONE_VERSION
+-_ACEOF
+-
+ fi
+ 
+ 
+ 
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether glibc malloc hook is compilable" >&5
+ $as_echo_n "checking whether glibc malloc hook is compilable... " >&6; }
+ if ${je_cv_glibc_malloc_hook+:} false; then :
+   $as_echo_n "(cached) " >&6
+diff --git a/memory/jemalloc/src/configure.ac b/memory/jemalloc/src/configure.ac
+--- a/memory/jemalloc/src/configure.ac
++++ b/memory/jemalloc/src/configure.ac
+@@ -1769,47 +1769,16 @@ fi
+ )
+ AC_SUBST([enable_zone_allocator])
+ 
+ if test "x${enable_zone_allocator}" = "x1" ; then
+   if test "x${abi}" != "xmacho"; then
+     AC_MSG_ERROR([--enable-zone-allocator is only supported on Darwin])
+   fi
+   AC_DEFINE([JEMALLOC_ZONE], [ ])
+-
+-  dnl The szone version jumped from 3 to 6 between the OS X 10.5.x and 10.6
+-  dnl releases.  malloc_zone_t and malloc_introspection_t have new fields in
+-  dnl 10.6, which is the only source-level indication of the change.
+-  AC_MSG_CHECKING([malloc zone version])
+-  AC_DEFUN([JE_ZONE_PROGRAM],
+-    [AC_LANG_PROGRAM(
+-      [#include <malloc/malloc.h>],
+-      [static int foo[[sizeof($1) $2 sizeof(void *) * $3 ? 1 : -1]]]
+-    )])
+-
+-  AC_COMPILE_IFELSE([JE_ZONE_PROGRAM(malloc_zone_t,==,14)],[JEMALLOC_ZONE_VERSION=3],[
+-  AC_COMPILE_IFELSE([JE_ZONE_PROGRAM(malloc_zone_t,==,15)],[JEMALLOC_ZONE_VERSION=5],[
+-  AC_COMPILE_IFELSE([JE_ZONE_PROGRAM(malloc_zone_t,==,16)],[
+-    AC_COMPILE_IFELSE([JE_ZONE_PROGRAM(malloc_introspection_t,==,9)],[JEMALLOC_ZONE_VERSION=6],[
+-    AC_COMPILE_IFELSE([JE_ZONE_PROGRAM(malloc_introspection_t,==,13)],[JEMALLOC_ZONE_VERSION=7],[JEMALLOC_ZONE_VERSION=]
+-  )])],[
+-  AC_COMPILE_IFELSE([JE_ZONE_PROGRAM(malloc_zone_t,==,17)],[JEMALLOC_ZONE_VERSION=8],[
+-  AC_COMPILE_IFELSE([JE_ZONE_PROGRAM(malloc_zone_t,>,17)],[JEMALLOC_ZONE_VERSION=9],[JEMALLOC_ZONE_VERSION=]
+-  )])])])])
+-  if test "x${JEMALLOC_ZONE_VERSION}" = "x"; then
+-    AC_MSG_RESULT([unsupported])
+-    AC_MSG_ERROR([Unsupported malloc zone version])
+-  fi
+-  if test "${JEMALLOC_ZONE_VERSION}" = 9; then
+-    JEMALLOC_ZONE_VERSION=8
+-    AC_MSG_RESULT([> 8])
+-  else
+-    AC_MSG_RESULT([$JEMALLOC_ZONE_VERSION])
+-  fi
+-  AC_DEFINE_UNQUOTED(JEMALLOC_ZONE_VERSION, [$JEMALLOC_ZONE_VERSION])
+ fi
+ 
+ dnl ============================================================================
+ dnl Check for glibc malloc hooks
+ 
+ JE_COMPILABLE([glibc malloc hook], [
+ #include <stddef.h>
+ 
+diff --git a/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal.h.in b/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal.h.in
+--- a/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal.h.in
++++ b/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal.h.in
+@@ -153,17 +153,16 @@ static const bool config_cache_oblivious
+ #if (defined(JEMALLOC_OSATOMIC) || defined(JEMALLOC_OSSPIN))
+ #include <libkern/OSAtomic.h>
+ #endif
+ 
+ #ifdef JEMALLOC_ZONE
+ #include <mach/mach_error.h>
+ #include <mach/mach_init.h>
+ #include <mach/vm_map.h>
+-#include <malloc/malloc.h>
+ #endif
+ 
+ #include "jemalloc/internal/ph.h"
+ #ifndef __PGI
+ #define	RB_COMPACT
+ #endif
+ #include "jemalloc/internal/rb.h"
+ #include "jemalloc/internal/qr.h"
+diff --git a/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal_defs.h.in b/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal_defs.h.in
+--- a/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal_defs.h.in
++++ b/memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal_defs.h.in
+@@ -234,17 +234,16 @@
+  * pointer alignments across all cache indices.
+  */
+ #undef JEMALLOC_CACHE_OBLIVIOUS
+ 
+ /*
+  * Darwin (OS X) uses zones to work around Mach-O symbol override shortcomings.
+  */
+ #undef JEMALLOC_ZONE
+-#undef JEMALLOC_ZONE_VERSION
+ 
+ /*
+  * Methods for determining whether the OS overcommits.
+  * JEMALLOC_PROC_SYS_VM_OVERCOMMIT_MEMORY: Linux's
+  *                                         /proc/sys/vm.overcommit_memory file.
+  * JEMALLOC_SYSCTL_VM_OVERCOMMIT: FreeBSD's vm.overcommit sysctl.
+  */
+ #undef JEMALLOC_SYSCTL_VM_OVERCOMMIT
+diff --git a/memory/jemalloc/src/include/jemalloc/internal/mb.h b/memory/jemalloc/src/include/jemalloc/internal/mb.h
+--- a/memory/jemalloc/src/include/jemalloc/internal/mb.h
++++ b/memory/jemalloc/src/include/jemalloc/internal/mb.h
+@@ -71,17 +71,17 @@ mb_write(void)
+ {
+ 
+ 	asm volatile ("eieio"
+ 	    : /* Outputs. */
+ 	    : /* Inputs. */
+ 	    : "memory" /* Clobbers. */
+ 	    );
+ }
+-#elif defined(__sparc64__)
++#elif defined(__sparc__) && defined(__arch64__)
+ JEMALLOC_INLINE void
+ mb_write(void)
+ {
+ 
+ 	asm volatile ("membar #StoreStore"
+ 	    : /* Outputs. */
+ 	    : /* Inputs. */
+ 	    : "memory" /* Clobbers. */
+diff --git a/memory/jemalloc/src/src/zone.c b/memory/jemalloc/src/src/zone.c
+--- a/memory/jemalloc/src/src/zone.c
++++ b/memory/jemalloc/src/src/zone.c
+@@ -1,13 +1,82 @@
+ #include "jemalloc/internal/jemalloc_internal.h"
+ #ifndef JEMALLOC_ZONE
+ #  error "This source file is for zones on Darwin (OS X)."
+ #endif
+ 
++/* Definitions of the following structs in malloc/malloc.h might be too old
++ * for the built binary to run on newer versions of OSX. So use the newest
++ * possible version of those structs.
++ */
++typedef struct _malloc_zone_t {
++	void *reserved1;
++	void *reserved2;
++	size_t (*size)(struct _malloc_zone_t *, const void *);
++	void *(*malloc)(struct _malloc_zone_t *, size_t);
++	void *(*calloc)(struct _malloc_zone_t *, size_t, size_t);
++	void *(*valloc)(struct _malloc_zone_t *, size_t);
++	void (*free)(struct _malloc_zone_t *, void *);
++	void *(*realloc)(struct _malloc_zone_t *, void *, size_t);
++	void (*destroy)(struct _malloc_zone_t *);
++	const char *zone_name;
++	unsigned (*batch_malloc)(struct _malloc_zone_t *, size_t, void **, unsigned);
++	void (*batch_free)(struct _malloc_zone_t *, void **, unsigned);
++	struct malloc_introspection_t *introspect;
++	unsigned version;
++	void *(*memalign)(struct _malloc_zone_t *, size_t, size_t);
++	void (*free_definite_size)(struct _malloc_zone_t *, void *, size_t);
++	size_t (*pressure_relief)(struct _malloc_zone_t *, size_t);
++} malloc_zone_t;
++
++typedef struct {
++	vm_address_t address;
++	vm_size_t size;
++} vm_range_t;
++
++typedef struct malloc_statistics_t {
++	unsigned blocks_in_use;
++	size_t size_in_use;
++	size_t max_size_in_use;
++	size_t size_allocated;
++} malloc_statistics_t;
++
++typedef kern_return_t memory_reader_t(task_t, vm_address_t, vm_size_t, void **);
++
++typedef void vm_range_recorder_t(task_t, void *, unsigned type, vm_range_t *, unsigned);
++
++typedef struct malloc_introspection_t {
++	kern_return_t (*enumerator)(task_t, void *, unsigned, vm_address_t, memory_reader_t, vm_range_recorder_t);
++	size_t (*good_size)(malloc_zone_t *, size_t);
++	boolean_t (*check)(malloc_zone_t *);
++	void (*print)(malloc_zone_t *, boolean_t);
++	void (*log)(malloc_zone_t *, void *);
++	void (*force_lock)(malloc_zone_t *);
++	void (*force_unlock)(malloc_zone_t *);
++	void (*statistics)(malloc_zone_t *, malloc_statistics_t *);
++	boolean_t (*zone_locked)(malloc_zone_t *);
++	boolean_t (*enable_discharge_checking)(malloc_zone_t *);
++	boolean_t (*disable_discharge_checking)(malloc_zone_t *);
++	void (*discharge)(malloc_zone_t *, void *);
++#ifdef __BLOCKS__
++	void (*enumerate_discharged_pointers)(malloc_zone_t *, void (^)(void *, void *));
++#else
++	void *enumerate_unavailable_without_blocks;
++#endif
++	void (*reinit_lock)(malloc_zone_t *);
++} malloc_introspection_t;
++
++extern kern_return_t malloc_get_all_zones(task_t, memory_reader_t, vm_address_t **, unsigned *);
++
++extern malloc_zone_t *malloc_default_zone(void);
++
++extern void malloc_zone_register(malloc_zone_t *zone);
++
++extern void malloc_zone_unregister(malloc_zone_t *zone);
++
+ /*
+  * The malloc_default_purgeable_zone() function is only available on >= 10.6.
+  * We need to check whether it is present at runtime, thus the weak_import.
+  */
+ extern malloc_zone_t *malloc_default_purgeable_zone(void)
+ JEMALLOC_ATTR(weak_import);
+ 
+ /******************************************************************************/
+@@ -15,42 +84,53 @@ JEMALLOC_ATTR(weak_import);
+ 
+ static malloc_zone_t *default_zone, *purgeable_zone;
+ static malloc_zone_t jemalloc_zone;
+ static struct malloc_introspection_t jemalloc_zone_introspect;
+ 
+ /******************************************************************************/
+ /* Function prototypes for non-inline static functions. */
+ 
+-static size_t	zone_size(malloc_zone_t *zone, void *ptr);
++static size_t	zone_size(malloc_zone_t *zone, const void *ptr);
+ static void	*zone_malloc(malloc_zone_t *zone, size_t size);
+ static void	*zone_calloc(malloc_zone_t *zone, size_t num, size_t size);
+ static void	*zone_valloc(malloc_zone_t *zone, size_t size);
+ static void	zone_free(malloc_zone_t *zone, void *ptr);
+ static void	*zone_realloc(malloc_zone_t *zone, void *ptr, size_t size);
+-#if (JEMALLOC_ZONE_VERSION >= 5)
+ static void	*zone_memalign(malloc_zone_t *zone, size_t alignment,
+-#endif
+-#if (JEMALLOC_ZONE_VERSION >= 6)
+     size_t size);
+ static void	zone_free_definite_size(malloc_zone_t *zone, void *ptr,
+     size_t size);
+-#endif
+-static void	*zone_destroy(malloc_zone_t *zone);
++static void	zone_destroy(malloc_zone_t *zone);
++static unsigned	zone_batch_malloc(struct _malloc_zone_t *zone, size_t size,
++    void **results, unsigned num_requested);
++static void	zone_batch_free(struct _malloc_zone_t *zone,
++    void **to_be_freed, unsigned num_to_be_freed);
++static size_t	zone_pressure_relief(struct _malloc_zone_t *zone, size_t goal);
+ static size_t	zone_good_size(malloc_zone_t *zone, size_t size);
++static kern_return_t	zone_enumerator(task_t task, void *data, unsigned type_mask,
++    vm_address_t zone_address, memory_reader_t reader,
++    vm_range_recorder_t recorder);
++static boolean_t	zone_check(malloc_zone_t *zone);
++static void	zone_print(malloc_zone_t *zone, boolean_t verbose);
++static void	zone_log(malloc_zone_t *zone, void *address);
+ static void	zone_force_lock(malloc_zone_t *zone);
+ static void	zone_force_unlock(malloc_zone_t *zone);
++static void	zone_statistics(malloc_zone_t *zone,
++    malloc_statistics_t *stats);
++static boolean_t	zone_locked(malloc_zone_t *zone);
++static void	zone_reinit_lock(malloc_zone_t *zone);
+ 
+ /******************************************************************************/
+ /*
+  * Functions.
+  */
+ 
+ static size_t
+-zone_size(malloc_zone_t *zone, void *ptr)
++zone_size(malloc_zone_t *zone, const void *ptr)
+ {
+ 
+ 	/*
+ 	 * There appear to be places within Darwin (such as setenv(3)) that
+ 	 * cause calls to this function with pointers that *no* zone owns.  If
+ 	 * we knew that all pointers were owned by *some* zone, we could split
+ 	 * our zone into two parts, and use one as the default allocator and
+ 	 * the other as the default deallocator/reallocator.  Since that will
+@@ -101,63 +181,115 @@ zone_realloc(malloc_zone_t *zone, void *
+ {
+ 
+ 	if (ivsalloc(tsdn_fetch(), ptr, config_prof) != 0)
+ 		return (je_realloc(ptr, size));
+ 
+ 	return (realloc(ptr, size));
+ }
+ 
+-#if (JEMALLOC_ZONE_VERSION >= 5)
+ static void *
+ zone_memalign(malloc_zone_t *zone, size_t alignment, size_t size)
+ {
+ 	void *ret = NULL; /* Assignment avoids useless compiler warning. */
+ 
+ 	je_posix_memalign(&ret, alignment, size);
+ 
+ 	return (ret);
+ }
+-#endif
+ 
+-#if (JEMALLOC_ZONE_VERSION >= 6)
+ static void
+ zone_free_definite_size(malloc_zone_t *zone, void *ptr, size_t size)
+ {
+ 	size_t alloc_size;
+ 
+ 	alloc_size = ivsalloc(tsdn_fetch(), ptr, config_prof);
+ 	if (alloc_size != 0) {
+ 		assert(alloc_size == size);
+ 		je_free(ptr);
+ 		return;
+ 	}
+ 
+ 	free(ptr);
+ }
+-#endif
+ 
+-static void *
++static void
+ zone_destroy(malloc_zone_t *zone)
+ {
+ 
+ 	/* This function should never be called. */
+ 	not_reached();
+-	return (NULL);
++}
++
++static unsigned
++zone_batch_malloc(struct _malloc_zone_t *zone, size_t size, void **results,
++    unsigned num_requested)
++{
++	unsigned i;
++
++	for (i = 0; i < num_requested; i++) {
++		results[i] = je_malloc(size);
++		if (!results[i])
++			break;
++	}
++
++	return i;
++}
++
++static void
++zone_batch_free(struct _malloc_zone_t *zone, void **to_be_freed,
++    unsigned num_to_be_freed)
++{
++	unsigned i;
++
++	for (i = 0; i < num_to_be_freed; i++) {
++		zone_free(zone, to_be_freed[i]);
++		to_be_freed[i] = NULL;
++	}
++}
++
++static size_t
++zone_pressure_relief(struct _malloc_zone_t *zone, size_t goal)
++{
++	return 0;
+ }
+ 
+ static size_t
+ zone_good_size(malloc_zone_t *zone, size_t size)
+ {
+ 
+ 	if (size == 0)
+ 		size = 1;
+ 	return (s2u(size));
+ }
+ 
++static kern_return_t
++zone_enumerator(task_t task, void *data, unsigned type_mask,
++    vm_address_t zone_address, memory_reader_t reader,
++    vm_range_recorder_t recorder)
++{
++	return KERN_SUCCESS;
++}
++
++static boolean_t
++zone_check(malloc_zone_t *zone)
++{
++	return true;
++}
++
++static void
++zone_print(malloc_zone_t *zone, boolean_t verbose)
++{
++}
++
++static void
++zone_log(malloc_zone_t *zone, void *address)
++{
++}
++
+ static void
+ zone_force_lock(malloc_zone_t *zone)
+ {
+ 
+ 	if (isthreaded)
+ 		jemalloc_prefork();
+ }
+ 
+@@ -172,62 +304,78 @@ zone_force_unlock(malloc_zone_t *zone)
+ 	 * reinitialized, but the child cannot unlock mutexes that were locked
+ 	 * by the parent.
+ 	 */
+ 	if (isthreaded)
+ 		jemalloc_postfork_child();
+ }
+ 
+ static void
++zone_statistics(malloc_zone_t *zone, malloc_statistics_t *stats)
++{
++	/* We make no effort to actually fill the values */
++	stats->blocks_in_use = 0;
++	stats->size_in_use = 0;
++	stats->max_size_in_use = 0;
++	stats->size_allocated = 0;
++}
++
++static boolean_t
++zone_locked(malloc_zone_t *zone)
++{
++	/* Pretend no lock is being held */
++	return false;
++}
++
++static void
++zone_reinit_lock(malloc_zone_t *zone)
++{
++	/* As of OSX 10.12, this function is only used when force_unlock would
++	 * be used if the zone version were < 9. So just use force_unlock. */
++	zone_force_unlock(zone);
++}
++
++static void
+ zone_init(void)
+ {
+ 
+-	jemalloc_zone.size = (void *)zone_size;
+-	jemalloc_zone.malloc = (void *)zone_malloc;
+-	jemalloc_zone.calloc = (void *)zone_calloc;
+-	jemalloc_zone.valloc = (void *)zone_valloc;
+-	jemalloc_zone.free = (void *)zone_free;
+-	jemalloc_zone.realloc = (void *)zone_realloc;
+-	jemalloc_zone.destroy = (void *)zone_destroy;
++	jemalloc_zone.size = zone_size;
++	jemalloc_zone.malloc = zone_malloc;
++	jemalloc_zone.calloc = zone_calloc;
++	jemalloc_zone.valloc = zone_valloc;
++	jemalloc_zone.free = zone_free;
++	jemalloc_zone.realloc = zone_realloc;
++	jemalloc_zone.destroy = zone_destroy;
+ 	jemalloc_zone.zone_name = "jemalloc_zone";
+-	jemalloc_zone.batch_malloc = NULL;
+-	jemalloc_zone.batch_free = NULL;
++	jemalloc_zone.batch_malloc = zone_batch_malloc;
++	jemalloc_zone.batch_free = zone_batch_free;
+ 	jemalloc_zone.introspect = &jemalloc_zone_introspect;
+-	jemalloc_zone.version = JEMALLOC_ZONE_VERSION;
+-#if (JEMALLOC_ZONE_VERSION >= 5)
++	jemalloc_zone.version = 9;
+ 	jemalloc_zone.memalign = zone_memalign;
+-#endif
+-#if (JEMALLOC_ZONE_VERSION >= 6)
+ 	jemalloc_zone.free_definite_size = zone_free_definite_size;
+-#endif
+-#if (JEMALLOC_ZONE_VERSION >= 8)
+-	jemalloc_zone.pressure_relief = NULL;
+-#endif
++	jemalloc_zone.pressure_relief = zone_pressure_relief;
+ 
+-	jemalloc_zone_introspect.enumerator = NULL;
+-	jemalloc_zone_introspect.good_size = (void *)zone_good_size;
+-	jemalloc_zone_introspect.check = NULL;
+-	jemalloc_zone_introspect.print = NULL;
+-	jemalloc_zone_introspect.log = NULL;
+-	jemalloc_zone_introspect.force_lock = (void *)zone_force_lock;
+-	jemalloc_zone_introspect.force_unlock = (void *)zone_force_unlock;
+-	jemalloc_zone_introspect.statistics = NULL;
+-#if (JEMALLOC_ZONE_VERSION >= 6)
+-	jemalloc_zone_introspect.zone_locked = NULL;
+-#endif
+-#if (JEMALLOC_ZONE_VERSION >= 7)
++	jemalloc_zone_introspect.enumerator = zone_enumerator;
++	jemalloc_zone_introspect.good_size = zone_good_size;
++	jemalloc_zone_introspect.check = zone_check;
++	jemalloc_zone_introspect.print = zone_print;
++	jemalloc_zone_introspect.log = zone_log;
++	jemalloc_zone_introspect.force_lock = zone_force_lock;
++	jemalloc_zone_introspect.force_unlock = zone_force_unlock;
++	jemalloc_zone_introspect.statistics = zone_statistics;
++	jemalloc_zone_introspect.zone_locked = zone_locked;
+ 	jemalloc_zone_introspect.enable_discharge_checking = NULL;
+ 	jemalloc_zone_introspect.disable_discharge_checking = NULL;
+ 	jemalloc_zone_introspect.discharge = NULL;
+-#  ifdef __BLOCKS__
++#ifdef __BLOCKS__
+ 	jemalloc_zone_introspect.enumerate_discharged_pointers = NULL;
+-#  else
++#else
+ 	jemalloc_zone_introspect.enumerate_unavailable_without_blocks = NULL;
+-#  endif
+ #endif
++	jemalloc_zone_introspect.reinit_lock = zone_reinit_lock;
+ }
+ 
+ static malloc_zone_t *
+ zone_default_get(void)
+ {
+ 	malloc_zone_t **zones = NULL;
+ 	unsigned int num_zones = 0;
+ 
+diff --git a/memory/jemalloc/upstream.info b/memory/jemalloc/upstream.info
+--- a/memory/jemalloc/upstream.info
++++ b/memory/jemalloc/upstream.info
+@@ -1,2 +1,2 @@
+ UPSTREAM_REPO=https://github.com/jemalloc/jemalloc
+-UPSTREAM_COMMIT=4.4.0
++UPSTREAM_COMMIT=c6943acb3c56d1b3d1e82dd43b3fcfeae7771990

+ 168 - 0
mozilla-esr52/patches/mozilla-esr52-push_355273.patch

@@ -0,0 +1,168 @@
+# HG changeset patch
+# User Mike Hommey <mh+mozilla@glandium.org>
+# Date 1484874401 -32400
+#      Fri Jan 20 10:06:41 2017 +0900
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID ae7f7269073a31622cae4221fb7aad868767f24a
+# Parent  22d22554507f6db7c1ecd8e467516bd194e48e7e
+Bug 1332508 - Reinitialize allocator mutexes in fork() child processes. r=njn a=jorgk DONTBUILD
+
+Adapted from
+https://github.com/jemalloc/jemalloc/commit/4e2e3dd9cf19ed5991938a708a8b50611aa5bbf8
+and
+https://github.com/jemalloc/jemalloc/commit/d9f7b2a4307f7ff9f7a139b33d366d44e8a8b83d
+
+As per the latter commit, it would seem unlocking, in fork() child
+processes, mutexes that were locked in the parent process is not really
+well supported on OSX 10.12. The addition of the zone_reinit_lock
+function in 10.12 supports this idea.
+
+diff --git a/memory/build/zone.c b/memory/build/zone.c
+--- a/memory/build/zone.c
++++ b/memory/build/zone.c
+@@ -248,40 +248,40 @@ zone_force_lock(malloc_zone_t *zone)
+   if (isthreaded)
+     jemalloc_prefork();
+ }
+ 
+ static void
+ zone_force_unlock(malloc_zone_t *zone)
+ {
+   /* /!\ This calls into jemalloc. It works because we're linked in the
+-   * same library. Stolen from jemalloc's zone.c. */
++   * same library. Stolen from jemalloc's zone.c. See the comment there. */
+   if (isthreaded)
+-    jemalloc_postfork_parent();
++    jemalloc_postfork_child();
+ }
+ 
+ #else
+ 
+ extern void _malloc_prefork(void);
+-extern void _malloc_postfork(void);
++extern void _malloc_postfork_child(void);
+ 
+ static void
+ zone_force_lock(malloc_zone_t *zone)
+ {
+   /* /!\ This calls into mozjemalloc. It works because we're linked in the
+    * same library. */
+   _malloc_prefork();
+ }
+ 
+ static void
+ zone_force_unlock(malloc_zone_t *zone)
+ {
+   /* /!\ This calls into mozjemalloc. It works because we're linked in the
+    * same library. */
+-  _malloc_postfork();
++  _malloc_postfork_child();
+ }
+ 
+ #endif
+ 
+ static void
+ zone_statistics(malloc_zone_t *zone, malloc_statistics_t *stats)
+ {
+   /* We make no effort to actually fill the values */
+diff --git a/memory/mozjemalloc/jemalloc.c b/memory/mozjemalloc/jemalloc.c
+--- a/memory/mozjemalloc/jemalloc.c
++++ b/memory/mozjemalloc/jemalloc.c
+@@ -1453,17 +1453,21 @@ bool		malloc_init_hard(void);
+ 
+ #ifndef MOZ_MEMORY_DARWIN
+ static
+ #endif
+ void	_malloc_prefork(void);
+ #ifndef MOZ_MEMORY_DARWIN
+ static
+ #endif
+-void	_malloc_postfork(void);
++void	_malloc_postfork_parent(void);
++#ifndef MOZ_MEMORY_DARWIN
++static
++#endif
++void	_malloc_postfork_child(void);
+ 
+ /*
+  * End function prototypes.
+  */
+ /******************************************************************************/
+ 
+ static inline size_t
+ load_acquire_z(size_t *p)
+@@ -6034,17 +6038,17 @@ MALLOC_OUT:
+ 	if (chunk_rtree == NULL)
+ 		return (true);
+ #endif
+ 
+ 	malloc_initialized = true;
+ 
+ #if !defined(MOZ_MEMORY_WINDOWS) && !defined(MOZ_MEMORY_DARWIN)
+ 	/* Prevent potential deadlock on malloc locks after fork. */
+-	pthread_atfork(_malloc_prefork, _malloc_postfork, _malloc_postfork);
++	pthread_atfork(_malloc_prefork, _malloc_postfork_parent, _malloc_postfork_child);
+ #endif
+ 
+ #if defined(NEEDS_PTHREAD_MMAP_UNALIGNED_TSD)
+ 	if (pthread_key_create(&mmap_unaligned_tsd, NULL) != 0) {
+ 		malloc_printf("<jemalloc>: Error in pthread_key_create()\n");
+ 	}
+ #endif
+ 
+@@ -6779,33 +6783,54 @@ void
+ 
+ 	malloc_mutex_lock(&huge_mtx);
+ }
+ 
+ #ifndef MOZ_MEMORY_DARWIN
+ static
+ #endif
+ void
+-_malloc_postfork(void)
++_malloc_postfork_parent(void)
+ {
+ 	unsigned i;
+ 
+ 	/* Release all mutexes, now that fork() has completed. */
+ 
+ 	malloc_mutex_unlock(&huge_mtx);
+ 
+ 	malloc_mutex_unlock(&base_mtx);
+ 
+ 	for (i = 0; i < narenas; i++) {
+ 		if (arenas[i] != NULL)
+ 			malloc_spin_unlock(&arenas[i]->lock);
+ 	}
+ 	malloc_spin_unlock(&arenas_lock);
+ }
+ 
++#ifndef MOZ_MEMORY_DARWIN
++static
++#endif
++void
++_malloc_postfork_child(void)
++{
++	unsigned i;
++
++	/* Reinitialize all mutexes, now that fork() has completed. */
++
++	malloc_mutex_init(&huge_mtx);
++
++	malloc_mutex_init(&base_mtx);
++
++	for (i = 0; i < narenas; i++) {
++		if (arenas[i] != NULL)
++			malloc_spin_init(&arenas[i]->lock);
++	}
++	malloc_spin_init(&arenas_lock);
++}
++
+ /*
+  * End library-private functions.
+  */
+ /******************************************************************************/
+ 
+ #ifdef HAVE_DLOPEN
+ #  include <dlfcn.h>
+ #endif

+ 36 - 0
mozilla-esr52/patches/mozilla-esr52-push_356225.patch

@@ -0,0 +1,36 @@
+# HG changeset patch
+# User Chris H-C <chutten@mozilla.com>
+# Date 1495813813 14400
+#      Fri May 26 11:50:13 2017 -0400
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID d13e3fefb76ea8a030579965d3c84e04649226fc
+# Parent  1ff98bcac541cf0801d9c684d52cf088472777f5
+bug 546387 - Don't try to set the GTK clipboard with null items r=karlt a=jorgk
+
+It causes an assert failure in gtk which prints to the console.
+
+MozReview-Commit-ID: A4106Z4rT36
+
+diff --git a/widget/gtk/nsClipboard.cpp b/widget/gtk/nsClipboard.cpp
+--- a/widget/gtk/nsClipboard.cpp
++++ b/widget/gtk/nsClipboard.cpp
+@@ -209,17 +209,18 @@ nsClipboard::SetData(nsITransferable *aT
+     
+     // Get GTK clipboard (CLIPBOARD or PRIMARY)
+     GtkClipboard *gtkClipboard = gtk_clipboard_get(GetSelectionAtom(aWhichClipboard));
+   
+     gint numTargets;
+     GtkTargetEntry *gtkTargets = gtk_target_table_new_from_list(list, &numTargets);
+           
+     // Set getcallback and request to store data after an application exit
+-    if (gtk_clipboard_set_with_data(gtkClipboard, gtkTargets, numTargets, 
++    if (gtkTargets &&
++        gtk_clipboard_set_with_data(gtkClipboard, gtkTargets, numTargets,
+                                     clipboard_get_cb, clipboard_clear_cb, this))
+     {
+         // We managed to set-up the clipboard so update internal state
+         // We have to set it now because gtk_clipboard_set_with_data() calls clipboard_clear_cb()
+         // which reset our internal state 
+         if (aWhichClipboard == kSelectionClipboard) {
+             mSelectionOwner = aOwner;
+             mSelectionTransferable = aTransferable;

+ 85 - 0
mozilla-esr52/patches/mozilla-esr52-push_356226.patch

@@ -0,0 +1,85 @@
+# HG changeset patch
+# User Johann Hofmann <jhofmann@mozilla.com>
+# Date 1496346071 -7200
+#      Thu Jun 01 21:41:11 2017 +0200
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID f822bda79c28da0ad93b67d46abcb66f6d5c8c92
+# Parent  d13e3fefb76ea8a030579965d3c84e04649226fc
+Bug 1350152 - Don't rely on gBrowser in nsLoginManagerPrompter.js. r=mkaply a=jorgk
+
+In bug 1266836 we fixed this code to properly work in e10s,
+but made the mistake of using gBrowser in toolkit code, breaking
+XUL apps that don't have a gBrowser. This solution implements
+a different code-path for non-e10s and returns a chrome
+window for consumers that don't offer a browser.
+
+MozReview-Commit-ID: 929ahDenzu5
+
+diff --git a/toolkit/components/passwordmgr/nsLoginManagerPrompter.js b/toolkit/components/passwordmgr/nsLoginManagerPrompter.js
+--- a/toolkit/components/passwordmgr/nsLoginManagerPrompter.js
++++ b/toolkit/components/passwordmgr/nsLoginManagerPrompter.js
+@@ -803,16 +803,19 @@ LoginManagerPrompter.prototype = {
+    *        Login to save or change. For changes, this login should contain the
+    *        new password.
+    * @param {string} type
+    *        This is "password-save" or "password-change" depending on the
+    *        original notification type. This is used for telemetry and tests.
+    */
+   _showLoginCaptureDoorhanger(login, type) {
+     let { browser } = this._getNotifyWindow();
++    if (!browser) {
++      return;
++    }
+ 
+     let saveMsgNames = {
+       prompt: login.username === "" ? "rememberLoginMsgNoUser"
+                                     : "rememberLoginMsg",
+       buttonLabel: "rememberLoginButtonText",
+       buttonAccessKey: "rememberLoginButtonAccessKey",
+     };
+ 
+@@ -1400,20 +1403,43 @@ LoginManagerPrompter.prototype = {
+     propBag.setProperty("timesUsedIncrement", 1);
+     this._pwmgr.modifyLogin(login, propBag);
+   },
+ 
+   /**
+    * Given a content DOM window, returns the chrome window and browser it's in.
+    */
+   _getChromeWindow: function (aWindow) {
++    // Handle non-e10s toolkit consumers.
++    if (!Cu.isCrossProcessWrapper(aWindow)) {
++      let chromeWin = aWindow.QueryInterface(Ci.nsIInterfaceRequestor)
++                             .getInterface(Ci.nsIWebNavigation)
++                             .QueryInterface(Ci.nsIDocShell)
++                             .chromeEventHandler.ownerGlobal;
++      if (!chromeWin) {
++        return null;
++      }
++
++      // gBrowser only exists on some apps, like Firefox.
++      let tabbrowser = chromeWin.gBrowser || chromeWin.getBrowser();
++      // At least serve the chrome window if getBrowser()
++      // or getBrowserForContentWindow() are not supported.
++      if (!tabbrowser || typeof tabbrowser.getBrowserForContentWindow != "function") {
++        return { win: chromeWin };
++      }
++
++      let browser = tabbrowser.getBrowserForContentWindow(aWindow);
++      return { win: chromeWin, browser };
++    }
++
+     let windows = Services.wm.getEnumerator(null);
+     while (windows.hasMoreElements()) {
+       let win = windows.getNext();
+-      let browser = win.gBrowser.getBrowserForContentWindow(aWindow);
++      let tabbrowser = win.gBrowser || win.getBrowser();
++      let browser = tabbrowser.getBrowserForContentWindow(aWindow);
+       if (browser) {
+         return { win, browser };
+       }
+     }
+     return null;
+   },
+ 
+   _getNotifyWindow: function () {

+ 32 - 0
mozilla-esr52/patches/mozilla-esr52-push_356227.patch

@@ -0,0 +1,32 @@
+# HG changeset patch
+# User Jorg K <jorgk@jorgk.com>
+# Date 1502131440 14400
+#      Mon Aug 07 14:44:00 2017 -0400
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID fbb0bdb191d5e2d044ca00615d8c3ad3af7a0ab6
+# Parent  f822bda79c28da0ad93b67d46abcb66f6d5c8c92
+Bug 1388166 - Handle case where chromeWin.getBrowser() doesn't exist. r=johannh a=jorgk
+
+diff --git a/toolkit/components/passwordmgr/nsLoginManagerPrompter.js b/toolkit/components/passwordmgr/nsLoginManagerPrompter.js
+--- a/toolkit/components/passwordmgr/nsLoginManagerPrompter.js
++++ b/toolkit/components/passwordmgr/nsLoginManagerPrompter.js
+@@ -1414,17 +1414,18 @@ LoginManagerPrompter.prototype = {
+                              .getInterface(Ci.nsIWebNavigation)
+                              .QueryInterface(Ci.nsIDocShell)
+                              .chromeEventHandler.ownerGlobal;
+       if (!chromeWin) {
+         return null;
+       }
+ 
+       // gBrowser only exists on some apps, like Firefox.
+-      let tabbrowser = chromeWin.gBrowser || chromeWin.getBrowser();
++      let tabbrowser = chromeWin.gBrowser ||
++        (typeof chromeWin.getBrowser == "function" ? chromeWin.getBrowser() : null);
+       // At least serve the chrome window if getBrowser()
+       // or getBrowserForContentWindow() are not supported.
+       if (!tabbrowser || typeof tabbrowser.getBrowserForContentWindow != "function") {
+         return { win: chromeWin };
+       }
+ 
+       let browser = tabbrowser.getBrowserForContentWindow(aWindow);
+       return { win: chromeWin, browser };

+ 93 - 0
mozilla-esr52/patches/mozilla-esr52-push_356228.patch

@@ -0,0 +1,93 @@
+# HG changeset patch
+# User Aaron Klotz <aklotz@mozilla.com>
+# Date 1498711007 -32400
+#      Thu Jun 29 13:36:47 2017 +0900
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID fdbd6734448b56e8fec5917cfae3bb1c45342aa2
+# Parent  2a0db45401fc6d3eda6112a8aa6b68e984ea0c8d
+Bug 1368150: Add IsWindows10BuildOrNewer to MFBT; r=froydnj a=jorgk
+
+I need to be able to distinguish between builds of Windows 10. Unfortunately the
+stuff that I am working with cannot be sorted out via feature detection.
+
+diff --git a/mfbt/WindowsVersion.h b/mfbt/WindowsVersion.h
+--- a/mfbt/WindowsVersion.h
++++ b/mfbt/WindowsVersion.h
+@@ -79,16 +79,54 @@ IsWindowsBuildOrLater(uint32_t aBuild)
+     minBuild = aBuild;
+     return true;
+   }
+ 
+   maxBuild = aBuild;
+   return false;
+ }
+ 
++inline bool
++IsWindows10BuildOrLater(uint32_t aBuild)
++{
++  static uint32_t minBuild = 0;
++  static uint32_t maxBuild = UINT32_MAX;
++
++  if (minBuild >= aBuild) {
++    return true;
++  }
++
++  if (aBuild >= maxBuild) {
++    return false;
++  }
++
++  OSVERSIONINFOEX info;
++  ZeroMemory(&info, sizeof(OSVERSIONINFOEX));
++  info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
++  info.dwMajorVersion = 10;
++  info.dwBuildNumber = aBuild;
++
++  DWORDLONG conditionMask = 0;
++  VER_SET_CONDITION(conditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
++  VER_SET_CONDITION(conditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
++  VER_SET_CONDITION(conditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
++  VER_SET_CONDITION(conditionMask, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
++  VER_SET_CONDITION(conditionMask, VER_SERVICEPACKMINOR, VER_GREATER_EQUAL);
++
++  if (VerifyVersionInfo(&info, VER_MAJORVERSION | VER_MINORVERSION |
++                        VER_BUILDNUMBER | VER_SERVICEPACKMAJOR |
++                        VER_SERVICEPACKMINOR, conditionMask)) {
++    minBuild = aBuild;
++    return true;
++  }
++
++  maxBuild = aBuild;
++  return false;
++}
++
+ #if defined(_M_X64) || defined(_M_AMD64)
+ // We support only Win7 or later on Win64.
+ MOZ_ALWAYS_INLINE bool
+ IsXPSP3OrLater()
+ {
+   return true;
+ }
+ 
+@@ -179,16 +217,22 @@ IsWin8Point1OrLater()
+ 
+ MOZ_ALWAYS_INLINE bool
+ IsWin10OrLater()
+ {
+   return IsWindowsVersionOrLater(0x0a000000ul);
+ }
+ 
+ MOZ_ALWAYS_INLINE bool
++IsWin10CreatorsUpdateOrLater()
++{
++  return IsWindows10BuildOrLater(15063);
++}
++
++MOZ_ALWAYS_INLINE bool
+ IsNotWin7PreRTM()
+ {
+   return IsWin7SP1OrLater() || !IsWin7OrLater() ||
+          IsWindowsBuildOrLater(7600);
+ }
+ 
+ MOZ_ALWAYS_INLINE bool
+ IsWin7AndPre2000Compatible() {

+ 127 - 0
mozilla-esr52/patches/mozilla-esr52-push_356229.patch

@@ -0,0 +1,127 @@
+# HG changeset patch
+# User Masayuki Nakano <masayuki@d-toybox.com>
+# Date 1498129630 -32400
+#      Thu Jun 22 20:07:10 2017 +0900
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID 459150ea79f6be75c0228450b2ae15c28b5fbe1b
+# Parent  fdbd6734448b56e8fec5917cfae3bb1c45342aa2
+Bug 1361132 - TSFTextStore::GetSelection() shouldn't return if it runs on Win10 Anniversary Update or later. r=m_kato, a=jcristau a=jorgk
+
+This is remaining cases of bug 1312302.  TSF may set focus to context when it receives focus related message.  In such case, TSF tries to retrieve selection but TSFTextStore::GetSelection() returns E_FAIL due to still not initialized, TSF crashes.
+
+This patch moves the hack to TSFTextStore::GetSelection() and restrict to work only on problematic versions of Windows 10.
+
+MozReview-Commit-ID: 6cTiZ4HCO18
+
+diff --git a/widget/windows/TSFTextStore.cpp b/widget/windows/TSFTextStore.cpp
+--- a/widget/windows/TSFTextStore.cpp
++++ b/widget/windows/TSFTextStore.cpp
+@@ -2117,28 +2117,56 @@ TSFTextStore::GetSelection(ULONG ulIndex
+     MOZ_LOG(sTextStoreLog, LogLevel::Error,
+       ("0x%p   TSFTextStore::GetSelection() FAILED due to "
+        "unsupported selection", this));
+     return TS_E_NOSELECTION;
+   }
+ 
+   Selection& selectionForTSF = SelectionForTSFRef();
+   if (selectionForTSF.IsDirty()) {
++    if (DoNotReturnErrorFromGetSelection()) {
++      AutoSetTemporarySelection temprarySetter(selectionForTSF);
++      *pSelection = selectionForTSF.ACP();
++      *pcFetched = 1;
++      MOZ_LOG(sTextStoreLog, LogLevel::Info,
++        ("0x%p   TSFTextStore::GetSelection() returns fake selection range "
++         "for avoiding a crash in TSF, "
++         "acpStart=%d, acpEnd=%d (length=%d), reverted=%s",
++         this, selectionForTSF.StartOffset(), selectionForTSF.EndOffset(),
++         selectionForTSF.Length(), GetBoolName(selectionForTSF.IsReversed())));
++      return S_OK;
++    }
+     MOZ_LOG(sTextStoreLog, LogLevel::Error,
+       ("0x%p   TSFTextStore::GetSelection() FAILED due to "
+        "SelectionForTSFRef() failure", this));
+     return E_FAIL;
+   }
+   *pSelection = selectionForTSF.ACP();
+   *pcFetched = 1;
+   MOZ_LOG(sTextStoreLog, LogLevel::Info,
+-    ("0x%p   TSFTextStore::GetSelection() succeeded", this));
++    ("0x%p   TSFTextStore::GetSelection() succeeded, "
++     "acpStart=%d, acpEnd=%d (length=%d), reverted=%s",
++     this, selectionForTSF.StartOffset(), selectionForTSF.EndOffset(),
++     selectionForTSF.Length(), GetBoolName(selectionForTSF.IsReversed())));
+   return S_OK;
+ }
+ 
++// static
++bool
++TSFTextStore::DoNotReturnErrorFromGetSelection()
++{
++  // There is a crash bug of TSF if we return error from GetSelection().
++  // That was introduced in Anniversary Update (build 14393, see bug 1312302)
++  // TODO: We should avoid to run this hack on fixed builds.  When we get
++  //       exact build number, we should get back here.
++  static bool sTSFMayCrashIfGetSelectionReturnsError =
++    IsWindows10BuildOrLater(14393);
++  return sTSFMayCrashIfGetSelectionReturnsError;
++}
++
+ bool
+ TSFTextStore::IsComposingInContent() const
+ {
+   if (!mDispatcher) {
+     return false;
+   }
+   if (!mDispatcher->IsInNativeInputTransaction()) {
+     return false;
+@@ -4856,24 +4884,17 @@ TSFTextStore::CreateAndSetFocus(nsWindow
+     newDocMgr->GetTop(getter_AddRefs(topContext));
+     if (topContext && topContext != textStore->mContext) {
+       MarkContextAsKeyboardDisabled(topContext);
+     }
+   }
+ 
+   HRESULT hr;
+   RefPtr<ITfThreadMgr> threadMgr = sThreadMgr;
+-  {
+-    // Windows 10's softwware keyboard requires that SetSelection must be
+-    // always successful into SetFocus.  If returning error, it might crash
+-    // into TextInputFramework.dll.
+-    AutoSetTemporarySelection setSelection(textStore->SelectionForTSFRef());
+-
+-    hr = threadMgr->SetFocus(newDocMgr);
+-  }
++  hr = threadMgr->SetFocus(newDocMgr);
+ 
+   if (NS_WARN_IF(FAILED(hr))) {
+     MOZ_LOG(sTextStoreLog, LogLevel::Error,
+       ("  TSFTextStore::CreateAndSetFocus() FAILED due to "
+        "ITfTheadMgr::SetFocus() failure"));
+     EnsureToDestroyAndReleaseEnabledTextStoreIf(textStore);
+     return false;
+   }
+diff --git a/widget/windows/TSFTextStore.h b/widget/windows/TSFTextStore.h
+--- a/widget/windows/TSFTextStore.h
++++ b/widget/windows/TSFTextStore.h
+@@ -248,16 +248,21 @@ public:
+    */
+   static bool IsIMM_IMEActive();
+ 
+   /**
+    * Returns true if active TIP is MS-IME for Japanese.
+    */
+   static bool IsMSJapaneseIMEActive();
+ 
++  /**
++   * Returns true if TSF may crash if GetSelection() returns E_FAIL.
++   */
++  static bool DoNotReturnErrorFromGetSelection();
++
+ #ifdef DEBUG
+   // Returns true when keyboard layout has IME (TIP).
+   static bool     CurrentKeyboardLayoutHasIME();
+ #endif // #ifdef DEBUG
+ 
+ protected:
+   TSFTextStore();
+   ~TSFTextStore();

+ 71 - 0
mozilla-esr52/patches/mozilla-esr52-push_356230.patch

@@ -0,0 +1,71 @@
+# HG changeset patch
+# User Ralph Giles <giles@mozilla.com>
+# Date 1486760298 28800
+#      Fri Feb 10 12:58:18 2017 -0800
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID 21af4e17cbf9f225e99c4103ac73a72311a702d1
+# Parent  459150ea79f6be75c0228450b2ae15c28b5fbe1b
+Bug 1338655 - Don't try to build mp4parse bindings. r=froydnj a=jorgk DONTBUILD
+
+We use the cheddar crate to generate a C header file
+for our mp4parse_capi wrapper crate. Currently we
+do this at code check-in time via update-rust.sh.
+
+Cargo 0.18 and later will try to execute a build.rs
+file in the crate source tree regardless of whether
+it's specified in Cargo.toml so patching out that
+line just results in 'crate cheddar not found'.
+
+This change restores the old behaviour by substituting
+a 'build = false' line instead.
+
+We do have syntex vendored, but we don't currently build
+it by default, so I prefer this solution to just vendoring
+cheddar and generating the header at build time. The syntex
+crate is quite large and adds significantly to our compile
+time.
+
+MozReview-Commit-ID: InJRRODWAdP
+
+diff --git a/media/libstagefright/binding/mp4parse-cargo.patch b/media/libstagefright/binding/mp4parse-cargo.patch
+--- a/media/libstagefright/binding/mp4parse-cargo.patch
++++ b/media/libstagefright/binding/mp4parse-cargo.patch
+@@ -1,15 +1,17 @@
+ diff --git a/media/libstagefright/binding/mp4parse/Cargo.toml b/media/libstagefright/binding/mp4parse/Cargo.toml
+ index ff9422c..814c4c6 100644
+ --- a/media/libstagefright/binding/mp4parse/Cargo.toml
+ +++ b/media/libstagefright/binding/mp4parse/Cargo.toml
+-@@ -18,17 +18,11 @@ exclude = [
++@@ -18,17 +18,13 @@ exclude = [
+  ]
+  
+++build = false
+++
+  [dependencies]
+ -byteorder = "0.5.0"
+ -afl = { version = "0.1.1", optional = true }
+ -afl-plugin = { version = "0.1.1", optional = true }
+ -abort_on_panic = { version = "1.0.0", optional = true }
+ +byteorder = "0.5.0"
+  
+  [dev-dependencies]
+diff --git a/media/libstagefright/binding/mp4parse_capi/Cargo.toml b/media/libstagefright/binding/mp4parse_capi/Cargo.toml
+--- a/media/libstagefright/binding/mp4parse_capi/Cargo.toml
++++ b/media/libstagefright/binding/mp4parse_capi/Cargo.toml
+@@ -13,14 +13,16 @@ license = "MPL-2.0"
+ 
+ repository = "https://github.com/mozilla/mp4parse-rust"
+ 
+ # Avoid complaints about trying to package test files.
+ exclude = [
+   "*.mp4",
+ ]
+ 
++build = false
++
+ [dependencies]
+ "mp4parse" = {version = "0.6.0", path = "../mp4parse"}
+ 
+ # Somewhat heavy-handed, but we want at least -Z force-overflow-checks=on.
+ [profile.release]
+ debug-assertions = true

+ 31 - 0
mozilla-esr52/patches/mozilla-esr52-push_356259.patch

@@ -0,0 +1,31 @@
+# HG changeset patch
+# User Edmund Wong <ewong@pw-wspx.org>
+# Date 1490753240 -28800
+#      Wed Mar 29 10:07:20 2017 +0800
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID 1573a67310ccd1082e7dec4fe50c2c639b00aca3
+# Parent  21af4e17cbf9f225e99c4103ac73a72311a702d1
+Bug 1345781 - Add quotes around the PACKAGE name in case there are spaces. r=Callek a=jorgk
+
+diff --git a/toolkit/locales/l10n.mk b/toolkit/locales/l10n.mk
+--- a/toolkit/locales/l10n.mk
++++ b/toolkit/locales/l10n.mk
+@@ -190,17 +190,17 @@ EN_US_PACKAGE_NAME ?= $(PACKAGE)
+ # The make installers-% target needs the en-US binary in dist/
+ # and for the windows repackages we need the .installer.exe in dist/sea
+ wget-en-US:
+ ifndef WGET
+ 	$(error Wget not installed)
+ endif
+ 	$(NSINSTALL) -D $(ABS_DIST)/$(PKG_PATH)
+ 	(cd $(ABS_DIST)/$(PKG_PATH) && \
+-        $(WGET) --no-cache -nv --no-iri -N -O $(PACKAGE) '$(EN_US_BINARY_URL)/$(EN_US_PACKAGE_NAME)')
++        $(WGET) --no-cache -nv --no-iri -N -O '$(notdir $(PACKAGE))' '$(EN_US_BINARY_URL)/$(EN_US_PACKAGE_NAME)')
+ 	@echo 'Downloaded $(EN_US_BINARY_URL)/$(EN_US_PACKAGE_NAME) to $(ABS_DIST)/$(PKG_PATH)/$(PACKAGE)'
+ ifdef RETRIEVE_WINDOWS_INSTALLER
+ ifeq ($(OS_ARCH), WINNT)
+ 	$(NSINSTALL) -D $(ABS_DIST)/$(PKG_INST_PATH)
+ 	(cd $(ABS_DIST)/$(PKG_INST_PATH) && \
+         $(WGET) --no-cache -nv --no-iri -N '$(EN_US_BINARY_URL)/$(PKG_PATH)$(PKG_INST_BASENAME).exe')
+ 	@echo 'Downloaded $(EN_US_BINARY_URL)/$(PKG_PATH)$(PKG_INST_BASENAME).exe to $(ABS_DIST)/$(PKG_INST_PATH)$(PKG_INST_BASENAME).exe'
+ endif

+ 106 - 0
mozilla-esr52/patches/mozilla-esr52-push_356384.patch

@@ -0,0 +1,106 @@
+# HG changeset patch
+# User Masayuki Nakano <masayuki@d-toybox.com>
+# Date 1499450887 -32400
+#      Sat Jul 08 03:08:07 2017 +0900
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID 2edc4420a9b86363601cd7085495103bfa8c7ee4
+# Parent  5fb6af232f119e02f60cbdc6c24f9db2a558ca77
+Bug 1367482 NativeKey::HandleCharMessage() should treat a WM_CHAR message for '\r' as a Enter key press r=m_kato a=jorgk
+
+Starting from 52, NativeKey::HandleCharMessage() ignores all control characters.  However, some keyboard layout utilities may send WM_CHAR message whose wParam is '\r' for emulating pressing Enter key.  For supporting such utilities, we should dispatch Enter keypress event when HandleCharMessage() receives such event.
+
+Note that this patch does NOT support a pair of WM_KEYDOWN and WM_CHAR whose wParam is '\r' but the WM_KEYDOWN isn't VK_RETURN.  If there is such case, we need to support it too.  However, it needs a lot of code changes.  So, we shouldn't support it until such bug is filed actually.
+
+MozReview-Commit-ID: CWyvBtLmXgg
+
+diff --git a/widget/windows/KeyboardLayout.cpp b/widget/windows/KeyboardLayout.cpp
+--- a/widget/windows/KeyboardLayout.cpp
++++ b/widget/windows/KeyboardLayout.cpp
+@@ -2567,17 +2567,18 @@ NativeKey::HandleCharMessage(const MSG& 
+ {
+   MOZ_ASSERT(IsKeyDownMessage() || IsCharOrSysCharMessage(mMsg));
+   MOZ_ASSERT(IsCharOrSysCharMessage(aCharMsg.message));
+ 
+   if (aEventDispatched) {
+     *aEventDispatched = false;
+   }
+ 
+-  if (IsCharOrSysCharMessage(mMsg) && IsAnotherInstanceRemovingCharMessage()) {
++  if ((IsCharOrSysCharMessage(mMsg) || IsEnterKeyPressCharMessage(mMsg)) &&
++      IsAnotherInstanceRemovingCharMessage()) {
+     MOZ_LOG(sNativeKeyLogger, LogLevel::Warning,
+       ("%p   NativeKey::HandleCharMessage(), WARNING, does nothing because "
+        "the message should be handled in another instance removing this "
+        "message", this));
+     // Consume this for now because it will be handled by another instance.
+     return true;
+   }
+ 
+@@ -2596,17 +2597,19 @@ NativeKey::HandleCharMessage(const MSG& 
+       ("%p   NativeKey::HandleCharMessage(), WARNING, not handled due to "
+        "destroyed the widget", this));
+     return false;
+   }
+ 
+   // When a control key is inputted by a key, it should be handled without
+   // WM_*CHAR messages at receiving WM_*KEYDOWN message.  So, when we receive
+   // WM_*CHAR message directly, we see a control character here.
+-  if (IsControlCharMessage(aCharMsg)) {
++  // Note that when the char is '\r', it means that the char message should
++  // cause "Enter" keypress event for inserting a line break.
++  if (IsControlCharMessage(aCharMsg) && !IsEnterKeyPressCharMessage(aCharMsg)) {
+     // In this case, we don't need to dispatch eKeyPress event because:
+     // 1. We're the only browser which dispatches "keypress" event for
+     //    non-printable characters (Although, both Chrome and Edge dispatch
+     //    "keypress" event for some keys accidentally.  For example, "IntlRo"
+     //    key with Ctrl of Japanese keyboard layout).
+     // 2. Currently, we may handle shortcut keys with "keydown" event if
+     //    it's reserved or something.  So, we shouldn't dispatch "keypress"
+     //    event without it.
+@@ -2623,17 +2626,21 @@ NativeKey::HandleCharMessage(const MSG& 
+ 
+   // XXXmnakano I think that if mMsg is WM_CHAR, i.e., it comes without
+   //            preceding WM_KEYDOWN, we should should dispatch composition
+   //            events instead of eKeyPress because they are not caused by
+   //            actual keyboard operation.
+ 
+   // First, handle normal text input or non-printable key case here.
+   WidgetKeyboardEvent keypressEvent(true, eKeyPress, mWidget);
+-  keypressEvent.mCharCode = static_cast<uint32_t>(aCharMsg.wParam);
++  if (IsEnterKeyPressCharMessage(aCharMsg)) {
++    keypressEvent.mKeyCode = NS_VK_RETURN;
++  } else {
++    keypressEvent.mCharCode = static_cast<uint32_t>(aCharMsg.wParam);
++  }
+   nsresult rv = mDispatcher->BeginNativeInputTransaction();
+   if (NS_WARN_IF(NS_FAILED(rv))) {
+     MOZ_LOG(sNativeKeyLogger, LogLevel::Error,
+       ("%p   NativeKey::HandleCharMessage(), FAILED due to "
+        "BeginNativeInputTransaction() failure", this));
+     return true;
+   }
+ 
+diff --git a/widget/windows/KeyboardLayout.h b/widget/windows/KeyboardLayout.h
+--- a/widget/windows/KeyboardLayout.h
++++ b/widget/windows/KeyboardLayout.h
+@@ -526,16 +526,20 @@ private:
+     return (mMsg.message == MOZ_WM_KEYDOWN ||
+             mMsg.message == MOZ_WM_KEYUP);
+   }
+   bool IsPrintableCharMessage(const MSG& aMSG) const
+   {
+     return aMSG.message == WM_CHAR &&
+            !IsControlChar(static_cast<char16_t>(aMSG.wParam));
+   }
++  bool IsEnterKeyPressCharMessage(const MSG& aMSG) const
++  {
++    return aMSG.message == WM_CHAR && aMSG.wParam == '\r';
++  }
+   bool IsPrintableCharOrSysCharMessage(const MSG& aMSG) const
+   {
+     return IsCharOrSysCharMessage(aMSG) &&
+            !IsControlChar(static_cast<char16_t>(aMSG.wParam));
+   }
+   bool IsControlCharMessage(const MSG& aMSG) const
+   {
+     return IsCharMessage(aMSG.message) &&

+ 31 - 0
mozilla-esr52/patches/mozilla-esr52-push_356385.patch

@@ -0,0 +1,31 @@
+# HG changeset patch
+# User Daniel Stenberg <daniel@haxx.se>
+# Date 1505110560 14400
+#      Mon Sep 11 02:16:00 2017 -0400
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID 2ddcbc54266bd4f8721a878db354d0a0a4117baf
+# Parent  2edc4420a9b86363601cd7085495103bfa8c7ee4
+Bug 1359624 - Disable nsAuthSambaNTLM module on OSX. r=mayhemer a=jorgk DONTBUILD
+
+diff --git a/extensions/auth/nsAuthFactory.cpp b/extensions/auth/nsAuthFactory.cpp
+--- a/extensions/auth/nsAuthFactory.cpp
++++ b/extensions/auth/nsAuthFactory.cpp
+@@ -205,17 +205,17 @@ static const mozilla::Module::CIDEntry k
+ 
+ static const mozilla::Module::ContractIDEntry kAuthContracts[] = {
+   { NS_AUTH_MODULE_CONTRACTID_PREFIX "kerb-gss", &kNS_GSSAUTH_CID },
+   { NS_AUTH_MODULE_CONTRACTID_PREFIX "negotiate-gss", &kNS_NEGOTIATEAUTH_CID },
+ #if defined( USE_SSPI )
+   { NS_AUTH_MODULE_CONTRACTID_PREFIX "negotiate-sspi", &kNS_NEGOTIATEAUTHSSPI_CID },
+   { NS_AUTH_MODULE_CONTRACTID_PREFIX "kerb-sspi", &kNS_KERBAUTHSSPI_CID },
+   { NS_AUTH_MODULE_CONTRACTID_PREFIX "sys-ntlm", &kNS_SYSNTLMAUTH_CID },
+-#else
++#elif !defined(XP_MACOSX)
+   { NS_AUTH_MODULE_CONTRACTID_PREFIX "sys-ntlm", &kNS_SAMBANTLMAUTH_CID },
+ #endif
+   { NS_HTTP_AUTHENTICATOR_CONTRACTID_PREFIX "negotiate", &kNS_HTTPNEGOTIATEAUTH_CID },
+   { NS_AUTH_MODULE_CONTRACTID_PREFIX "sasl-gssapi", &kNS_AUTHSASL_CID },
+   { nullptr }
+ };
+ 
+ //-----------------------------------------------------------------------------

+ 51 - 0
mozilla-esr52/patches/mozilla-esr52-push_356391.patch

@@ -0,0 +1,51 @@
+# HG changeset patch
+# User Tom Prince <mozilla@hocat.ca>
+# Date 1507025630 -7200
+#      Tue Oct 03 12:13:50 2017 +0200
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID 4926d82489d8d56433d45cc804e835180b842786
+# Parent  cce71d51e710a26393edc59e36f6e72d9ff2c75a
+Bug 1405177: Install (slightly) newer pip to install boto. r=nthomas a=jorgk DONTBUILD
+
+diff --git a/testing/mozharness/scripts/release/antivirus.py b/testing/mozharness/scripts/release/antivirus.py
+--- a/testing/mozharness/scripts/release/antivirus.py
++++ b/testing/mozharness/scripts/release/antivirus.py
+@@ -75,16 +75,17 @@ class AntivirusScan(BaseScript, Virtuale
+     CACHE_DIR = 'cache'
+ 
+     def __init__(self):
+         BaseScript.__init__(self,
+             config_options=self.config_options,
+             require_config_file=False,
+             config={
+                 "virtualenv_modules": [
++                    "pip==1.5.5",
+                     "boto",
+                     "redo",
+                     "mar",
+                 ],
+                 "virtualenv_path": "venv",
+             },
+             all_actions=[
+                 "create-virtualenv",
+diff --git a/testing/mozharness/scripts/release/push-candidate-to-releases.py b/testing/mozharness/scripts/release/push-candidate-to-releases.py
+--- a/testing/mozharness/scripts/release/push-candidate-to-releases.py
++++ b/testing/mozharness/scripts/release/push-candidate-to-releases.py
+@@ -66,16 +66,17 @@ class ReleasePusher(BaseScript, Virtuale
+     ] + virtualenv_config_options
+ 
+     def __init__(self, aws_creds):
+         BaseScript.__init__(self,
+             config_options=self.config_options,
+             require_config_file=False,
+             config={
+                 "virtualenv_modules": [
++                    "pip==1.5.5",
+                     "boto",
+                     "redo",
+                 ],
+                 "virtualenv_path": "venv",
+             },
+             all_actions=[
+                 "create-virtualenv",
+                 "activate-virtualenv",

+ 37 - 0
mozilla-esr52/patches/mozilla-esr52-push_356425.patch

@@ -0,0 +1,37 @@
+# HG changeset patch
+# User Justin Wood <Callek@gmail.com>
+# Date 1414548364 14400
+#      Tue Oct 28 22:06:04 2014 -0400
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID b2d10434b32f6d42581754de30db6f5d5bbade62
+# Parent  b8d623653f43d516a8b50bc40eede527f2183429
+Bug 1090219 - SeaMonkey updates for release jobs fail. r-pending=rstrong. a=Callek for CLOSED TREE on a relbranch
+- due to being unable to find BuildID on OSX from pre-v2 signing format changes.
+
+diff --git a/tools/update-packaging/make_incremental_updates.py b/tools/update-packaging/make_incremental_updates.py
+--- a/tools/update-packaging/make_incremental_updates.py
++++ b/tools/update-packaging/make_incremental_updates.py
+@@ -423,18 +423,21 @@ def usage():
+ 
+ def get_buildid(work_dir):
+     """ extracts buildid from MAR
+     """
+     ini = '%s/application.ini' % work_dir
+     if not os.path.exists(ini):
+         ini = '%s/Contents/Resources/application.ini' % work_dir
+         if not os.path.exists(ini):
+-            print 'WARNING: application.ini not found, cannot find build ID'
+-            return ''
++            # Try the old (pre Gecko 34) location
++            ini = '%s/Contents/MacOS/application.ini' % work_dir
++            if not os.path.exists(ini):
++                print 'WARNING: application.ini not found, cannot find build ID'
++                return ''
+ 
+     file = bz2.BZ2File(ini)
+     for line in file:
+         if line.find('BuildID') == 0:
+             return line.strip().split('=')[1]
+     print 'WARNING: cannot find build ID in application.ini'
+     return ''
+ 

+ 32 - 0
mozilla-esr52/patches/mozilla-esr52-push_356660.patch

@@ -0,0 +1,32 @@
+# HG changeset patch
+# User Magnus Melin <mkmelin+mozilla@iki.fi>
+# Date 1512830596 -7200
+#      Sat Dec 09 16:43:16 2017 +0200
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID 1a510ee578a057035fcff6592d65757092d79053
+# Parent  f36516ece06c40d2f232efd2f08e4ef25461ab1c
+Bug 1411745 - fix crash for svg linking to mailbox URI. r=smaug a=jorgk
+
+diff --git a/dom/base/nsDocument.cpp b/dom/base/nsDocument.cpp
+--- a/dom/base/nsDocument.cpp
++++ b/dom/base/nsDocument.cpp
+@@ -1030,17 +1030,18 @@ nsExternalResourceMap::PendingLoad::Setu
+ 
+ NS_IMETHODIMP
+ nsExternalResourceMap::PendingLoad::OnDataAvailable(nsIRequest* aRequest,
+                                                     nsISupports* aContext,
+                                                     nsIInputStream* aStream,
+                                                     uint64_t aOffset,
+                                                     uint32_t aCount)
+ {
+-  NS_PRECONDITION(mTargetListener, "Shouldn't be getting called!");
++  // mTargetListener might be null if SetupViewer or AddExternalResource failed.
++  NS_ENSURE_TRUE(mTargetListener, NS_ERROR_FAILURE);
+   if (mDisplayDocument->ExternalResourceMap().HaveShutDown()) {
+     return NS_BINDING_ABORTED;
+   }
+   return mTargetListener->OnDataAvailable(aRequest, aContext, aStream, aOffset,
+                                           aCount);
+ }
+ 
+ NS_IMETHODIMP

+ 94 - 0
mozilla-esr52/patches/mozilla-esr52-push_356661.patch

@@ -0,0 +1,94 @@
+# HG changeset patch
+# User Jorg K <jorgk@jorgk.com>
+# Date 1513879572 -3600
+#      Thu Dec 21 19:06:12 2017 +0100
+# Branch THUNDERBIRD_52_VERBRANCH
+# Node ID 34c968767eb7aaaeb7d8707cf6b8e0f9fb86aa9c
+# Parent  1a510ee578a057035fcff6592d65757092d79053
+Bug 1411708 - port relevant hunks of bug 1035091 [limit @-moz-document to user and UA sheets]. a=jorgk DONTBUILD
+
+diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp
+--- a/layout/style/nsCSSParser.cpp
++++ b/layout/style/nsCSSParser.cpp
+@@ -68,16 +68,17 @@ static bool sOpentypeSVGEnabled;
+ static bool sWebkitPrefixedAliasesEnabled;
+ static bool sWebkitDevicePixelRatioEnabled;
+ static bool sUnprefixingServiceEnabled;
+ #ifdef NIGHTLY_BUILD
+ static bool sUnprefixingServiceGloballyWhitelisted;
+ #endif
+ static bool sMozGradientsEnabled;
+ static bool sControlCharVisibility;
++static bool sMozDocumentEnabledInContent;
+ 
+ const uint32_t
+ nsCSSProps::kParserVariantTable[eCSSProperty_COUNT_no_shorthands] = {
+ #define CSS_PROP(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, \
+                  stylestruct_, stylestructoffset_, animtype_)                 \
+   parsevariant_,
+ #define CSS_PROP_LIST_INCLUDE_LOGICAL
+ #include "nsCSSPropList.h"
+@@ -3913,16 +3914,21 @@ CSSParserImpl::ParseMediaRule(RuleAppend
+ }
+ 
+ // Parse a @-moz-document rule.  This is like an @media rule, but instead
+ // of a medium it has a nonempty list of items where each item is either
+ // url(), url-prefix(), or domain().
+ bool
+ CSSParserImpl::ParseMozDocumentRule(RuleAppendFunc aAppendFunc, void* aData)
+ {
++  if (mParsingMode == css::eAuthorSheetFeatures &&
++      !sMozDocumentEnabledInContent) {
++    return false;
++  }
++
+   css::DocumentRule::URL *urls = nullptr;
+   css::DocumentRule::URL **next = &urls;
+ 
+   uint32_t linenum, colnum;
+   if (!GetNextTokenLocation(true, &linenum, &colnum)) {
+     return false;
+   }
+ 
+@@ -17967,16 +17973,18 @@ nsCSSParser::Startup()
+ #ifdef NIGHTLY_BUILD
+   Preferences::AddBoolVarCache(&sUnprefixingServiceGloballyWhitelisted,
+                                "layout.css.unprefixing-service.globally-whitelisted");
+ #endif
+   Preferences::AddBoolVarCache(&sMozGradientsEnabled,
+                                "layout.css.prefixes.gradients");
+   Preferences::AddBoolVarCache(&sControlCharVisibility,
+                                "layout.css.control-characters.visible");
++  Preferences::AddBoolVarCache(&sMozDocumentEnabledInContent,
++                               "layout.css.moz-document.content.enabled");
+ }
+ 
+ nsCSSParser::nsCSSParser(mozilla::css::Loader* aLoader,
+                          CSSStyleSheet* aSheet)
+ {
+   CSSParserImpl *impl = gFreeList;
+   if (impl) {
+     gFreeList = impl->mNextFree;
+diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js
+--- a/modules/libpref/init/all.js
++++ b/modules/libpref/init/all.js
+@@ -2444,16 +2444,19 @@ pref("layout.word_select.stop_at_punctua
+ pref("layout.selection.caret_style", 0);
+ 
+ // pref to report CSS errors to the error console
+ pref("layout.css.report_errors", true);
+ 
+ // Should the :visited selector ever match (otherwise :link matches instead)?
+ pref("layout.css.visited_links_enabled", true);
+ 
++// Pref to control whether @-moz-document rules are enabled in content pages.
++pref("layout.css.moz-document.content.enabled",  false);
++
+ // Override DPI. A value of -1 means use the maximum of 96 and the system DPI.
+ // A value of 0 means use the system DPI. A positive value is used as the DPI.
+ // This sets the physical size of a device pixel and thus controls the
+ // interpretation of physical units such as "pt".
+ pref("layout.css.dpi", -1);
+ 
+ // Set the number of device pixels per CSS pixel. A value <= 0 means choose
+ // automatically based on user settings for the platform (e.g., "UI scale factor"

+ 67 - 0
mozilla-esr52/patches/mozilla-esr60_449884.patch

@@ -0,0 +1,67 @@
+# HG changeset patch
+# User Ryan Hunt <rhunt@eqrion.net>
+# Date 1525727226 18000
+#      Mon May 07 16:07:06 2018 -0500
+# Node ID 7b0391a25a29f84c72fcf4d05488ab1daccbfbe2
+# Parent  0b4260b76ba21c52c0d78bafb285dcdd92fba840
+Bug 1420865 - Don't check for CONTENT_MAY_CHANGE_TRANSFORM across layer trees. r=mstange, a=RyanVM
+
+MayResample() is used on the content and compositor to determine whether the whole
+visible region should be or should have been validated. This calculation is done
+partially by traversing ancestor layers and looking for a flag. This can return
+different values then in the content side versus the shadow side, which in this
+case leads to artifacts.
+
+This commit tries to solve the problem by ignoring layers that content is unaware
+of. This works, but has the downside that resampling artifacts could show up if
+the parent process is truly doing animations that require resampling.
+
+MozReview-Commit-ID: 4TW6nzxS6E
+
+diff --git a/gfx/layers/Layers.cpp b/gfx/layers/Layers.cpp
+--- a/gfx/layers/Layers.cpp
++++ b/gfx/layers/Layers.cpp
+@@ -445,16 +445,20 @@ Layer::SnapTransform(const Matrix4x4& aT
+ 
+ static bool
+ AncestorLayerMayChangeTransform(Layer* aLayer)
+ {
+   for (Layer* l = aLayer; l; l = l->GetParent()) {
+     if (l->GetContentFlags() & Layer::CONTENT_MAY_CHANGE_TRANSFORM) {
+       return true;
+     }
++
++    if (l->GetParent() && l->GetParent()->AsRefLayer()) {
++      return false;
++    }
+   }
+   return false;
+ }
+ 
+ bool
+ Layer::MayResample()
+ {
+   Matrix transform2d;
+diff --git a/gfx/layers/Layers.h b/gfx/layers/Layers.h
+--- a/gfx/layers/Layers.h
++++ b/gfx/layers/Layers.h
+@@ -1827,16 +1827,19 @@ public:
+ 
+   virtual int32_t GetMaxLayerSize() { return Manager()->GetMaxTextureSize(); }
+ 
+   /**
+    * Returns true if this layer's effective transform is not just
+    * a translation by integers, or if this layer or some ancestor layer
+    * is marked as having a transform that may change without a full layer
+    * transaction.
++   *
++   * Note: This function ignores ancestor layers across layer tree boundaries
++   * so that it returns a consistent value when compositing and when painting.
+    */
+   bool MayResample();
+ 
+   RenderTargetRect TransformRectToRenderTarget(const LayerIntRect& aRect);
+ 
+   /**
+    * Add debugging information to the layer dump.
+    */

+ 50 - 0
mozilla-esr52/patches/mozilla-esr60_449892.patch

@@ -0,0 +1,50 @@
+# HG changeset patch
+# User Boris Zbarsky <bzbarsky@mit.edu>
+# Date 1529018261 14400
+#      Thu Jun 14 19:17:41 2018 -0400
+# Node ID 078985dd8656d929d079ab9236f5be321037ab08
+# Parent  c3a6baa14bfc0654cde77db5814597a853b5f2bd
+Bug 1466991 - Part 1: Factor out ShouldUseXBLScope. r=smaug, a=RyanVM
+
+We're going to add another consumer in the next changeset.
+
+diff --git a/dom/base/nsIDocument.h b/dom/base/nsIDocument.h
+--- a/dom/base/nsIDocument.h
++++ b/dom/base/nsIDocument.h
+@@ -4011,19 +4011,35 @@ nsINode::GetOwnerDocument() const
+ }
+ 
+ inline nsINode*
+ nsINode::OwnerDocAsNode() const
+ {
+   return OwnerDoc();
+ }
+ 
++// ShouldUseXBLScope is defined here as a template so that we can get the faster
++// version of IsInAnonymousSubtree if we're statically known to be an
++// nsIContent.  we could try defining ShouldUseXBLScope separately on nsINode
++// and nsIContent, but then we couldn't put its nsINode implementation here
++// (because this header does not include nsIContent) and we can't put it in
++// nsIContent.h, because the definition of nsIContent::IsInAnonymousSubtree is
++// in nsIContentInlines.h.  And then we get include hell from people trying to
++// call nsINode::GetParentObject but not including nsIContentInlines.h and with
++// no really good way to include it.
++template<typename T>
++inline bool ShouldUseXBLScope(const T* aNode)
++{
++  return aNode->IsInAnonymousSubtree() &&
++         !aNode->IsAnonymousContentInSVGUseSubtree();
++}
++
+ inline mozilla::dom::ParentObject
+ nsINode::GetParentObject() const
+ {
+   mozilla::dom::ParentObject p(OwnerDoc());
+     // Note that mUseXBLScope is a no-op for chrome, and other places where we
+     // don't use XBL scopes.
+-  p.mUseXBLScope = IsInAnonymousSubtree() && !IsAnonymousContentInSVGUseSubtree();
++  p.mUseXBLScope = ShouldUseXBLScope(this);
+   return p;
+ }
+ 
+ #endif /* nsIDocument_h___ */

+ 188 - 0
mozilla-esr52/patches/mozilla-esr60_449898.patch

@@ -0,0 +1,188 @@
+# HG changeset patch
+# User Gabriele Svelto <gsvelto@mozilla.com>
+# Date 1529567786 -7200
+#      Thu Jun 21 09:56:26 2018 +0200
+# Node ID 0d73faee431ce2a70cf5056714344f442b1fe4af
+# Parent  b0eb38d480c757eabc2ad857c2c158b554ea3185
+Bug 1469603 - Use a recursive lock in crash reporter callbacks that might be called synchronously. r=erahm, a=RyanVM
+
+diff --git a/dom/plugins/ipc/PluginModuleParent.cpp b/dom/plugins/ipc/PluginModuleParent.cpp
+--- a/dom/plugins/ipc/PluginModuleParent.cpp
++++ b/dom/plugins/ipc/PluginModuleParent.cpp
+@@ -590,17 +590,17 @@ PluginModuleChromeParent::OnProcessLaunc
+     if (crashReporter) {
+         crashReporter->AnnotateCrashReport(NS_LITERAL_CSTRING("AsyncPluginInit"),
+                                            mIsStartingAsync ?
+                                                NS_LITERAL_CSTRING("1") :
+                                                NS_LITERAL_CSTRING("0"));
+     }
+ #ifdef XP_WIN
+     { // Scope for lock
+-        mozilla::MutexAutoLock lock(mCrashReporterMutex);
++        ReentrantMonitorAutoEnter mon(mCrashReporterMutex);
+         mCrashReporter = CrashReporter();
+     }
+ #endif
+ #endif
+ 
+ #if defined(XP_WIN) && defined(_X86_)
+     // Protected mode only applies to Windows and only to x86.
+     if (!mIsBlocklisted && mIsFlashPlugin &&
+@@ -819,17 +819,17 @@ PluginModuleChromeParent::~PluginModuleC
+ }
+ 
+ #ifdef MOZ_CRASHREPORTER
+ void
+ PluginModuleChromeParent::WriteExtraDataForMinidump(AnnotationTable& notes)
+ {
+ #ifdef XP_WIN
+     // mCrashReporterMutex is already held by the caller
+-    mCrashReporterMutex.AssertCurrentThreadOwns();
++    mCrashReporterMutex.AssertCurrentThreadIn();
+ #endif
+     typedef nsDependentCString CS;
+ 
+     // Get the plugin filename, try to get just the file leafname
+     const std::string& pluginFile = mSubprocess->GetPluginFilePath();
+     size_t filePos = pluginFile.rfind(FILE_PATH_SEPARATOR);
+     if (filePos == std::string::npos)
+         filePos = 0;
+@@ -1181,17 +1181,17 @@ PluginModuleContentParent::OnExitedSyncS
+ 
+ void
+ PluginModuleChromeParent::TakeFullMinidump(base::ProcessId aContentPid,
+                                            const nsAString& aBrowserDumpId,
+                                            nsString& aDumpId)
+ {
+ #ifdef MOZ_CRASHREPORTER
+ #ifdef XP_WIN
+-    mozilla::MutexAutoLock lock(mCrashReporterMutex);
++    ReentrantMonitorAutoEnter mon(mCrashReporterMutex);
+ #endif // XP_WIN
+ 
+     CrashReporterParent* crashReporter = CrashReporter();
+     if (!crashReporter) {
+         return;
+     }
+ 
+     bool reportsReady = false;
+@@ -1278,17 +1278,17 @@ PluginModuleChromeParent::TerminateChild
+     // because it also needs to lock the mCrashReporterMutex and Mutex doesn't
+     // support recrusive locking.
+     nsAutoString dumpId;
+     if (aDumpId.IsEmpty()) {
+         TakeFullMinidump(aContentPid, EmptyString(), dumpId);
+     }
+ 
+ #ifdef XP_WIN
+-    mozilla::MutexAutoLock lock(mCrashReporterMutex);
++    ReentrantMonitorAutoEnter mon(mCrashReporterMutex);
+     CrashReporterParent* crashReporter = mCrashReporter;
+     if (!crashReporter) {
+         // If mCrashReporter is null then the hang has ended, the plugin module
+         // is shutting down. There's nothing to do here.
+         return;
+     }
+ #else
+     CrashReporterParent* crashReporter = CrashReporter();
+@@ -1504,17 +1504,17 @@ RemoveMinidump(nsIFile* minidump)
+     }
+ }
+ #endif // MOZ_CRASHREPORTER_INJECTOR
+ 
+ void
+ PluginModuleChromeParent::ProcessFirstMinidump()
+ {
+ #ifdef XP_WIN
+-    mozilla::MutexAutoLock lock(mCrashReporterMutex);
++    ReentrantMonitorAutoEnter mon(mCrashReporterMutex);
+ #endif
+     CrashReporterParent* crashReporter = CrashReporter();
+     if (!crashReporter)
+         return;
+ 
+     AnnotationTable notes(4);
+     WriteExtraDataForMinidump(notes);
+ 
+@@ -2962,17 +2962,17 @@ PluginModuleChromeParent::AllocPCrashRep
+ #endif
+ }
+ 
+ bool
+ PluginModuleChromeParent::DeallocPCrashReporterParent(PCrashReporterParent* actor)
+ {
+ #ifdef MOZ_CRASHREPORTER
+ #ifdef XP_WIN
+-    mozilla::MutexAutoLock lock(mCrashReporterMutex);
++    ReentrantMonitorAutoEnter mon(mCrashReporterMutex);
+     if (actor == static_cast<PCrashReporterParent*>(mCrashReporter)) {
+         mCrashReporter = nullptr;
+     }
+ #endif
+ #endif
+     delete actor;
+     return true;
+ }
+diff --git a/dom/plugins/ipc/PluginModuleParent.h b/dom/plugins/ipc/PluginModuleParent.h
+--- a/dom/plugins/ipc/PluginModuleParent.h
++++ b/dom/plugins/ipc/PluginModuleParent.h
+@@ -11,16 +11,17 @@
+ #include "mozilla/FileUtils.h"
+ #include "mozilla/HangAnnotations.h"
+ #include "mozilla/PluginLibrary.h"
+ #include "mozilla/plugins/PluginProcessParent.h"
+ #include "mozilla/plugins/PPluginModuleParent.h"
+ #include "mozilla/plugins/PluginMessageUtils.h"
+ #include "mozilla/plugins/PluginTypes.h"
+ #include "mozilla/ipc/TaskFactory.h"
++#include "mozilla/ReentrantMonitor.h"   // for ReentrantMonitorAutoEnter, etc
+ #include "mozilla/TimeStamp.h"
+ #include "npapi.h"
+ #include "npfunctions.h"
+ #include "nsDataHashtable.h"
+ #include "nsHashKeys.h"
+ #include "nsIObserver.h"
+ #ifdef XP_WIN
+ #include "nsWindowsHelpers.h"
+@@ -503,16 +504,17 @@ class PluginModuleChromeParent
+ 
+     virtual bool
+     RecvProfile(const nsCString& aProfile) override;
+ 
+     virtual bool
+     AnswerGetKeyState(const int32_t& aVirtKey, int16_t* aRet) override;
+ 
+ private:
++    typedef mozilla::ReentrantMonitor ReentrantMonitor;
+     virtual void
+     EnteredCxxStack() override;
+ 
+     void
+     ExitedCxxStack() override;
+ 
+     mozilla::ipc::IProtocol* GetInvokingProtocol();
+     PluginInstanceParent* GetManagingInstance(mozilla::ipc::IProtocol* aProtocol);
+@@ -594,19 +596,21 @@ private:
+     PluginHangUIParent *mHangUIParent;
+     bool mHangUIEnabled;
+     bool mIsTimerReset;
+ #ifdef MOZ_CRASHREPORTER
+     /**
+      * This mutex protects the crash reporter when the Plugin Hang UI event
+      * handler is executing off main thread. It is intended to protect both
+      * the mCrashReporter variable in addition to the CrashReporterParent object
+-     * that mCrashReporter refers to.
++     * that mCrashReporter refers to. Sometimes asynchronous crash reporter
++     * callbacks are dispatched synchronously while the caller is still holding
++     * the mutex. This requires recursive locking support in the mutex.
+      */
+-    mozilla::Mutex mCrashReporterMutex;
++    ReentrantMonitor mCrashReporterMutex;
+     CrashReporterParent* mCrashReporter;
+ #endif // MOZ_CRASHREPORTER
+ 
+ 
+     /**
+      * Launches the Plugin Hang UI.
+      *
+      * @return true if plugin-hang-ui.exe has been successfully launched.

+ 174 - 0
mozilla-esr52/patches/mozilla-esr60_449901.patch

@@ -0,0 +1,174 @@
+# HG changeset patch
+# User Samuel Thibault <samuel.thibault>
+# Date 1530065460 -10800
+#      Wed Jun 27 05:11:00 2018 +0300
+# Branch THUNDERBIRD_60_VERBRANCH
+# Node ID feccfbf2922833dbd8ff0a3f1a9966ad63561c1e
+# Parent  3782c27cdd7c6d91638c12e77f55d0731049fabe
+Bug 1376756 - gtk: while drawing nsTreeBodyFrame, fetch current row attributes for proper style rendering. r=karlt a=jorgk DONTBUILD
+
+diff --git a/layout/xul/tree/nsTreeBodyFrame.h b/layout/xul/tree/nsTreeBodyFrame.h
+--- a/layout/xul/tree/nsTreeBodyFrame.h
++++ b/layout/xul/tree/nsTreeBodyFrame.h
+@@ -200,16 +200,23 @@ public:
+   nsITreeBoxObject* GetTreeBoxObject() const { return mTreeBoxObject; }
+ 
+   // Get the base element, <tree> or <select>
+   nsIContent* GetBaseElement();
+ 
+   bool GetVerticalOverflow() const { return mVerticalOverflow; }
+   bool GetHorizontalOverflow() const {return mHorizontalOverflow; }
+ 
++  // This returns the property array where atoms are stored for style during
++  // draw, whether the row currently being drawn is selected, hovered, etc.
++  const AtomArray & GetPropertyArrayForCurrentDrawingItem()
++  {
++    return mScratchArray;
++  }
++
+ protected:
+   friend class nsOverflowChecker;
+ 
+   // This method paints a specific column background of the tree.
+   DrawResult PaintColumn(nsTreeColumn*        aColumn,
+                          const nsRect&        aColumnRect,
+                          nsPresContext*       aPresContext,
+                          nsRenderingContext&  aRenderingContext,
+diff --git a/widget/gtk/gtk2drawing.c b/widget/gtk/gtk2drawing.c
+--- a/widget/gtk/gtk2drawing.c
++++ b/widget/gtk/gtk2drawing.c
+@@ -1789,17 +1789,20 @@ moz_gtk_treeview_expander_paint(GdkDrawa
+ 
+     ensure_tree_view_widget();
+     gtk_widget_set_direction(gTreeViewWidget, direction);
+ 
+     style = gTreeViewWidget->style;
+ 
+     /* Because the frame we get is of the entire treeview, we can't get the precise
+      * event state of one expander, thus rendering hover and active feedback useless. */
+-    state_type = state->disabled ? GTK_STATE_INSENSITIVE : GTK_STATE_NORMAL;
++    state_type = state->disabled ? GTK_STATE_INSENSITIVE :
++                 state->inHover  ? GTK_STATE_PRELIGHT :
++                 state->selected ? GTK_STATE_SELECTED :
++                                   GTK_STATE_NORMAL;
+ 
+     TSOffsetStyleGCs(style, rect->x, rect->y);
+     gtk_paint_expander(style, drawable, state_type, cliprect, gTreeViewWidget, "treeview",
+                        rect->x + rect->width / 2, rect->y + rect->height / 2, expander_state);
+ 
+     return MOZ_GTK_SUCCESS;
+ }
+ 
+diff --git a/widget/gtk/gtk3drawing.cpp b/widget/gtk/gtk3drawing.cpp
+--- a/widget/gtk/gtk3drawing.cpp
++++ b/widget/gtk/gtk3drawing.cpp
+@@ -988,16 +988,23 @@ moz_gtk_treeview_expander_paint(cairo_t 
+                                 GtkExpanderStyle expander_state,
+                                 GtkTextDirection direction)
+ {
+     /* Because the frame we get is of the entire treeview, we can't get the precise
+      * event state of one expander, thus rendering hover and active feedback useless. */
+     GtkStateFlags state_flags = state->disabled ? GTK_STATE_FLAG_INSENSITIVE :
+                                                   GTK_STATE_FLAG_NORMAL;
+ 
++    if (state->inHover)
++        state_flags =
++            static_cast<GtkStateFlags>(state_flags|GTK_STATE_FLAG_PRELIGHT);
++    if (state->selected)
++        state_flags =
++            static_cast<GtkStateFlags>(state_flags|GTK_STATE_FLAG_SELECTED);
++
+     /* GTK_STATE_FLAG_ACTIVE controls expanded/colapsed state rendering
+      * in gtk_render_expander()
+      */
+     if (expander_state == GTK_EXPANDER_EXPANDED)
+         state_flags = static_cast<GtkStateFlags>(state_flags|checkbox_check_state);
+     else
+         state_flags = static_cast<GtkStateFlags>(state_flags&~(checkbox_check_state));
+ 
+diff --git a/widget/gtk/gtkdrawing.h b/widget/gtk/gtkdrawing.h
+--- a/widget/gtk/gtkdrawing.h
++++ b/widget/gtk/gtkdrawing.h
+@@ -23,16 +23,17 @@
+ extern "C" {
+ #endif /* __cplusplus */
+ #endif
+ 
+ /*** type definitions ***/
+ typedef struct {
+   guint8 active;
+   guint8 focused;
++  guint8 selected;
+   guint8 inHover;
+   guint8 disabled;
+   guint8 isDefault;
+   guint8 canDefault;
+   /* The depressed state is for buttons which remain active for a longer period:
+    * activated toggle buttons or buttons showing a popup menu. */
+   guint8 depressed;
+   gint32 curpos; /* curpos and maxpos are used for scrollbars */
+diff --git a/widget/gtk/nsNativeThemeGTK.cpp b/widget/gtk/nsNativeThemeGTK.cpp
+--- a/widget/gtk/nsNativeThemeGTK.cpp
++++ b/widget/gtk/nsNativeThemeGTK.cpp
+@@ -14,16 +14,17 @@
+ #include "nsIFrame.h"
+ #include "nsIPresShell.h"
+ #include "nsIContent.h"
+ #include "nsViewManager.h"
+ #include "nsNameSpaceManager.h"
+ #include "nsGfxCIID.h"
+ #include "nsTransform2D.h"
+ #include "nsMenuFrame.h"
++#include "tree/nsTreeBodyFrame.h"
+ #include "prlink.h"
+ #include "nsIDOMHTMLInputElement.h"
+ #include "nsRenderingContext.h"
+ #include "nsGkAtoms.h"
+ #include "nsAttrValueInlines.h"
+ 
+ #include "mozilla/EventStates.h"
+ #include "mozilla/Services.h"
+@@ -241,16 +242,17 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u
+       stateFrame = aFrame = aFrame->GetParent();
+     }
+ 
+     EventStates eventState = GetContentState(stateFrame, aWidgetType);
+ 
+     aState->disabled = IsDisabled(aFrame, eventState) || IsReadOnly(aFrame);
+     aState->active  = eventState.HasState(NS_EVENT_STATE_ACTIVE);
+     aState->focused = eventState.HasState(NS_EVENT_STATE_FOCUS);
++    aState->selected = FALSE;
+     aState->inHover = eventState.HasState(NS_EVENT_STATE_HOVER);
+     aState->isDefault = IsDefaultButton(aFrame);
+     aState->canDefault = FALSE; // XXX fix me
+     aState->depressed = FALSE;
+ 
+     if (aWidgetType == NS_THEME_FOCUS_OUTLINE) {
+       aState->disabled = FALSE;
+       aState->active  = FALSE;
+@@ -262,16 +264,25 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u
+       aState->depressed = TRUE; // see moz_gtk_entry_paint()
+     } else if (aWidgetType == NS_THEME_BUTTON ||
+                aWidgetType == NS_THEME_TOOLBARBUTTON ||
+                aWidgetType == NS_THEME_DUALBUTTON ||
+                aWidgetType == NS_THEME_TOOLBARBUTTON_DROPDOWN ||
+                aWidgetType == NS_THEME_MENULIST ||
+                aWidgetType == NS_THEME_MENULIST_BUTTON) {
+       aState->active &= aState->inHover;
++    } else if (aWidgetType == NS_THEME_TREETWISTY ||
++               aWidgetType == NS_THEME_TREETWISTYOPEN) {
++      nsTreeBodyFrame *treeBodyFrame = do_QueryFrame(aFrame);
++      if (treeBodyFrame) {
++        const AtomArray & atoms =
++          treeBodyFrame->GetPropertyArrayForCurrentDrawingItem();
++        aState->selected = atoms.Contains(nsGkAtoms::selected);
++        aState->inHover = atoms.Contains(nsGkAtoms::hover);
++      }
+     }
+ 
+     if (IsFrameContentNodeInNamespace(aFrame, kNameSpaceID_XUL)) {
+       // For these widget types, some element (either a child or parent)
+       // actually has element focus, so we check the focused attribute
+       // to see whether to draw in the focused state.
+       if (aWidgetType == NS_THEME_NUMBER_INPUT ||
+           aWidgetType == NS_THEME_TEXTFIELD ||

+ 32 - 0
mozilla-esr52/patches/mozilla-esr60_449913.patch

@@ -0,0 +1,32 @@
+# HG changeset patch
+# User Paolo Amadini <paolo.mozmail@amadzone.org>
+# Date 1530023256 -3600
+#      Tue Jun 26 15:27:36 2018 +0100
+# Node ID bb310ef154f70dfa4b567e05b54771baae86efff
+# Parent  63e8a4e0e32c11357bd131e254d35867e147ebf9
+Bug 1465458 - Fix launching downloads without a file extension on Windows. r=mak, a=RyanVM
+
+MozReview-Commit-ID: 6VYjHM46gZx
+
+diff --git a/toolkit/components/jsdownloads/src/DownloadIntegration.jsm b/toolkit/components/jsdownloads/src/DownloadIntegration.jsm
+--- a/toolkit/components/jsdownloads/src/DownloadIntegration.jsm
++++ b/toolkit/components/jsdownloads/src/DownloadIntegration.jsm
+@@ -682,17 +682,17 @@ this.DownloadIntegration = {
+     // handle multiple extensions.
+     let fileExtension = null, mimeInfo = null;
+     let match = file.leafName.match(/\.([^.]+)$/);
+     if (match) {
+       fileExtension = match[1];
+     }
+ 
+     let isWindowsExe = AppConstants.platform == "win" &&
+-      fileExtension.toLowerCase() == "exe";
++      fileExtension && fileExtension.toLowerCase() == "exe";
+ 
+     // Ask for confirmation if the file is executable, except on Windows where
+     // the operating system will show the prompt based on the security zone.
+     // We do this here, instead of letting the caller handle the prompt
+     // separately in the user interface layer, for two reasons.  The first is
+     // because of its security nature, so that add-ons cannot forget to do
+     // this check.  The second is that the system-level security prompt would
+     // be displayed at launch time in any case.

+ 113 - 0
mozilla-esr52/patches/mozilla-esr60_449915.patch

@@ -0,0 +1,113 @@
+# HG changeset patch
+# User Eric Rahm <erahm@mozilla.com>
+# Date 1530225280 25200
+#      Thu Jun 28 15:34:40 2018 -0700
+# Node ID 5ece581f9c7be228ba022a3f55828031a287f1fc
+# Parent  345d18e0fb7cbda953fce0f63d1e7394cc12476c
+Bug 1472018 - Limit the lock scope in WebCryptoThreadPool::Shutdown. r=bz, a=RyanVM
+
+In bug 1364624 we switched over to SRWLock on Windows for our internal
+implementation of mozilla::Mutex. This doesn't allow for re-entrancy. The
+WebCryptoThreadPool shutdown code has potential for re-entrancy due to the
+spinning of the main thread event loop while shutting down the worker threads.
+
+By limiting the scope of the lock protecting mPool during shutdown we can avoid
+the re-entrancy. Addtionally we track the shutdown status to avoid dispatching
+events once shutdown has started.
+
+diff --git a/dom/crypto/WebCryptoThreadPool.cpp b/dom/crypto/WebCryptoThreadPool.cpp
+--- a/dom/crypto/WebCryptoThreadPool.cpp
++++ b/dom/crypto/WebCryptoThreadPool.cpp
+@@ -61,16 +61,20 @@ WebCryptoThreadPool::Init()
+   return obs->AddObserver(this, NS_XPCOM_SHUTDOWN_THREADS_OBSERVER_ID, false);
+ }
+ 
+ nsresult
+ WebCryptoThreadPool::DispatchInternal(nsIRunnable* aRunnable)
+ {
+   MutexAutoLock lock(mMutex);
+ 
++  if (mShutdown) {
++    return NS_ERROR_FAILURE;
++  }
++
+   if (!mPool) {
+     NS_ENSURE_TRUE(EnsureNSSInitializedChromeOrContent(), NS_ERROR_FAILURE);
+ 
+     nsCOMPtr<nsIThreadPool> pool(do_CreateInstance(NS_THREADPOOL_CONTRACTID));
+     NS_ENSURE_TRUE(pool, NS_ERROR_FAILURE);
+ 
+     nsresult rv = pool->SetName(NS_LITERAL_CSTRING("SubtleCrypto"));
+     NS_ENSURE_SUCCESS(rv, rv);
+@@ -80,20 +84,31 @@ WebCryptoThreadPool::DispatchInternal(ns
+ 
+   return mPool->Dispatch(aRunnable, NS_DISPATCH_NORMAL);
+ }
+ 
+ void
+ WebCryptoThreadPool::Shutdown()
+ {
+   MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!");
+-  MutexAutoLock lock(mMutex);
+ 
+-  if (mPool) {
+-    mPool->Shutdown();
++  // Limit the scope of locking to avoid deadlocking if DispatchInternal ends
++  // up getting called during shutdown event processing.
++  nsCOMPtr<nsIThreadPool> pool;
++  {
++    MutexAutoLock lock(mMutex);
++    if (mShutdown) {
++      return;
++    }
++    pool = mPool;
++    mShutdown = true;
++  }
++
++  if (pool) {
++    pool->Shutdown();
+   }
+ 
+   nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
+   NS_WARNING_ASSERTION(obs, "Failed to retrieve observer service!");
+ 
+   if (obs) {
+     if (NS_FAILED(obs->RemoveObserver(this,
+                                       NS_XPCOM_SHUTDOWN_THREADS_OBSERVER_ID))) {
+diff --git a/dom/crypto/WebCryptoThreadPool.h b/dom/crypto/WebCryptoThreadPool.h
+--- a/dom/crypto/WebCryptoThreadPool.h
++++ b/dom/crypto/WebCryptoThreadPool.h
+@@ -24,16 +24,17 @@ public:
+ 
+   static nsresult
+   Dispatch(nsIRunnable* aRunnable);
+ 
+ private:
+   WebCryptoThreadPool()
+     : mMutex("WebCryptoThreadPool::mMutex")
+     , mPool(nullptr)
++    , mShutdown(false)
+   { }
+   virtual ~WebCryptoThreadPool()
+   { }
+ 
+   nsresult
+   Init();
+ 
+   nsresult
+@@ -43,14 +44,15 @@ private:
+   Shutdown();
+ 
+   NS_IMETHOD Observe(nsISupports* aSubject,
+                      const char* aTopic,
+                      const char16_t* aData) override;
+ 
+   mozilla::Mutex mMutex;
+   nsCOMPtr<nsIThreadPool> mPool;
++  bool mShutdown;
+ };
+ 
+ } // namespace dom
+ } // namespace mozilla
+ 
+ #endif // mozilla_dom_WebCryptoThreadPool_h

+ 112 - 0
mozilla-esr52/patches/mozilla-esr60_449917.patch

@@ -0,0 +1,112 @@
+# HG changeset patch
+# User Gabriele Svelto <gsvelto@mozilla.com>
+# Date 1529392689 -7200
+#      Tue Jun 19 09:18:09 2018 +0200
+# Node ID 0e6190b701db068e61e5f57249b4acc6f2c92c30
+# Parent  76c4c06935396060d130cb846efb875a394066ae
+Bug 1469309 - Remove an unused sensor type. r=agaynor, a=RyanVM
+
+diff --git a/hal/Hal.cpp b/hal/Hal.cpp
+--- a/hal/Hal.cpp
++++ b/hal/Hal.cpp
+@@ -591,16 +591,17 @@ RegisterSensorObserver(SensorType aSenso
+   }
+ }
+ 
+ void
+ UnregisterSensorObserver(SensorType aSensor, ISensorObserver *aObserver) {
+   AssertMainThread();
+ 
+   if (!gSensorObservers) {
++    HAL_ERR("Un-registering a sensor when none have been registered");
+     return;
+   }
+ 
+   SensorObserverList &observers = GetSensorObservers(aSensor);
+   if (!observers.RemoveObserver(aObserver) || observers.Length() > 0) {
+     return;
+   }
+   DisableSensorNotifications(aSensor);
+diff --git a/hal/HalSensor.h b/hal/HalSensor.h
+--- a/hal/HalSensor.h
++++ b/hal/HalSensor.h
+@@ -13,17 +13,16 @@ namespace mozilla {
+ namespace hal {
+ 
+ /**
+  * Enumeration of sensor types.  They are used to specify type while
+  * register or unregister an observer for a sensor of given type.
+  * If you add or change any here, do the same in GeckoHalDefines.java.
+  */
+ enum SensorType {
+-  SENSOR_UNKNOWN = -1,
+   SENSOR_ORIENTATION = 0,
+   SENSOR_ACCELERATION = 1,
+   SENSOR_PROXIMITY = 2,
+   SENSOR_LINEAR_ACCELERATION = 3,
+   SENSOR_GYROSCOPE = 4,
+   SENSOR_LIGHT = 5,
+   SENSOR_ROTATION_VECTOR = 6,
+   SENSOR_GAME_ROTATION_VECTOR = 7,
+@@ -58,17 +57,17 @@ typedef Observer<SensorAccuracy> ISensor
+ namespace IPC {
+   /**
+    * Serializer for SensorType
+    */
+   template <>
+   struct ParamTraits<mozilla::hal::SensorType>:
+     public ContiguousEnumSerializer<
+              mozilla::hal::SensorType,
+-             mozilla::hal::SENSOR_UNKNOWN,
++             mozilla::hal::SENSOR_ORIENTATION,
+              mozilla::hal::NUM_SENSOR_TYPE> {
+   };
+ 
+   template <>
+   struct ParamTraits<mozilla::hal::SensorAccuracyType>:
+     public ContiguousEnumSerializer<
+              mozilla::hal::SensorAccuracyType,
+              mozilla::hal::SENSOR_ACCURACY_UNKNOWN,
+diff --git a/hal/sandbox/SandboxHal.cpp b/hal/sandbox/SandboxHal.cpp
+--- a/hal/sandbox/SandboxHal.cpp
++++ b/hal/sandbox/SandboxHal.cpp
+@@ -11,16 +11,17 @@
+ #include "mozilla/dom/ContentParent.h"
+ #include "mozilla/hal_sandbox/PHalChild.h"
+ #include "mozilla/hal_sandbox/PHalParent.h"
+ #include "mozilla/dom/TabParent.h"
+ #include "mozilla/dom/TabChild.h"
+ #include "mozilla/dom/battery/Types.h"
+ #include "mozilla/dom/network/Types.h"
+ #include "mozilla/dom/ScreenOrientation.h"
++#include "mozilla/EnumeratedRange.h"
+ #include "mozilla/Observer.h"
+ #include "mozilla/Unused.h"
+ #include "nsAutoPtr.h"
+ #include "WindowIdentifier.h"
+ 
+ using namespace mozilla;
+ using namespace mozilla::dom;
+ using namespace mozilla::hal;
+@@ -399,19 +400,18 @@ public:
+   virtual void
+   ActorDestroy(ActorDestroyReason aWhy) override
+   {
+     // NB: you *must* unconditionally unregister your observer here,
+     // if it *may* be registered below.
+     hal::UnregisterBatteryObserver(this);
+     hal::UnregisterNetworkObserver(this);
+     hal::UnregisterScreenConfigurationObserver(this);
+-    for (int32_t sensor = SENSOR_UNKNOWN + 1;
+-         sensor < NUM_SENSOR_TYPE; ++sensor) {
+-      hal::UnregisterSensorObserver(SensorType(sensor), this);
++    for (auto sensor : MakeEnumeratedRange(NUM_SENSOR_TYPE)) {
++      hal::UnregisterSensorObserver(sensor, this);
+     }
+     hal::UnregisterWakeLockObserver(this);
+     hal::UnregisterSystemClockChangeObserver(this);
+     hal::UnregisterSystemTimezoneChangeObserver(this);
+   }
+ 
+   virtual bool
+   RecvVibrate(InfallibleTArray<unsigned int>&& pattern,

+ 49 - 0
mozilla-esr52/patches/mozilla-esr60_449918.patch

@@ -0,0 +1,49 @@
+# HG changeset patch
+# User Mats Palmgren <mats@mozilla.com>
+# Date 1530313734 -7200
+#      Sat Jun 30 01:08:54 2018 +0200
+# Node ID dbcd9b40290f7fc82e2143b9109bd4799d83d6b2
+# Parent  09f2f38ee8fd933fefdabdd16284a52a181869bb
+Bug 1470260 - Part 1: Ensure that 'this' stays alive for the duration of the TickRefreshDriver call. r=emilio, a=RyanVM
+
+diff --git a/layout/base/nsRefreshDriver.cpp b/layout/base/nsRefreshDriver.cpp
+--- a/layout/base/nsRefreshDriver.cpp
++++ b/layout/base/nsRefreshDriver.cpp
+@@ -473,16 +473,19 @@ private:
+       , mVsyncRate(TimeDuration::Forever())
+       , mProcessedVsync(true)
+     {
+       MOZ_ASSERT(NS_IsMainThread());
+     }
+ 
+     bool NotifyVsync(TimeStamp aVsyncTimestamp) override
+     {
++      // IMPORTANT: All paths through this method MUST hold a strong ref on
++      // |this| for the duration of the TickRefreshDriver callback.
++
+       if (!NS_IsMainThread()) {
+         MOZ_ASSERT(XRE_IsParentProcess());
+         // Compress vsync notifications such that only 1 may run at a time
+         // This is so that we don't flood the refresh driver with vsync messages
+         // if the main thread is blocked for long periods of time
+         { // scope lock
+           MonitorAutoLock lock(mRefreshTickLock);
+           mRecentVsync = aVsyncTimestamp;
+@@ -493,16 +496,17 @@ private:
+         }
+ 
+         nsCOMPtr<nsIRunnable> vsyncEvent =
+              NewRunnableMethod<TimeStamp>(this,
+                                           &RefreshDriverVsyncObserver::TickRefreshDriver,
+                                           aVsyncTimestamp);
+         NS_DispatchToMainThread(vsyncEvent);
+       } else {
++        RefPtr<RefreshDriverVsyncObserver> kungFuDeathGrip(this);
+         TickRefreshDriver(aVsyncTimestamp);
+       }
+ 
+       return true;
+     }
+ 
+     void Shutdown()
+     {

+ 214 - 0
mozilla-esr52/patches/mozilla-esr60_449919.patch

@@ -0,0 +1,214 @@
+# HG changeset patch
+# User Mats Palmgren <mats@mozilla.com>
+# Date 1531673736 14400
+#      Sun Jul 15 12:55:36 2018 -0400
+# Node ID 47af518fe0286f677b7409b7b43bcd9bae81d6d9
+# Parent  8b3f2be5e739e5e9833d39b1cf9c364eae8b8843
+Bug 1470260 - Part 2: Make RefreshDriverTimer ref-counted and hold a strong ref on it on the stack when nsRefreshDriver::Tick can be reached. r=emilio, a=RyanVM
+
+diff --git a/layout/base/nsRefreshDriver.cpp b/layout/base/nsRefreshDriver.cpp
+--- a/layout/base/nsRefreshDriver.cpp
++++ b/layout/base/nsRefreshDriver.cpp
+@@ -138,21 +138,17 @@ namespace mozilla {
+ class RefreshDriverTimer {
+ public:
+   RefreshDriverTimer()
+     : mLastFireEpoch(0)
+     , mLastFireSkipped(false)
+   {
+   }
+ 
+-  virtual ~RefreshDriverTimer()
+-  {
+-    MOZ_ASSERT(mContentRefreshDrivers.Length() == 0, "Should have removed all content refresh drivers from here by now!");
+-    MOZ_ASSERT(mRootRefreshDrivers.Length() == 0, "Should have removed all root refresh drivers from here by now!");
+-  }
++  NS_INLINE_DECL_REFCOUNTING(RefreshDriverTimer)
+ 
+   virtual void AddRefreshDriver(nsRefreshDriver* aDriver)
+   {
+     LOG("[%p] AddRefreshDriver %p", this, aDriver);
+ 
+     bool startTimer = mContentRefreshDrivers.IsEmpty() && mRootRefreshDrivers.IsEmpty();
+     if (IsRootRefreshDriver(aDriver)) {
+       NS_ASSERTION(!mRootRefreshDrivers.Contains(aDriver), "Adding a duplicate root refresh driver!");
+@@ -248,16 +244,22 @@ public:
+       return Nothing();
+     }
+ 
+     return Some(idleEnd - TimeDuration::FromMilliseconds(
+                             nsLayoutUtils::IdlePeriodDeadlineLimit()));
+   }
+ 
+ protected:
++  virtual ~RefreshDriverTimer()
++  {
++    MOZ_ASSERT(mContentRefreshDrivers.Length() == 0, "Should have removed all content refresh drivers from here by now!");
++    MOZ_ASSERT(mRootRefreshDrivers.Length() == 0, "Should have removed all root refresh drivers from here by now!");
++  }
++
+   virtual void StartTimer() = 0;
+   virtual void StopTimer() = 0;
+   virtual void ScheduleNextTick(TimeStamp aNowTime) = 0;
+ 
+   bool IsRootRefreshDriver(nsRefreshDriver* aDriver)
+   {
+     nsPresContext* pc = aDriver->GetPresContext();
+     nsPresContext* rootContext = pc ? pc->GetRootPresContext() : nullptr;
+@@ -330,20 +332,21 @@ protected:
+   bool mLastFireSkipped;
+   TimeStamp mLastFireTime;
+   TimeStamp mTargetTime;
+ 
+   nsTArray<RefPtr<nsRefreshDriver> > mContentRefreshDrivers;
+   nsTArray<RefPtr<nsRefreshDriver> > mRootRefreshDrivers;
+ 
+   // useful callback for nsITimer-based derived classes, here
+-  // bacause of c++ protected shenanigans
++  // because of c++ protected shenanigans
+   static void TimerTick(nsITimer* aTimer, void* aClosure)
+   {
+-    RefreshDriverTimer *timer = static_cast<RefreshDriverTimer*>(aClosure);
++    RefPtr<RefreshDriverTimer> timer =
++      static_cast<RefreshDriverTimer*>(aClosure);
+     timer->Tick();
+   }
+ };
+ 
+ /*
+  * A RefreshDriverTimer that uses a nsITimer as the underlying timer.  Note that
+  * this is a ONE_SHOT timer, not a repeating one!  Subclasses are expected to
+  * implement ScheduleNextTick and intelligently calculate the next time to tick,
+@@ -454,19 +457,17 @@ public:
+     return mVsyncRate != TimeDuration::Forever()
+              ? mVsyncRate
+              : TimeDuration::FromMilliseconds(1000.0 / 60.0);
+   }
+ 
+ private:
+   // Since VsyncObservers are refCounted, but the RefreshDriverTimer are
+   // explicitly shutdown. We create an inner class that has the VsyncObserver
+-  // and is shutdown when the RefreshDriverTimer is deleted. The alternative is
+-  // to (a) make all RefreshDriverTimer RefCounted or (b) use different
+-  // VsyncObserver types.
++  // and is shutdown when the RefreshDriverTimer is deleted.
+   class RefreshDriverVsyncObserver final : public VsyncObserver
+   {
+   public:
+     explicit RefreshDriverVsyncObserver(VsyncRefreshDriverTimer* aVsyncRefreshDriverTimer)
+       : mVsyncRefreshDriverTimer(aVsyncRefreshDriverTimer)
+       , mRefreshTickLock("RefreshTickLock")
+       , mRecentVsync(TimeStamp::Now())
+       , mLastChildTick(TimeStamp::Now())
+@@ -579,17 +580,19 @@ private:
+         mLastChildTick = TimeStamp::Now();
+       }
+       MOZ_ASSERT(aVsyncTimestamp <= TimeStamp::Now());
+ 
+       // We might have a problem that we call ~VsyncRefreshDriverTimer() before
+       // the scheduled TickRefreshDriver() runs. Check mVsyncRefreshDriverTimer
+       // before use.
+       if (mVsyncRefreshDriverTimer) {
+-        mVsyncRefreshDriverTimer->RunRefreshDrivers(aVsyncTimestamp);
++        RefPtr<VsyncRefreshDriverTimer> timer = mVsyncRefreshDriverTimer;
++        timer->RunRefreshDrivers(aVsyncTimestamp);
++        // Note: mVsyncRefreshDriverTimer might be null now.
+       }
+     }
+ 
+     // VsyncRefreshDriverTimer holds this RefreshDriverVsyncObserver and it will
+     // be always available before Shutdown(). We can just use the raw pointer
+     // here.
+     VsyncRefreshDriverTimer* mVsyncRefreshDriverTimer;
+     Monitor mRefreshTickLock;
+@@ -832,17 +835,18 @@ protected:
+       mLastFireSkipped = mLastFireSkipped || drivers[index]->SkippedPaints();
+     }
+ 
+     mNextDriverIndex++;
+   }
+ 
+   static void TimerTickOne(nsITimer* aTimer, void* aClosure)
+   {
+-    InactiveRefreshDriverTimer *timer = static_cast<InactiveRefreshDriverTimer*>(aClosure);
++    RefPtr<InactiveRefreshDriverTimer> timer =
++      static_cast<InactiveRefreshDriverTimer*>(aClosure);
+     timer->TickOne();
+   }
+ 
+   double mNextTickDuration;
+   double mDisableAfterMilliseconds;
+   uint32_t mNextDriverIndex;
+ };
+ 
+@@ -884,18 +888,18 @@ private:
+     MOZ_ASSERT(NS_IsMainThread());
+     MOZ_CRASH("Failed To Create VsyncChild Actor");
+   }
+ }; // VsyncChildCreateCallback
+ NS_IMPL_ISUPPORTS(VsyncChildCreateCallback, nsIIPCBackgroundChildCreateCallback)
+ 
+ } // namespace mozilla
+ 
+-static RefreshDriverTimer* sRegularRateTimer;
+-static InactiveRefreshDriverTimer* sThrottledRateTimer;
++static StaticRefPtr<RefreshDriverTimer> sRegularRateTimer;
++static StaticRefPtr<InactiveRefreshDriverTimer> sThrottledRateTimer;
+ 
+ #ifdef XP_WIN
+ static int32_t sHighPrecisionTimerRequests = 0;
+ // a bare pointer to avoid introducing a static constructor
+ static nsITimer *sDisableHighPrecisionTimersTimer = nullptr;
+ #endif
+ 
+ static void
+@@ -967,19 +971,16 @@ GetFirstFrameDelay(imgIRequest* req)
+ 
+   return static_cast<uint32_t>(delay);
+ }
+ 
+ /* static */ void
+ nsRefreshDriver::Shutdown()
+ {
+   // clean up our timers
+-  delete sRegularRateTimer;
+-  delete sThrottledRateTimer;
+-
+   sRegularRateTimer = nullptr;
+   sThrottledRateTimer = nullptr;
+ 
+ #ifdef XP_WIN
+   if (sDisableHighPrecisionTimersTimer) {
+     sDisableHighPrecisionTimersTimer->Cancel();
+     NS_RELEASE(sDisableHighPrecisionTimersTimer);
+     timeEndPeriod(1);
+@@ -2236,26 +2237,25 @@ nsRefreshDriver::SetThrottled(bool aThro
+   }
+ }
+ 
+ /*static*/ void
+ nsRefreshDriver::PVsyncActorCreated(VsyncChild* aVsyncChild)
+ {
+   MOZ_ASSERT(NS_IsMainThread());
+   MOZ_ASSERT(!XRE_IsParentProcess());
+-  auto* vsyncRefreshDriverTimer =
+-      new VsyncRefreshDriverTimer(aVsyncChild);
++  RefPtr<RefreshDriverTimer> vsyncRefreshDriverTimer =
++    new VsyncRefreshDriverTimer(aVsyncChild);
+ 
+   // If we are using software timer, swap current timer to
+   // VsyncRefreshDriverTimer.
+   if (sRegularRateTimer) {
+     sRegularRateTimer->SwapRefreshDrivers(vsyncRefreshDriverTimer);
+-    delete sRegularRateTimer;
+   }
+-  sRegularRateTimer = vsyncRefreshDriverTimer;
++  sRegularRateTimer = vsyncRefreshDriverTimer.forget();
+ }
+ 
+ void
+ nsRefreshDriver::DoRefresh()
+ {
+   // Don't do a refresh unless we're in a state where we should be refreshing.
+   if (!IsFrozen() && mPresContext && mActiveTimer) {
+     DoTick();

Some files were not shown because too many files changed in this diff