summaryrefslogtreecommitdiffstats
path: root/taskcluster/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'taskcluster/scripts')
-rwxr-xr-xtaskcluster/scripts/builder/build-haz-linux.sh190
-rwxr-xr-xtaskcluster/scripts/builder/build-l10n.sh111
-rwxr-xr-xtaskcluster/scripts/builder/build-linux.sh130
-rwxr-xr-xtaskcluster/scripts/builder/build-sm-mozjs-crate.sh17
-rwxr-xr-xtaskcluster/scripts/builder/build-sm-package.sh39
-rwxr-xr-xtaskcluster/scripts/builder/build-sm-rust-bindings.sh17
-rwxr-xr-xtaskcluster/scripts/builder/build-sm.sh57
-rwxr-xr-xtaskcluster/scripts/builder/repackage.sh104
-rw-r--r--taskcluster/scripts/builder/requirements.txt1
-rwxr-xr-xtaskcluster/scripts/builder/sm-tooltool-config.sh67
-rwxr-xr-xtaskcluster/scripts/copy.sh9
-rwxr-xr-xtaskcluster/scripts/iris/run-iris-linux.sh59
-rwxr-xr-xtaskcluster/scripts/iris/run-iris-macos.sh38
-rwxr-xr-xtaskcluster/scripts/iris/run-iris-windows.sh71
-rwxr-xr-xtaskcluster/scripts/misc/android-gradle-dependencies.sh17
-rwxr-xr-xtaskcluster/scripts/misc/android-gradle-dependencies/after.sh31
-rwxr-xr-xtaskcluster/scripts/misc/android-gradle-dependencies/before.sh30
-rw-r--r--taskcluster/scripts/misc/android-gradle-dependencies/nexus.xml413
-rwxr-xr-xtaskcluster/scripts/misc/browsertime.sh19
-rwxr-xr-xtaskcluster/scripts/misc/build-binutils-linux.sh12
-rwxr-xr-xtaskcluster/scripts/misc/build-cbindgen.sh46
-rwxr-xr-xtaskcluster/scripts/misc/build-cctools-port.sh91
-rwxr-xr-xtaskcluster/scripts/misc/build-clang-mingw.sh311
-rwxr-xr-xtaskcluster/scripts/misc/build-clang-tidy-external.sh14
-rwxr-xr-xtaskcluster/scripts/misc/build-clang.sh58
-rwxr-xr-xtaskcluster/scripts/misc/build-compiler-rt.sh78
-rwxr-xr-xtaskcluster/scripts/misc/build-custom-v8.sh47
-rwxr-xr-xtaskcluster/scripts/misc/build-dist-toolchains.sh12
-rwxr-xr-xtaskcluster/scripts/misc/build-dump-syms.sh66
-rwxr-xr-xtaskcluster/scripts/misc/build-fix-stacks.sh71
-rwxr-xr-xtaskcluster/scripts/misc/build-gcc-linux.sh23
-rwxr-xr-xtaskcluster/scripts/misc/build-gcc-mingw32.sh27
-rwxr-xr-xtaskcluster/scripts/misc/build-gcc-sixgill-plugin-linux.sh81
-rwxr-xr-xtaskcluster/scripts/misc/build-geckodriver.sh66
-rwxr-xr-xtaskcluster/scripts/misc/build-gn-common.sh63
-rwxr-xr-xtaskcluster/scripts/misc/build-gn-linux.sh21
-rwxr-xr-xtaskcluster/scripts/misc/build-gn-macosx.sh38
-rwxr-xr-xtaskcluster/scripts/misc/build-gn-win32.sh18
-rwxr-xr-xtaskcluster/scripts/misc/build-grcov.sh48
-rwxr-xr-xtaskcluster/scripts/misc/build-hfsplus-linux.sh14
-rwxr-xr-xtaskcluster/scripts/misc/build-infer-linux.sh18
-rwxr-xr-xtaskcluster/scripts/misc/build-libdmg-hfsplus.sh28
-rwxr-xr-xtaskcluster/scripts/misc/build-liblowercase.sh19
-rwxr-xr-xtaskcluster/scripts/misc/build-llvm-dsymutil.sh27
-rwxr-xr-xtaskcluster/scripts/misc/build-lucetc.sh20
-rwxr-xr-xtaskcluster/scripts/misc/build-makecab.sh17
-rwxr-xr-xtaskcluster/scripts/misc/build-mar-tools.sh27
-rwxr-xr-xtaskcluster/scripts/misc/build-mingw-fxc2-x86.sh25
-rwxr-xr-xtaskcluster/scripts/misc/build-mingw32-nsis.sh47
-rwxr-xr-xtaskcluster/scripts/misc/build-minidump-stackwalk.sh49
-rwxr-xr-xtaskcluster/scripts/misc/build-nasm.sh53
-rwxr-xr-xtaskcluster/scripts/misc/build-resourcemonitor.sh40
-rwxr-xr-xtaskcluster/scripts/misc/build-rust-size.sh39
-rwxr-xr-xtaskcluster/scripts/misc/build-sccache.sh64
-rwxr-xr-xtaskcluster/scripts/misc/build-upx.sh26
-rwxr-xr-xtaskcluster/scripts/misc/build-wasi-sysroot.sh12
-rwxr-xr-xtaskcluster/scripts/misc/build-winchecksec.sh53
-rwxr-xr-xtaskcluster/scripts/misc/build-wine.sh29
-rw-r--r--taskcluster/scripts/misc/exfiltrate-pdbstr.sh9
-rw-r--r--taskcluster/scripts/misc/fetch-chromium.py234
-rwxr-xr-xtaskcluster/scripts/misc/fetch-content733
-rwxr-xr-xtaskcluster/scripts/misc/generate-codeql-db-cpp.sh19
-rwxr-xr-xtaskcluster/scripts/misc/generate-codeql-db-javascript.sh17
-rw-r--r--taskcluster/scripts/misc/mingw-dwrite_3.patch84
-rw-r--r--taskcluster/scripts/misc/mingw-winrt.patch5525
-rwxr-xr-xtaskcluster/scripts/misc/osx-cross-linker7
-rwxr-xr-xtaskcluster/scripts/misc/pack.sh22
-rwxr-xr-xtaskcluster/scripts/misc/repack-android-emulator-linux.sh23
-rwxr-xr-xtaskcluster/scripts/misc/repack-android-ndk-linux.sh19
-rwxr-xr-xtaskcluster/scripts/misc/repack-android-sdk-linux.sh21
-rwxr-xr-xtaskcluster/scripts/misc/repack-clang-linux-macosx-cross.sh30
-rwxr-xr-xtaskcluster/scripts/misc/repack-clang-linux-win-cross.sh18
-rwxr-xr-xtaskcluster/scripts/misc/repack-llvm-symbolizer.sh12
-rwxr-xr-xtaskcluster/scripts/misc/repack-node.sh74
-rwxr-xr-xtaskcluster/scripts/misc/repack_rust.py717
-rwxr-xr-xtaskcluster/scripts/misc/run-profileserver-macos.sh20
-rwxr-xr-xtaskcluster/scripts/misc/run-profileserver.sh42
-rwxr-xr-xtaskcluster/scripts/misc/source-test-clang-non-unified.sh5
-rwxr-xr-xtaskcluster/scripts/misc/source-test-clang-setup.sh25
-rwxr-xr-xtaskcluster/scripts/misc/source-test-common.sh16
-rwxr-xr-xtaskcluster/scripts/misc/source-test-infer-setup.sh18
-rw-r--r--taskcluster/scripts/misc/tooltool-download.sh21
-rwxr-xr-xtaskcluster/scripts/misc/unify.sh45
-rwxr-xr-xtaskcluster/scripts/misc/verify-updatebot.py266
-rw-r--r--taskcluster/scripts/misc/vs-cleanup.sh13
-rw-r--r--taskcluster/scripts/misc/vs-setup.sh8
-rw-r--r--taskcluster/scripts/misc/vs-setup32.sh8
-rwxr-xr-xtaskcluster/scripts/misc/wgpu-deps-vendoring.sh26
-rwxr-xr-xtaskcluster/scripts/misc/wr-cargotest-macos-build.sh24
-rwxr-xr-xtaskcluster/scripts/misc/wr-macos-cross-build-setup.sh61
-rwxr-xr-xtaskcluster/scripts/misc/wrench-android-build.sh29
-rwxr-xr-xtaskcluster/scripts/misc/wrench-deps-vendoring.sh28
-rwxr-xr-xtaskcluster/scripts/misc/wrench-macos-build.sh58
-rw-r--r--taskcluster/scripts/misc/wrench-windows-tests.sh30
-rwxr-xr-xtaskcluster/scripts/misc/zstdpy79
-rwxr-xr-xtaskcluster/scripts/run-task966
-rwxr-xr-xtaskcluster/scripts/tester/run-wizard178
-rwxr-xr-xtaskcluster/scripts/tester/test-linux.sh286
98 files changed, 13034 insertions, 0 deletions
diff --git a/taskcluster/scripts/builder/build-haz-linux.sh b/taskcluster/scripts/builder/build-haz-linux.sh
new file mode 100755
index 0000000000..ad572876e6
--- /dev/null
+++ b/taskcluster/scripts/builder/build-haz-linux.sh
@@ -0,0 +1,190 @@
+#!/bin/bash -ex
+
+function usage() {
+ echo "Usage: $0 [--project <js|browser>] <workspace-dir> flags..."
+ echo "flags are treated the same way as a commit message would be"
+ echo "(as in, they are scanned for directives just like a try: ... line)"
+}
+
+PROJECT=js
+WORKSPACE=
+while [[ $# -gt 0 ]]; do
+ if [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]]; then
+ usage
+ exit 0
+ elif [[ "$1" == "--project" ]]; then
+ shift
+ PROJECT="$1"
+ shift
+ elif [[ "$1" == "--no-tooltool" ]]; then
+ shift
+ elif [[ -z "$WORKSPACE" ]]; then
+ WORKSPACE=$( cd "$1" && pwd )
+ shift
+ break
+ fi
+done
+
+function check_commit_msg () {
+ ( set +e;
+ if [[ -n "$AUTOMATION" ]]; then
+ hg --cwd "$GECKO_PATH" log -r. --template '{desc}\n' | grep -F -q -- "$1"
+ else
+ echo -- "$SCRIPT_FLAGS" | grep -F -q -- "$1"
+ fi
+ )
+}
+
+if check_commit_msg "--dep"; then
+ HAZ_DEP=1
+fi
+
+SCRIPT_FLAGS=$*
+
+ANALYSIS_DIR="$WORKSPACE/haz-$PROJECT"
+
+# Ensure all the scripts in this dir are on the path....
+DIRNAME=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+PATH=$DIRNAME:$PATH
+
+# Use GECKO_BASE_REPOSITORY as a signal for whether we are running in automation.
+export AUTOMATION=${GECKO_BASE_REPOSITORY:+1}
+
+: "${GECKO_PATH:="$DIRNAME"/../../..}"
+
+if ! [ -d "$GECKO_PATH" ]; then
+ echo "GECKO_PATH must be set to a directory containing a gecko source checkout" >&2
+ exit 1
+fi
+
+# Directory to hold the compiled JS shell that will run the analysis.
+HAZARD_SHELL_OBJDIR=$WORKSPACE/obj-haz-shell
+
+export NO_MERCURIAL_SETUP_CHECK=1
+
+if [[ "$PROJECT" = "browser" ]]; then (
+ cd "$WORKSPACE"
+ set "$WORKSPACE"
+ # Mozbuild config:
+ export MOZBUILD_STATE_PATH=$WORKSPACE/mozbuild/
+ # Create .mozbuild so mach doesn't complain about this
+ mkdir -p "$MOZBUILD_STATE_PATH"
+) fi
+
+# Build the shell
+export HAZARD_SHELL_OBJDIR # This will be picked up by mozconfig.haz_shell.
+$GECKO_PATH/mach hazards build-shell
+
+# Run a self-test
+$GECKO_PATH/mach hazards self-test --shell-objdir="$HAZARD_SHELL_OBJDIR"
+
+# Artifacts folder is outside of the cache.
+mkdir -p "$HOME"/artifacts/ || true
+
+function grab_artifacts () {
+ local artifacts
+ artifacts="$HOME/artifacts"
+
+ [ -d "$ANALYSIS_DIR" ] && (
+ cd "$ANALYSIS_DIR"
+ ls -lah
+
+ # Do not error out if no files found
+ shopt -s nullglob
+ set +e
+ local important
+ important=(refs.txt unnecessary.txt hazards.txt gcFunctions.txt allFunctions.txt heapWriteHazards.txt)
+
+ # Bundle up the less important but still useful intermediate outputs,
+ # just to cut down on the clutter in treeherder's Job Details pane.
+ tar -acvf "${artifacts}/hazardIntermediates.tar.xz" --exclude-from <(IFS=$'\n'; echo "${important[*]}") *.txt *.lst build_xgill.log
+
+ # Upload the important outputs individually, so that they will be
+ # visible in Job Details and accessible to automated jobs.
+ for f in "${important[@]}"; do
+ gzip -9 -c "$f" > "${artifacts}/$f.gz"
+ done
+
+ # Check whether the user requested .xdb file upload in the top commit comment
+ if check_commit_msg "--upload-xdbs"; then
+ HAZ_UPLOAD_XDBS=1
+ fi
+
+ if [ -n "$HAZ_UPLOAD_XDBS" ]; then
+ for f in *.xdb; do
+ xz -c "$f" > "${artifacts}/$f.bz2"
+ done
+ fi
+ )
+}
+
+function check_hazards () {
+ (
+ set +e
+ NUM_HAZARDS=$(grep -c 'Function.*has unrooted.*live across GC call' "$1"/rootingHazards.txt)
+ NUM_UNSAFE=$(grep -c '^Function.*takes unsafe address of unrooted' "$1"/refs.txt)
+ NUM_UNNECESSARY=$(grep -c '^Function.* has unnecessary root' "$1"/unnecessary.txt)
+ NUM_DROPPED=$(grep -c '^Dropped CFG' "$1"/build_xgill.log)
+ NUM_WRITE_HAZARDS=$(perl -lne 'print $1 if m!found (\d+)/\d+ allowed errors!' "$1"/heapWriteHazards.txt)
+ NUM_MISSING=$(grep -c '^Function.*expected hazard.*but none were found' "$1"/rootingHazards.txt)
+
+ set +x
+ echo "TinderboxPrint: rooting hazards<br/>$NUM_HAZARDS"
+ echo "TinderboxPrint: (unsafe references to unrooted GC pointers)<br/>$NUM_UNSAFE"
+ echo "TinderboxPrint: (unnecessary roots)<br/>$NUM_UNNECESSARY"
+ echo "TinderboxPrint: missing expected hazards<br/>$NUM_MISSING"
+ echo "TinderboxPrint: heap write hazards<br/>$NUM_WRITE_HAZARDS"
+
+ # Display errors in a way that will get picked up by the taskcluster scraper.
+ perl -lne 'print "TEST-UNEXPECTED-FAIL | hazards | $1 $2" if /^Function.* has (unrooted .*live across GC call).* (at .*)$/' "$1"/hazards.txt
+
+ exit_status=0
+
+ if [ $NUM_HAZARDS -gt 0 ]; then
+ echo "TEST-UNEXPECTED-FAIL | hazards | $NUM_HAZARDS rooting hazards detected" >&2
+ echo "TinderboxPrint: documentation<br/><a href='https://wiki.mozilla.org/Javascript:Hazard_Builds#Diagnosing_a_rooting_hazards_failure'>static rooting hazard analysis failures</a>, visit \"Inspect Task\" link for hazard details"
+ exit_status=1
+ fi
+
+ if [ $NUM_MISSING -gt 0 ]; then
+ echo "TEST-UNEXPECTED-FAIL | hazards | $NUM_MISSING expected hazards went undetected" >&2
+ echo "TinderboxPrint: documentation<br/><a href='https://wiki.mozilla.org/Javascript:Hazard_Builds#Diagnosing_a_rooting_hazards_failure'>static rooting hazard analysis failures</a>, visit \"Inspect Task\" link for hazard details"
+ exit_status=1
+ fi
+
+ NUM_ALLOWED_WRITE_HAZARDS=0
+ if [ $NUM_WRITE_HAZARDS -gt $NUM_ALLOWED_WRITE_HAZARDS ]; then
+ echo "TEST-UNEXPECTED-FAIL | heap-write-hazards | $NUM_WRITE_HAZARDS heap write hazards detected out of $NUM_ALLOWED_WRITE_HAZARDS allowed" >&2
+ echo "TinderboxPrint: documentation<br/><a href='https://wiki.mozilla.org/Javascript:Hazard_Builds#Diagnosing_a_heap_write_hazard_failure'>heap write hazard analysis failures</a>, visit \"Inspect Task\" link for hazard details"
+ exit_status = 1
+ fi
+
+ if [ $NUM_DROPPED -gt 0 ]; then
+ echo "TEST-UNEXPECTED-FAIL | hazards | $NUM_DROPPED CFGs dropped" >&2
+ echo "TinderboxPrint: sixgill unable to handle constructs<br/>$NUM_DROPPED"
+ exit_status=1
+ fi
+
+ if [ $exit_status -ne 0 ]; then
+ exit $exit_status
+ fi
+ )
+}
+
+trap grab_artifacts EXIT
+
+# Directory to hold the (useless) object files generated by the analysis.
+export HAZ_OBJDIR="$WORKSPACE/obj-analyzed-$PROJECT"
+mkdir -p "$HAZ_OBJDIR"
+
+export LD_LIBRARY_PATH="$MOZ_FETCHES_DIR/gcc/lib64:$LD_LIBRARY_PATH"
+
+# Gather the information from the source tree by compiling it.
+$GECKO_PATH/mach hazards gather --application=$PROJECT --haz-objdir="$HAZ_OBJDIR" --work-dir="$ANALYSIS_DIR"
+
+# Analyze the collected information.
+$GECKO_PATH/mach hazards analyze --application=$PROJECT --shell-objdir="$HAZARD_SHELL_OBJDIR" --work-dir="$ANALYSIS_DIR"
+
+check_hazards "$ANALYSIS_DIR"
+
+################################### script end ###################################
diff --git a/taskcluster/scripts/builder/build-l10n.sh b/taskcluster/scripts/builder/build-l10n.sh
new file mode 100755
index 0000000000..e9e9db81e8
--- /dev/null
+++ b/taskcluster/scripts/builder/build-l10n.sh
@@ -0,0 +1,111 @@
+#! /bin/bash -vex
+
+set -x -e
+
+echo "running as" $(id)
+
+. /builds/worker/scripts/xvfb.sh
+
+####
+# Taskcluster friendly wrapper for performing fx desktop l10n repacks via mozharness.
+# Based on ./build-linux.sh
+####
+
+# Inputs, with defaults
+
+: MOZHARNESS_SCRIPT ${MOZHARNESS_SCRIPT}
+: MOZHARNESS_CONFIG ${MOZHARNESS_CONFIG}
+: MOZHARNESS_CONFIG_PATHS ${MOZHARNESS_CONFIG_PATHS}
+: MOZHARNESS_ACTIONS ${MOZHARNESS_ACTIONS}
+: MOZHARNESS_OPTIONS ${MOZHARNESS_OPTIONS}
+
+: TOOLTOOL_CACHE ${TOOLTOOL_CACHE:=/builds/worker/tooltool-cache}
+
+: MOZ_SCM_LEVEL ${MOZ_SCM_LEVEL:=1}
+
+: NEED_XVFB ${NEED_XVFB:=false}
+
+: MOZ_SCM_LEVEL ${MOZ_SCM_LEVEL:=1}
+
+: WORKSPACE ${WORKSPACE:=/builds/worker/workspace}
+: MOZ_OBJDIR ${MOZ_OBJDIR:=$WORKSPACE/obj-build}
+
+set -v
+
+fail() {
+ echo # make sure error message is on a new line
+ echo "[build-l10n.sh:error]" "${@}"
+ exit 1
+}
+
+export MOZ_CRASHREPORTER_NO_REPORT=1
+export TINDERBOX_OUTPUT=1
+
+# Ensure that in tree libraries can be found
+export LIBRARY_PATH=$LIBRARY_PATH:$WORKSPACE/obj-build:$WORKSPACE/src/gcc/lib64
+
+# test required parameters are supplied
+if [[ -z ${MOZHARNESS_SCRIPT} ]]; then fail "MOZHARNESS_SCRIPT is not set"; fi
+if [[ -z "${MOZHARNESS_CONFIG}" && -z "${EXTRA_MOZHARNESS_CONFIG}" ]]; then fail "MOZHARNESS_CONFIG or EXTRA_MOZHARNESS_CONFIG is not set"; fi
+
+cleanup() {
+ local rv=$?
+ cleanup_xvfb
+ exit $rv
+}
+trap cleanup EXIT INT
+
+# run XVfb in the background, if necessary
+if $NEED_XVFB; then
+ start_xvfb '1024x768x24' 2
+fi
+
+# set up mozharness configuration, via command line, env, etc.
+
+# $TOOLTOOL_CACHE bypasses mozharness completely and is read by tooltool_wrapper.sh to set the
+# cache. However, only some mozharness scripts use tooltool_wrapper.sh, so this may not be
+# entirely effective.
+export TOOLTOOL_CACHE
+
+export MOZ_OBJDIR
+
+config_path_cmds=""
+for path in ${MOZHARNESS_CONFIG_PATHS}; do
+ config_path_cmds="${config_path_cmds} --extra-config-path ${GECKO_PATH}/${path}"
+done
+
+# support multiple, space delimited, config files
+config_cmds=""
+for cfg in $MOZHARNESS_CONFIG; do
+ config_cmds="${config_cmds} --config ${cfg}"
+done
+
+# if MOZHARNESS_ACTIONS is given, only run those actions (completely overriding default_actions
+# in the mozharness configuration)
+if [ -n "$MOZHARNESS_ACTIONS" ]; then
+ actions=""
+ for action in $MOZHARNESS_ACTIONS; do
+ actions="$actions --$action"
+ done
+fi
+
+# if MOZHARNESS_OPTIONS is given, append them to mozharness command line run
+if [ -n "$MOZHARNESS_OPTIONS" ]; then
+ options=""
+ for option in $MOZHARNESS_OPTIONS; do
+ options="$options --$option"
+ done
+fi
+
+cd /builds/worker
+
+$GECKO_PATH/mach python \
+ --requirements $GECKO_PATH/taskcluster/scripts/builder/requirements.txt \
+ -- \
+ $GECKO_PATH/testing/${MOZHARNESS_SCRIPT} \
+ ${config_path_cmds} \
+ ${config_cmds} \
+ $actions \
+ $options \
+ --log-level=debug \
+ --work-dir=$WORKSPACE \
diff --git a/taskcluster/scripts/builder/build-linux.sh b/taskcluster/scripts/builder/build-linux.sh
new file mode 100755
index 0000000000..bcc5b34606
--- /dev/null
+++ b/taskcluster/scripts/builder/build-linux.sh
@@ -0,0 +1,130 @@
+#! /bin/bash -vex
+
+set -x -e
+
+echo "running as" $(id)
+
+####
+# Taskcluster friendly wrapper for performing fx desktop builds via mozharness.
+####
+
+# Inputs, with defaults
+
+: MOZHARNESS_SCRIPT ${MOZHARNESS_SCRIPT}
+: MOZHARNESS_CONFIG ${MOZHARNESS_CONFIG}
+: MOZHARNESS_CONFIG_PATHS ${MOZHARNESS_CONFIG_PATHS}
+: MOZHARNESS_ACTIONS ${MOZHARNESS_ACTIONS}
+: MOZHARNESS_OPTIONS ${MOZHARNESS_OPTIONS}
+
+: TOOLTOOL_CACHE ${TOOLTOOL_CACHE:=/builds/worker/tooltool-cache}
+
+: MOZ_SCM_LEVEL ${MOZ_SCM_LEVEL:=1}
+
+: NEED_XVFB ${NEED_XVFB:=false}
+
+: MH_CUSTOM_BUILD_VARIANT_CFG ${MH_CUSTOM_BUILD_VARIANT_CFG}
+: MH_BRANCH ${MH_BRANCH:=mozilla-central}
+: MH_BUILD_POOL ${MH_BUILD_POOL:=staging}
+
+: WORKSPACE ${WORKSPACE:=/builds/worker/workspace}
+: MOZ_OBJDIR ${MOZ_OBJDIR:=$WORKSPACE/obj-build}
+
+set -v
+
+fail() {
+ echo # make sure error message is on a new line
+ echo "[build-linux.sh:error]" "${@}"
+ exit 1
+}
+
+export MOZ_CRASHREPORTER_NO_REPORT=1
+export TINDERBOX_OUTPUT=1
+
+# use "simple" package names so that they can be hard-coded in the task's
+# extras.locations
+export MOZ_SIMPLE_PACKAGE_NAME=target
+
+# Ensure that in tree libraries can be found
+export LIBRARY_PATH=$LIBRARY_PATH:$WORKSPACE/obj-build:$WORKSPACE/src/gcc/lib64
+
+# test required parameters are supplied
+if [[ -z ${MOZHARNESS_SCRIPT} ]]; then fail "MOZHARNESS_SCRIPT is not set"; fi
+if [[ -z "${MOZHARNESS_CONFIG}" && -z "${EXTRA_MOZHARNESS_CONFIG}" ]]; then fail "MOZHARNESS_CONFIG or EXTRA_MOZHARNESS_CONFIG is not set"; fi
+
+# run XVfb in the background, if necessary
+if $NEED_XVFB; then
+ . /builds/worker/scripts/xvfb.sh
+
+ cleanup() {
+ local rv=$?
+ cleanup_xvfb
+ exit $rv
+ }
+ trap cleanup EXIT INT
+
+ start_xvfb '1024x768x24' 2
+fi
+
+# set up mozharness configuration, via command line, env, etc.
+
+debug_flag=""
+if [ 0$DEBUG -ne 0 ]; then
+ debug_flag='--debug'
+fi
+
+custom_build_variant_cfg_flag=""
+if [ -n "${MH_CUSTOM_BUILD_VARIANT_CFG}" ]; then
+ custom_build_variant_cfg_flag="--custom-build-variant-cfg=${MH_CUSTOM_BUILD_VARIANT_CFG}"
+fi
+
+# $TOOLTOOL_CACHE bypasses mozharness completely and is read by tooltool_wrapper.sh to set the
+# cache. However, only some mozharness scripts use tooltool_wrapper.sh, so this may not be
+# entirely effective.
+export TOOLTOOL_CACHE
+
+export MOZ_OBJDIR
+
+config_path_cmds=""
+for path in ${MOZHARNESS_CONFIG_PATHS}; do
+ config_path_cmds="${config_path_cmds} --extra-config-path ${GECKO_PATH}/${path}"
+done
+
+# support multiple, space delimited, config files
+config_cmds=""
+for cfg in $MOZHARNESS_CONFIG; do
+ config_cmds="${config_cmds} --config ${cfg}"
+done
+
+# if MOZHARNESS_ACTIONS is given, only run those actions (completely overriding default_actions
+# in the mozharness configuration)
+if [ -n "$MOZHARNESS_ACTIONS" ]; then
+ actions=""
+ for action in $MOZHARNESS_ACTIONS; do
+ actions="$actions --$action"
+ done
+fi
+
+# if MOZHARNESS_OPTIONS is given, append them to mozharness command line run
+if [ -n "$MOZHARNESS_OPTIONS" ]; then
+ options=""
+ for option in $MOZHARNESS_OPTIONS; do
+ options="$options --$option"
+ done
+fi
+
+cd /builds/worker
+
+$GECKO_PATH/mach python \
+ --requirements $GECKO_PATH/taskcluster/scripts/builder/requirements.txt \
+ -- \
+ $GECKO_PATH/testing/${MOZHARNESS_SCRIPT} \
+ ${config_path_cmds} \
+ ${config_cmds} \
+ $debug_flag \
+ $custom_build_variant_cfg_flag \
+ $actions \
+ $options \
+ --log-level=debug \
+ --work-dir=$WORKSPACE \
+ --branch=${MH_BRANCH} \
+ --build-pool=${MH_BUILD_POOL}
diff --git a/taskcluster/scripts/builder/build-sm-mozjs-crate.sh b/taskcluster/scripts/builder/build-sm-mozjs-crate.sh
new file mode 100755
index 0000000000..1d16de037a
--- /dev/null
+++ b/taskcluster/scripts/builder/build-sm-mozjs-crate.sh
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+set -xe
+
+source $(dirname $0)/sm-tooltool-config.sh
+
+cd "$GECKO_PATH/js/src"
+
+cp $GECKO_PATH/.cargo/config.in $GECKO_PATH/.cargo/config
+
+export PATH="$PATH:$MOZ_FETCHES_DIR/cargo/bin:$MOZ_FETCHES_DIR/rustc/bin"
+export RUSTFMT="$MOZ_FETCHES_DIR/rustc/bin/rustfmt"
+export RUST_BACKTRACE=1
+export AUTOMATION=1
+
+cargo build --verbose --frozen --features debugmozjs
+cargo build --verbose --frozen
diff --git a/taskcluster/scripts/builder/build-sm-package.sh b/taskcluster/scripts/builder/build-sm-package.sh
new file mode 100755
index 0000000000..ec8147cb34
--- /dev/null
+++ b/taskcluster/scripts/builder/build-sm-package.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+set -xe
+
+source $(dirname $0)/sm-tooltool-config.sh
+
+mkdir -p $UPLOAD_DIR
+
+# Package up the sources into the release tarball.
+AUTOMATION=1 DIST=$UPLOAD_DIR $GECKO_PATH/js/src/make-source-package.sh
+
+# Extract the tarball into a new directory in the workspace.
+
+PACKAGE_DIR=$WORK/sm-package
+
+# Do not use -p option because the package directory should not exist.
+mkdir $PACKAGE_DIR
+pushd $PACKAGE_DIR
+
+tar -xvf $UPLOAD_DIR/mozjs-*.tar.*z*
+
+: ${PYTHON3:=python3}
+
+status=0
+(
+ # Build the freshly extracted, packaged SpiderMonkey.
+ cd ./mozjs-*/js/src
+
+ # MOZ_AUTOMATION enforces certain requirements that don't apply to
+ # packaged builds. Unset it.
+ unset MOZ_AUTOMATION
+
+ AUTOMATION=1 $PYTHON3 ./devtools/automation/autospider.py --skip-tests=checks $SPIDERMONKEY_VARIANT
+) || status=$?
+
+# Copy artifacts for upload by TaskCluster
+cp -rL ./mozjs-*/obj-spider/dist/bin/{js,jsapi-tests,js-gdb.py,libmozjs*} $UPLOAD_DIR
+
+exit $status
diff --git a/taskcluster/scripts/builder/build-sm-rust-bindings.sh b/taskcluster/scripts/builder/build-sm-rust-bindings.sh
new file mode 100755
index 0000000000..e749712e70
--- /dev/null
+++ b/taskcluster/scripts/builder/build-sm-rust-bindings.sh
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+set -xe
+
+source $(dirname $0)/sm-tooltool-config.sh
+
+cd "$GECKO_PATH/js/rust"
+
+cp $GECKO_PATH/.cargo/config.in $GECKO_PATH/.cargo/config
+
+export RUSTFMT="$MOZ_FETCHES_DIR/rustc/bin/rustfmt"
+export LD_LIBRARY_PATH="$MOZ_FETCHES_DIR/gcc/lib64"
+# Enable backtraces if we panic.
+export RUST_BACKTRACE=1
+
+cargo test --verbose --frozen --features debugmozjs
+cargo test --verbose --frozen
diff --git a/taskcluster/scripts/builder/build-sm.sh b/taskcluster/scripts/builder/build-sm.sh
new file mode 100755
index 0000000000..70cb163077
--- /dev/null
+++ b/taskcluster/scripts/builder/build-sm.sh
@@ -0,0 +1,57 @@
+#!/bin/bash
+
+set -x
+
+source $(dirname $0)/sm-tooltool-config.sh
+
+: ${PYTHON3:=python3}
+
+# Ensure upload dir exists
+mkdir -p $UPLOAD_DIR
+
+# Run the script
+export MOZ_UPLOAD_DIR="$(cd "$UPLOAD_DIR"; pwd)"
+export OBJDIR=$WORK/obj-spider
+AUTOMATION=1 $PYTHON3 $GECKO_PATH/js/src/devtools/automation/autospider.py ${SPIDERMONKEY_PLATFORM:+--platform=$SPIDERMONKEY_PLATFORM} $SPIDERMONKEY_VARIANT
+BUILD_STATUS=$?
+
+# Copy artifacts for upload by TaskCluster.
+upload=${MOZ_AUTOMATION_UPLOAD-1}
+# User-provided override switch.
+if [ -n "$MOZ_JS_UPLOAD_BINARIES" ]; then
+ upload=1
+fi
+if [ "$upload" = "1" ]; then
+ cp -rL $OBJDIR/dist/bin/{js,jsapi-tests,js-gdb.py} $UPLOAD_DIR
+
+ # Fuzzing users want the correct version of llvm-symbolizer available in the
+ # same directory as the built output.
+ for f in "$MOZ_FETCHES_DIR/clang/bin/llvm-symbolizer"*; do
+ gzip -c "$f" > "$UPLOAD_DIR/llvm-symbolizer.gz" || echo "gzip $f failed" >&2
+ break
+ done
+
+ # Fuzzing also uses a few fields in target.json file for automated downloads to
+ # identify what was built.
+ if [ -n "$MOZ_BUILD_DATE" ] && [ -n "$GECKO_HEAD_REV" ]; then
+ cat >$UPLOAD_DIR/target.json <<EOF
+{
+ "buildid": "$MOZ_BUILD_DATE",
+ "moz_source_stamp": "$GECKO_HEAD_REV"
+}
+EOF
+ fi
+else # !upload
+
+# Provide a note for users on why we don't include artifacts for these builds
+# by default, and how they can get the artifacts if they really need them.
+cat >$UPLOAD_DIR/README-artifacts.txt <<'EOF'
+Artifact upload has been disabled for this build due to infrequent usage of the
+generated artifacts. If you find yourself in a position where you need the
+shell or similar artifacts from this build, please redo your push with the
+environment variable MOZ_JS_UPLOAD_BINARIES set to 1. You can provide this as
+the option `--env MOZ_JS_UPLOAD_BINARIES=1` to `mach try fuzzy` or `mach try auto`.
+EOF
+fi
+
+exit $BUILD_STATUS
diff --git a/taskcluster/scripts/builder/repackage.sh b/taskcluster/scripts/builder/repackage.sh
new file mode 100755
index 0000000000..15ddbe8557
--- /dev/null
+++ b/taskcluster/scripts/builder/repackage.sh
@@ -0,0 +1,104 @@
+#! /bin/bash -vex
+
+set -x -e
+
+echo "running as" $(id)
+
+. /builds/worker/scripts/xvfb.sh
+
+####
+# Taskcluster friendly wrapper for performing fx desktop builds via mozharness.
+####
+
+# Inputs, with defaults
+
+: MOZHARNESS_SCRIPT ${MOZHARNESS_SCRIPT}
+: MOZHARNESS_CONFIG ${MOZHARNESS_CONFIG}
+: MOZHARNESS_CONFIG_PATHS ${MOZHARNESS_CONFIG_PATHS}
+: MOZHARNESS_ACTIONS ${MOZHARNESS_ACTIONS}
+: MOZHARNESS_OPTIONS ${MOZHARNESS_OPTIONS}
+
+: TOOLTOOL_CACHE ${TOOLTOOL_CACHE:=/builds/worker/tooltool-cache}
+
+: MOZ_SCM_LEVEL ${MOZ_SCM_LEVEL:=1}
+
+: WORKSPACE ${WORKSPACE:=/builds/worker/workspace}
+: MOZ_OBJDIR ${MOZ_OBJDIR:=$WORKSPACE/obj-build}
+
+set -v
+
+fail() {
+ echo # make sure error message is on a new line
+ echo "[build-linux.sh:error]" "${@}"
+ exit 1
+}
+
+export MOZ_CRASHREPORTER_NO_REPORT=1
+export TINDERBOX_OUTPUT=1
+
+# use "simple" package names so that they can be hard-coded in the task's
+# extras.locations
+export MOZ_SIMPLE_PACKAGE_NAME=target
+
+# test required parameters are supplied
+if [[ -z ${MOZHARNESS_SCRIPT} ]]; then fail "MOZHARNESS_SCRIPT is not set"; fi
+if [[ -z "${MOZHARNESS_CONFIG}" && -z "${EXTRA_MOZHARNESS_CONFIG}" ]]; then fail "MOZHARNESS_CONFIG or EXTRA_MOZHARNESS_CONFIG is not set"; fi
+
+cleanup() {
+ local rv=$?
+ cleanup_xvfb
+ exit $rv
+}
+trap cleanup EXIT INT
+
+# set up mozharness configuration, via command line, env, etc.
+
+debug_flag=""
+if [ 0$DEBUG -ne 0 ]; then
+ debug_flag='--debug'
+fi
+
+# $TOOLTOOL_CACHE bypasses mozharness completely and is read by tooltool_wrapper.sh to set the
+# cache. However, only some mozharness scripts use tooltool_wrapper.sh, so this may not be
+# entirely effective.
+export TOOLTOOL_CACHE
+
+export MOZ_OBJDIR
+
+config_path_cmds=""
+for path in ${MOZHARNESS_CONFIG_PATHS}; do
+ config_path_cmds="${config_path_cmds} --extra-config-path ${GECKO_PATH}/${path}"
+done
+
+# support multiple, space delimited, config files
+config_cmds=""
+for cfg in $MOZHARNESS_CONFIG; do
+ config_cmds="${config_cmds} --config ${cfg}"
+done
+
+# if MOZHARNESS_ACTIONS is given, only run those actions (completely overriding default_actions
+# in the mozharness configuration)
+if [ -n "$MOZHARNESS_ACTIONS" ]; then
+ actions=""
+ for action in $MOZHARNESS_ACTIONS; do
+ actions="$actions --$action"
+ done
+fi
+
+# if MOZHARNESS_OPTIONS is given, append them to mozharness command line run
+if [ -n "$MOZHARNESS_OPTIONS" ]; then
+ options=""
+ for option in $MOZHARNESS_OPTIONS; do
+ options="$options --$option"
+ done
+fi
+
+cd /builds/worker
+
+$GECKO_PATH/mach python $GECKO_PATH/testing/${MOZHARNESS_SCRIPT} \
+ ${config_path_cmds} \
+ ${config_cmds} \
+ $actions \
+ $options \
+ --log-level=debug \
+ --work-dir=$WORKSPACE \
diff --git a/taskcluster/scripts/builder/requirements.txt b/taskcluster/scripts/builder/requirements.txt
new file mode 100644
index 0000000000..24156d6d30
--- /dev/null
+++ b/taskcluster/scripts/builder/requirements.txt
@@ -0,0 +1 @@
+psutil==5.7.0
diff --git a/taskcluster/scripts/builder/sm-tooltool-config.sh b/taskcluster/scripts/builder/sm-tooltool-config.sh
new file mode 100755
index 0000000000..380fd2e131
--- /dev/null
+++ b/taskcluster/scripts/builder/sm-tooltool-config.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+
+set -x
+
+SPIDERMONKEY_VARIANT=${SPIDERMONKEY_VARIANT:-plain}
+UPLOAD_DIR=${UPLOAD_DIR:-$HOME/artifacts/}
+WORK=${WORK:-$HOME/workspace}
+
+export TOOLTOOL_CHECKOUT=${TOOLTOOL_CHECKOUT:-$WORK}
+
+( # Create scope for set -e
+set -e
+mkdir -p $WORK
+cd $WORK
+
+# Need to install things from tooltool. Figure out what platform to use.
+
+case $(uname -m) in
+ i686 | arm )
+ BITS=32
+ ;;
+ *)
+ BITS=64
+ ;;
+esac
+
+case "$OSTYPE" in
+ darwin*)
+ PLATFORM_OS=macosx
+ ;;
+ linux-gnu)
+ PLATFORM_OS=linux
+ ;;
+ msys)
+ PLATFORM_OS=win
+ ;;
+ *)
+ echo "Unrecognized OSTYPE '$OSTYPE'" >&2
+ PLATFORM_OS=linux
+ ;;
+esac
+
+# Install everything needed for the browser on this platform. Not all of it is
+# necessary for the JS shell, but it's less duplication to share tooltool
+# manifests.
+BROWSER_PLATFORM=$PLATFORM_OS$BITS
+
+(cd $TOOLTOOL_CHECKOUT && ${GECKO_PATH}/mach artifact toolchain${TOOLTOOL_MANIFEST:+ -v --tooltool-manifest $GECKO_PATH/$TOOLTOOL_MANIFEST}${TOOLTOOL_CACHE:+ --cache-dir $TOOLTOOL_CACHE})
+
+) || exit 1 # end of set -e scope
+
+# Add all the fetches and tooltool binaries to our $PATH.
+for bin in $MOZ_FETCHES_DIR/*/bin $TOOLTOOL_CHECKOUT/VC/bin/Hostx64/x86; do
+ if [ ! -d "$bin" ]; then
+ continue
+ fi
+ absbin=$(cd "$bin" && pwd)
+ export PATH="$absbin:$PATH"
+done
+
+if [ -e $MOZ_FETCHES_DIR/rustc ]; then
+ export RUSTC="$MOZ_FETCHES_DIR/rustc/bin/rustc"
+ export CARGO="$MOZ_FETCHES_DIR/rustc/bin/cargo"
+fi
+if [ -e $MOZ_FETCHES_DIR/cbindgen ]; then
+ export CBINDGEN="$MOZ_FETCHES_DIR/cbindgen/cbindgen"
+fi
diff --git a/taskcluster/scripts/copy.sh b/taskcluster/scripts/copy.sh
new file mode 100755
index 0000000000..931145a3b6
--- /dev/null
+++ b/taskcluster/scripts/copy.sh
@@ -0,0 +1,9 @@
+#! /bin/bash -ex
+
+# This script copies the contents of the "scripts" folder into a docker
+# container using tar/untar the container id must be passed.
+
+DIRNAME=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+docker exec $1 mkdir -p $2
+cd $DIRNAME
+tar -cv * | docker exec -i $1 tar -x -C $2
diff --git a/taskcluster/scripts/iris/run-iris-linux.sh b/taskcluster/scripts/iris/run-iris-linux.sh
new file mode 100755
index 0000000000..7b9a30286f
--- /dev/null
+++ b/taskcluster/scripts/iris/run-iris-linux.sh
@@ -0,0 +1,59 @@
+#!/bin/bash
+# Debian10 linux bootstrap
+set -x +e -v
+
+# Set Iris code root, required by moziris
+export IRIS_CODE_ROOT=$MOZ_FETCHES_DIR/iris_firefox
+
+# Set up a virtual display since we don't have an xdisplay
+. $HOME/scripts/xvfb.sh
+start_xvfb '1920x1080x24+32' 0
+
+# Re-set `+e` after start_xvfb changes it
+set +e
+
+# configure fluxbox
+mkdir /builds/worker/.fluxbox/
+echo "exec startfluxbox" >> .xinitrc
+
+# required for X server to start correctly
+touch ~/.Xauthority
+
+# start fluxbox
+fluxbox &
+killall fluxbox
+echo "Control Mod4 Up :MaximizeWindow" >> /builds/worker/.fluxbox/keys
+fluxbox reconfigure &
+
+# Install iris's pipenv
+cd $MOZ_FETCHES_DIR/iris_firefox
+PIPENV_MAX_RETRIES="5" pipenv install
+pip_status=$?
+
+# If pipenv installation fails for any reason, make another attempt.
+if [ $pip_status -eq 0 ]
+then
+ echo "Pipenv installed correctly, proceeding to Iris test run:"
+else
+ echo "Pipenv failed to install, attempting again:"
+ pipenv lock --clear # This purges any partially/incorrectly generated lock files
+ pipenv install
+fi
+
+# Handle the nightly smoketest suite differently
+[ "$CURRENT_TEST_DIR" != "nightly" ] && irisstring="firefox -t $CURRENT_TEST_DIR" || irisstring="$CURRENT_TEST_DIR"
+echo "$irisstring"
+
+# Actually run the iris tests
+pipenv run iris $irisstring -w ../../iris_runs -n --treeherder -f ../../fetches/firefox/firefox -y
+status=$?
+
+# Zip up the test run output
+cd ../..
+zip -r runs.zip iris_runs/runs
+
+# prevent timeout of the task
+killall fluxbox
+
+# Exit with iris's exit code so treeherder knows if tests failed
+exit $status
diff --git a/taskcluster/scripts/iris/run-iris-macos.sh b/taskcluster/scripts/iris/run-iris-macos.sh
new file mode 100755
index 0000000000..6d9d961614
--- /dev/null
+++ b/taskcluster/scripts/iris/run-iris-macos.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+set -x +e -v
+
+cd $MOZ_FETCHES_DIR/iris_firefox
+
+# FIXME: Install the following without homebrew:
+# tesseract
+# p7zip
+# xquartz
+# pipenv
+# pyobjc
+# pyobjc-core
+
+# FIXME: Find a way to set these values:
+# https://github.com/mozilla/iris_firefox/blob/master/bootstrap/osx_bootstrap.sh#L87-L91
+
+# FIXME: Maybe find a way to create these download files:
+# https://github.com/mozilla/iris_firefox/blob/master/bootstrap/osx_bootstrap.sh#L93-L104
+
+# FIXME: Ensure all of the necessary python packages are available in the pypi mirror
+
+# Mount the downloaded Firefox and install iris's pipenv
+hdiutil attach ../target.dmg
+python3 -m ensurepip --upgrade
+pipenv install
+
+# Handle the nightly smoketest suite differently
+[ "$CURRENT_TEST_DIR" != "nightly" ] && irisstring="firefox -t $CURRENT_TEST_DIR" || irisstring="$CURRENT_TEST_DIR"
+echo "$irisstring"
+
+# Run this chunk of iris tests
+pipenv run iris $irisstring -w ../../iris_runs -f /Volumes/Firefox\ Nightly/Firefox\ Nightly.app/Contents/MacOS/firefox-bin -n --treeherder -y
+runstatus=$?
+
+# FIXME: Return to the starting dir (../..) and zip up the iris_runs/runs dir
+
+# Exit with the iris test run's exit code
+exit $runstatus
diff --git a/taskcluster/scripts/iris/run-iris-windows.sh b/taskcluster/scripts/iris/run-iris-windows.sh
new file mode 100755
index 0000000000..7cdde98e4a
--- /dev/null
+++ b/taskcluster/scripts/iris/run-iris-windows.sh
@@ -0,0 +1,71 @@
+#!/bin/bash
+set -x +e -v
+
+# Set Iris code root, required by moziris
+export IRIS_CODE_ROOT=$MOZ_FETCHES_DIR/iris_firefox
+
+# Store our starting dir so we can get back to it later
+dir=$(pwd)
+
+# Install scoop
+powershell -Command "Set-ExecutionPolicy RemoteSigned -scope CurrentUser"
+powershell -Command "iex (new-object net.webclient).downloadstring('https://get.scoop.sh')"
+scoopstatus=$?
+
+# Install some packages
+scoop install git # Needed to update scoop and pick up newer packages
+scoop install python@3.7.3 # Worker only has 3.6.5 out of the box, we need 3.7.3+
+
+# Enable some extra packages to be installed
+scoop bucket add versions
+scoop bucket add extras
+
+# Update scoop and scoop manifests
+scoop update
+
+# `scoop update` seems to intermittently fail, add a retry attempt
+if [ $scoopstatus -eq 0 ]
+then
+ echo "Scoop updated successfully"
+else
+ echo "scoop update failed, retrying"
+ scoop update
+fi
+
+# Install the rest of the needed packages
+scoop install which
+
+# Install tesseract-ocr
+cd $MOZ_FETCHES_DIR/iris_firefox
+scoop install bootstrap\\tesseract.json
+
+# Set up the pipenv
+python3 -m pip install --upgrade pip
+python3 -m pip install --upgrade pipenv
+python3 -m pipenv install
+pipstatus=$?
+
+# If any part of the pipenv's install failed, try it again
+if [ $pipstatus -eq 0 ]
+then
+ echo "Pipenv installed correctly, proceeding to Iris test run:"
+else
+ echo "Pipenv failed to install, attempting again:"
+ python3 -m pipenv lock --clear
+ python3 -m pipenv install
+fi
+
+# Handle the nightly smoketest suite differently
+[ "$CURRENT_TEST_DIR" != "nightly" ] && irisstring="firefox -t $CURRENT_TEST_DIR" || irisstring="$CURRENT_TEST_DIR"
+echo "$irisstring"
+
+# Run the iris test suite
+python3 -m pipenv run iris $irisstring -w ../../iris_runs -n --treeherder -f ../../fetches/firefox/firefox.exe -y
+runstatus=$?
+
+# Return to our starting dir and zip up the output of the test run
+cd ../..
+zip -r runs.zip iris_runs/runs
+
+# Exit with the status from the iris run
+exit $runstatus
diff --git a/taskcluster/scripts/misc/android-gradle-dependencies.sh b/taskcluster/scripts/misc/android-gradle-dependencies.sh
new file mode 100755
index 0000000000..f9fbe9387c
--- /dev/null
+++ b/taskcluster/scripts/misc/android-gradle-dependencies.sh
@@ -0,0 +1,17 @@
+#!/bin/bash -vex
+
+set -x -e
+
+echo "running as" $(id)
+
+set -v
+
+cd $GECKO_PATH
+
+. taskcluster/scripts/misc/android-gradle-dependencies/before.sh
+
+export MOZCONFIG=mobile/android/config/mozconfigs/android-api-16-gradle-dependencies/nightly
+./mach build
+./mach android gradle-dependencies
+
+. taskcluster/scripts/misc/android-gradle-dependencies/after.sh
diff --git a/taskcluster/scripts/misc/android-gradle-dependencies/after.sh b/taskcluster/scripts/misc/android-gradle-dependencies/after.sh
new file mode 100755
index 0000000000..65f122ebe3
--- /dev/null
+++ b/taskcluster/scripts/misc/android-gradle-dependencies/after.sh
@@ -0,0 +1,31 @@
+#!/bin/bash -vex
+
+set -x -e
+
+echo "running as" $(id)
+
+: WORKSPACE ${WORKSPACE:=/builds/worker/workspace}
+
+set -v
+
+# Package everything up.
+pushd $WORKSPACE
+mkdir -p android-gradle-dependencies /builds/worker/artifacts
+
+# NEXUS_WORK is exported by `before.sh`.
+cp -R ${NEXUS_WORK}/storage/jcenter android-gradle-dependencies
+cp -R ${NEXUS_WORK}/storage/google android-gradle-dependencies
+cp -R ${NEXUS_WORK}/storage/gradle-plugins android-gradle-dependencies
+
+# The Gradle wrapper will have downloaded and verified the hash of exactly one
+# Gradle distribution. It will be located in $GRADLE_USER_HOME, like
+# ~/.gradle/wrapper/dists/gradle-2.7-all/$PROJECT_HASH/gradle-2.7-all.zip. We
+# want to remove the version from the internal directory for use via tooltool in
+# a mozconfig.
+cp ${GRADLE_USER_HOME}/wrapper/dists/gradle-*-*/*/gradle-*-*.zip gradle.zip
+unzip -q gradle.zip
+mv gradle-* android-gradle-dependencies/gradle-dist
+
+tar cv android-gradle-dependencies | $GECKO_PATH/taskcluster/scripts/misc/zstdpy > /builds/worker/artifacts/android-gradle-dependencies.tar.zst
+
+popd
diff --git a/taskcluster/scripts/misc/android-gradle-dependencies/before.sh b/taskcluster/scripts/misc/android-gradle-dependencies/before.sh
new file mode 100755
index 0000000000..7150731d73
--- /dev/null
+++ b/taskcluster/scripts/misc/android-gradle-dependencies/before.sh
@@ -0,0 +1,30 @@
+#!/bin/bash -vex
+
+set -x -e
+
+echo "running as" $(id)
+
+: WORKSPACE ${WORKSPACE:=/builds/worker/workspace}
+
+set -v
+
+# Export NEXUS_WORK so that `after.sh` can use it.
+export NEXUS_WORK=/builds/worker/workspace/sonatype-nexus-work
+mkdir -p ${NEXUS_WORK}/conf
+cp /builds/worker/workspace/build/src/taskcluster/scripts/misc/android-gradle-dependencies/nexus.xml ${NEXUS_WORK}/conf/nexus.xml
+
+RUN_AS_USER=worker $MOZ_FETCHES_DIR/sonatype-nexus/bin/nexus restart
+
+# Wait "a while" for Nexus to actually start. Don't fail if this fails.
+wget --quiet --retry-connrefused --waitretry=2 --tries=100 \
+ http://localhost:8081/nexus/service/local/status || true
+rm -rf status
+
+# It's helpful when debugging to see the "latest state".
+curl http://localhost:8081/nexus/service/local/status || true
+
+# Verify Nexus has actually started. Fail if this fails.
+curl --fail --silent --location http://localhost:8081/nexus/service/local/status | grep '<state>STARTED</state>'
+
+# It's helpful when debugging to see the repository configurations.
+curl http://localhost:8081/nexus/service/local/repositories || true
diff --git a/taskcluster/scripts/misc/android-gradle-dependencies/nexus.xml b/taskcluster/scripts/misc/android-gradle-dependencies/nexus.xml
new file mode 100644
index 0000000000..2b40bedf37
--- /dev/null
+++ b/taskcluster/scripts/misc/android-gradle-dependencies/nexus.xml
@@ -0,0 +1,413 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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/. -->
+
+<nexusConfiguration>
+ <version>2.8.0</version>
+ <nexusVersion>2.12.0-01</nexusVersion>
+ <globalConnectionSettings>
+ <connectionTimeout>20000</connectionTimeout>
+ <retrievalRetryCount>3</retrievalRetryCount>
+ <queryString></queryString>
+ </globalConnectionSettings>
+ <restApi>
+ <uiTimeout>60000</uiTimeout>
+ </restApi>
+ <httpProxy>
+ <enabled>true</enabled>
+ <port>8082</port>
+ <proxyPolicy>strict</proxyPolicy>
+ </httpProxy>
+ <routing>
+ <resolveLinks>true</resolveLinks>
+ </routing>
+ <repositories>
+ <repository>
+ <id>jcenter</id>
+ <name>jcenter</name>
+ <providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole>
+ <providerHint>maven2</providerHint>
+ <localStatus>IN_SERVICE</localStatus>
+ <notFoundCacheActive>true</notFoundCacheActive>
+ <notFoundCacheTTL>1440</notFoundCacheTTL>
+ <userManaged>true</userManaged>
+ <exposed>true</exposed>
+ <browseable>true</browseable>
+ <writePolicy>READ_ONLY</writePolicy>
+ <indexable>true</indexable>
+ <searchable>true</searchable>
+ <localStorage>
+ <provider>file</provider>
+ </localStorage>
+ <remoteStorage>
+ <url>https://jcenter.bintray.com/</url>
+ </remoteStorage>
+ <externalConfiguration>
+ <repositoryPolicy>RELEASE</repositoryPolicy>
+ <checksumPolicy>STRICT</checksumPolicy>
+ <fileTypeValidation>true</fileTypeValidation>
+ <downloadRemoteIndex>false</downloadRemoteIndex>
+ <artifactMaxAge>-1</artifactMaxAge>
+ <metadataMaxAge>1440</metadataMaxAge>
+ <itemMaxAge>1440</itemMaxAge>
+ <autoBlockActive>true</autoBlockActive>
+ </externalConfiguration>
+ </repository>
+ <repository>
+ <id>gradle-plugins</id>
+ <name>Gradle Plugins</name>
+ <providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole>
+ <providerHint>maven2</providerHint>
+ <localStatus>IN_SERVICE</localStatus>
+ <notFoundCacheActive>true</notFoundCacheActive>
+ <notFoundCacheTTL>1440</notFoundCacheTTL>
+ <userManaged>true</userManaged>
+ <exposed>true</exposed>
+ <browseable>true</browseable>
+ <writePolicy>READ_ONLY</writePolicy>
+ <indexable>true</indexable>
+ <searchable>true</searchable>
+ <localStorage>
+ <provider>file</provider>
+ </localStorage>
+ <remoteStorage>
+ <url>https://plugins.gradle.org/m2/</url>
+ </remoteStorage>
+ <externalConfiguration>
+ <repositoryPolicy>RELEASE</repositoryPolicy>
+ <checksumPolicy>STRICT</checksumPolicy>
+ <fileTypeValidation>true</fileTypeValidation>
+ <downloadRemoteIndex>false</downloadRemoteIndex>
+ <artifactMaxAge>-1</artifactMaxAge>
+ <metadataMaxAge>1440</metadataMaxAge>
+ <itemMaxAge>1440</itemMaxAge>
+ <autoBlockActive>true</autoBlockActive>
+ </externalConfiguration>
+ </repository>
+ <repository>
+ <id>google</id>
+ <name>google</name>
+ <providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole>
+ <providerHint>maven2</providerHint>
+ <localStatus>IN_SERVICE</localStatus>
+ <notFoundCacheActive>true</notFoundCacheActive>
+ <notFoundCacheTTL>1440</notFoundCacheTTL>
+ <userManaged>true</userManaged>
+ <exposed>true</exposed>
+ <browseable>true</browseable>
+ <writePolicy>READ_ONLY</writePolicy>
+ <indexable>true</indexable>
+ <searchable>true</searchable>
+ <localStorage>
+ <provider>file</provider>
+ </localStorage>
+ <remoteStorage>
+ <url>https://maven.google.com/</url>
+ </remoteStorage>
+ <externalConfiguration>
+ <repositoryPolicy>RELEASE</repositoryPolicy>
+ <!-- Google doesn't publish checksums. Why, Google, why? -->
+ <checksumPolicy>STRICT_IF_EXISTS</checksumPolicy>
+ <fileTypeValidation>true</fileTypeValidation>
+ <downloadRemoteIndex>false</downloadRemoteIndex>
+ <artifactMaxAge>-1</artifactMaxAge>
+ <metadataMaxAge>1440</metadataMaxAge>
+ <itemMaxAge>1440</itemMaxAge>
+ <autoBlockActive>true</autoBlockActive>
+ </externalConfiguration>
+ </repository>
+ <repository>
+ <id>central</id>
+ <name>Central</name>
+ <providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole>
+ <providerHint>maven2</providerHint>
+ <localStatus>IN_SERVICE</localStatus>
+ <notFoundCacheActive>true</notFoundCacheActive>
+ <notFoundCacheTTL>1440</notFoundCacheTTL>
+ <userManaged>true</userManaged>
+ <exposed>true</exposed>
+ <browseable>true</browseable>
+ <writePolicy>READ_ONLY</writePolicy>
+ <indexable>true</indexable>
+ <searchable>true</searchable>
+ <localStorage>
+ <provider>file</provider>
+ </localStorage>
+ <remoteStorage>
+ <url>https://repo1.maven.org/maven2/</url>
+ </remoteStorage>
+ <externalConfiguration>
+ <proxyMode>ALLOW</proxyMode>
+ <artifactMaxAge>-1</artifactMaxAge>
+ <itemMaxAge>1440</itemMaxAge>
+ <cleanseRepositoryMetadata>false</cleanseRepositoryMetadata>
+ <downloadRemoteIndex>false</downloadRemoteIndex>
+ <checksumPolicy>WARN</checksumPolicy>
+ <repositoryPolicy>RELEASE</repositoryPolicy>
+ </externalConfiguration>
+ </repository>
+ <repository>
+ <id>apache-snapshots</id>
+ <name>Apache Snapshots</name>
+ <providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole>
+ <providerHint>maven2</providerHint>
+ <localStatus>IN_SERVICE</localStatus>
+ <notFoundCacheActive>true</notFoundCacheActive>
+ <notFoundCacheTTL>1440</notFoundCacheTTL>
+ <userManaged>true</userManaged>
+ <exposed>true</exposed>
+ <browseable>true</browseable>
+ <writePolicy>READ_ONLY</writePolicy>
+ <indexable>true</indexable>
+ <searchable>true</searchable>
+ <localStorage>
+ <provider>file</provider>
+ </localStorage>
+ <remoteStorage>
+ <url>https://repository.apache.org/snapshots/</url>
+ </remoteStorage>
+ <externalConfiguration>
+ <proxyMode>ALLOW</proxyMode>
+ <artifactMaxAge>1440</artifactMaxAge>
+ <itemMaxAge>1440</itemMaxAge>
+ <cleanseRepositoryMetadata>false</cleanseRepositoryMetadata>
+ <downloadRemoteIndex>false</downloadRemoteIndex>
+ <checksumPolicy>WARN</checksumPolicy>
+ <repositoryPolicy>SNAPSHOT</repositoryPolicy>
+ </externalConfiguration>
+ </repository>
+ <repository>
+ <id>releases</id>
+ <name>Releases</name>
+ <providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole>
+ <providerHint>maven2</providerHint>
+ <localStatus>IN_SERVICE</localStatus>
+ <notFoundCacheTTL>1440</notFoundCacheTTL>
+ <userManaged>true</userManaged>
+ <exposed>true</exposed>
+ <browseable>true</browseable>
+ <writePolicy>ALLOW_WRITE_ONCE</writePolicy>
+ <indexable>true</indexable>
+ <searchable>true</searchable>
+ <localStorage>
+ <provider>file</provider>
+ </localStorage>
+ <externalConfiguration>
+ <proxyMode>ALLOW</proxyMode>
+ <artifactMaxAge>-1</artifactMaxAge>
+ <itemMaxAge>1440</itemMaxAge>
+ <cleanseRepositoryMetadata>false</cleanseRepositoryMetadata>
+ <downloadRemoteIndex>false</downloadRemoteIndex>
+ <checksumPolicy>WARN</checksumPolicy>
+ <repositoryPolicy>RELEASE</repositoryPolicy>
+ </externalConfiguration>
+ </repository>
+ <repository>
+ <id>snapshots</id>
+ <name>Snapshots</name>
+ <providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole>
+ <providerHint>maven2</providerHint>
+ <localStatus>IN_SERVICE</localStatus>
+ <notFoundCacheTTL>1440</notFoundCacheTTL>
+ <userManaged>true</userManaged>
+ <exposed>true</exposed>
+ <browseable>true</browseable>
+ <writePolicy>ALLOW_WRITE</writePolicy>
+ <indexable>true</indexable>
+ <searchable>true</searchable>
+ <localStorage>
+ <provider>file</provider>
+ </localStorage>
+ <externalConfiguration>
+ <proxyMode>ALLOW</proxyMode>
+ <artifactMaxAge>1440</artifactMaxAge>
+ <itemMaxAge>1440</itemMaxAge>
+ <cleanseRepositoryMetadata>false</cleanseRepositoryMetadata>
+ <downloadRemoteIndex>false</downloadRemoteIndex>
+ <checksumPolicy>WARN</checksumPolicy>
+ <repositoryPolicy>SNAPSHOT</repositoryPolicy>
+ </externalConfiguration>
+ </repository>
+ <repository>
+ <id>thirdparty</id>
+ <name>3rd party</name>
+ <providerRole>org.sonatype.nexus.proxy.repository.Repository</providerRole>
+ <providerHint>maven2</providerHint>
+ <localStatus>IN_SERVICE</localStatus>
+ <notFoundCacheTTL>1440</notFoundCacheTTL>
+ <userManaged>true</userManaged>
+ <exposed>true</exposed>
+ <browseable>true</browseable>
+ <writePolicy>ALLOW_WRITE_ONCE</writePolicy>
+ <indexable>true</indexable>
+ <searchable>true</searchable>
+ <localStorage>
+ <provider>file</provider>
+ </localStorage>
+ <externalConfiguration>
+ <proxyMode>ALLOW</proxyMode>
+ <artifactMaxAge>-1</artifactMaxAge>
+ <itemMaxAge>1440</itemMaxAge>
+ <cleanseRepositoryMetadata>false</cleanseRepositoryMetadata>
+ <downloadRemoteIndex>false</downloadRemoteIndex>
+ <checksumPolicy>WARN</checksumPolicy>
+ <repositoryPolicy>RELEASE</repositoryPolicy>
+ </externalConfiguration>
+ </repository>
+ <repository>
+ <id>central-m1</id>
+ <name>Central M1 shadow</name>
+ <providerRole>org.sonatype.nexus.proxy.repository.ShadowRepository</providerRole>
+ <providerHint>m2-m1-shadow</providerHint>
+ <localStatus>IN_SERVICE</localStatus>
+ <notFoundCacheTTL>15</notFoundCacheTTL>
+ <userManaged>true</userManaged>
+ <exposed>true</exposed>
+ <browseable>true</browseable>
+ <writePolicy>READ_ONLY</writePolicy>
+ <localStorage>
+ <provider>file</provider>
+ </localStorage>
+ <externalConfiguration>
+ <masterRepositoryId>central</masterRepositoryId>
+ <syncAtStartup>false</syncAtStartup>
+ </externalConfiguration>
+ </repository>
+ <repository>
+ <id>public</id>
+ <name>Public Repositories</name>
+ <providerRole>org.sonatype.nexus.proxy.repository.GroupRepository</providerRole>
+ <providerHint>maven2</providerHint>
+ <localStatus>IN_SERVICE</localStatus>
+ <notFoundCacheTTL>15</notFoundCacheTTL>
+ <userManaged>true</userManaged>
+ <exposed>true</exposed>
+ <browseable>true</browseable>
+ <writePolicy>READ_ONLY</writePolicy>
+ <indexable>true</indexable>
+ <localStorage>
+ <provider>file</provider>
+ </localStorage>
+ <externalConfiguration>
+ <mergeMetadata>true</mergeMetadata>
+ <memberRepositories>
+ <memberRepository>releases</memberRepository>
+ <memberRepository>snapshots</memberRepository>
+ <memberRepository>thirdparty</memberRepository>
+ <memberRepository>central</memberRepository>
+ </memberRepositories>
+ </externalConfiguration>
+ </repository>
+ </repositories>
+ <repositoryGrouping>
+ <pathMappings>
+ <pathMapping>
+ <id>inhouse-stuff</id>
+ <groupId>*</groupId>
+ <routeType>inclusive</routeType>
+ <routePatterns>
+ <routePattern>^/(com|org)/somecompany/.*</routePattern>
+ </routePatterns>
+ <repositories>
+ <repository>snapshots</repository>
+ <repository>releases</repository>
+ </repositories>
+ </pathMapping>
+ <pathMapping>
+ <id>apache-stuff</id>
+ <groupId>*</groupId>
+ <routeType>exclusive</routeType>
+ <routePatterns>
+ <routePattern>^/org/some-oss/.*</routePattern>
+ </routePatterns>
+ <repositories>
+ <repository>releases</repository>
+ <repository>snapshots</repository>
+ </repositories>
+ </pathMapping>
+ </pathMappings>
+ </repositoryGrouping>
+ <repositoryTargets>
+ <repositoryTarget>
+ <id>1</id>
+ <name>All (Maven2)</name>
+ <contentClass>maven2</contentClass>
+ <patterns>
+ <pattern>.*</pattern>
+ </patterns>
+ </repositoryTarget>
+ <repositoryTarget>
+ <id>2</id>
+ <name>All (Maven1)</name>
+ <contentClass>maven1</contentClass>
+ <patterns>
+ <pattern>.*</pattern>
+ </patterns>
+ </repositoryTarget>
+ <repositoryTarget>
+ <id>3</id>
+ <name>All but sources (Maven2)</name>
+ <contentClass>maven2</contentClass>
+ <patterns>
+ <pattern>(?!.*-sources.*).*</pattern>
+ </patterns>
+ </repositoryTarget>
+ <repositoryTarget>
+ <id>4</id>
+ <name>All Metadata (Maven2)</name>
+ <contentClass>maven2</contentClass>
+ <patterns>
+ <pattern>.*maven-metadata\.xml.*</pattern>
+ </patterns>
+ </repositoryTarget>
+ <repositoryTarget>
+ <id>any</id>
+ <name>All (Any Repository)</name>
+ <contentClass>any</contentClass>
+ <patterns>
+ <pattern>.*</pattern>
+ </patterns>
+ </repositoryTarget>
+ <repositoryTarget>
+ <id>site</id>
+ <name>All (site)</name>
+ <contentClass>site</contentClass>
+ <patterns>
+ <pattern>.*</pattern>
+ </patterns>
+ </repositoryTarget>
+ <repositoryTarget>
+ <id>npm</id>
+ <name>All (npm)</name>
+ <contentClass>npm</contentClass>
+ <patterns>
+ <pattern>.*</pattern>
+ </patterns>
+ </repositoryTarget>
+ <repositoryTarget>
+ <id>nuget</id>
+ <name>All (nuget)</name>
+ <contentClass>nuget</contentClass>
+ <patterns>
+ <pattern>.*</pattern>
+ </patterns>
+ </repositoryTarget>
+ <repositoryTarget>
+ <id>rubygems</id>
+ <name>All (rubygems)</name>
+ <contentClass>rubygems</contentClass>
+ <patterns>
+ <pattern>.*</pattern>
+ </patterns>
+ </repositoryTarget>
+ </repositoryTargets>
+ <smtpConfiguration>
+ <hostname>smtp-host</hostname>
+ <port>25</port>
+ <username>smtp-username</username>
+ <password>{jyU2gDFaNz8HQ4ybBAIdtJ6KL+YB08GXQs7vLPnia3o=}</password>
+ <systemEmailAddress>system@nexus.org</systemEmailAddress>
+ </smtpConfiguration>
+ <notification />
+</nexusConfiguration>
diff --git a/taskcluster/scripts/misc/browsertime.sh b/taskcluster/scripts/misc/browsertime.sh
new file mode 100755
index 0000000000..2bb1738edc
--- /dev/null
+++ b/taskcluster/scripts/misc/browsertime.sh
@@ -0,0 +1,19 @@
+#!/bin/bash -vex
+
+set -x -e
+
+echo "running as" $(id)
+
+set -v
+
+cd $GECKO_PATH
+
+export PATH=$PATH:$MOZ_FETCHES_DIR/node/bin
+
+./mach browsertime --setup
+
+# We have tools/browsertime/{package.json,node_modules,...} and want
+# browsertime/{package.json,node_modules}.
+mkdir -p /builds/worker/artifacts
+cd tools
+tar cjf /builds/worker/artifacts/browsertime.tar.bz2 browsertime
diff --git a/taskcluster/scripts/misc/build-binutils-linux.sh b/taskcluster/scripts/misc/build-binutils-linux.sh
new file mode 100755
index 0000000000..30a733d019
--- /dev/null
+++ b/taskcluster/scripts/misc/build-binutils-linux.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for building binutils for Linux.
+
+cd $GECKO_PATH
+
+build/unix/build-binutils/build-binutils.sh $MOZ_FETCHES_DIR
+
+# Put a tarball in the artifacts dir
+mkdir -p $UPLOAD_DIR
+cp $MOZ_FETCHES_DIR/binutils.tar.* $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/build-cbindgen.sh b/taskcluster/scripts/misc/build-cbindgen.sh
new file mode 100755
index 0000000000..33127d90fb
--- /dev/null
+++ b/taskcluster/scripts/misc/build-cbindgen.sh
@@ -0,0 +1,46 @@
+#!/bin/bash
+set -x -e -v
+
+# Needed by osx-cross-linker.
+export TARGET="$1"
+
+case "$(uname -s)" in
+Linux)
+ COMPRESS_EXT=xz
+ ;;
+MINGW*)
+ UPLOAD_DIR=$PWD/public/build
+ COMPRESS_EXT=bz2
+
+ . $GECKO_PATH/taskcluster/scripts/misc/vs-setup.sh
+
+ export CC=clang-cl
+ ;;
+esac
+
+cd $GECKO_PATH
+
+if [ -n "$TOOLTOOL_MANIFEST" ]; then
+ . taskcluster/scripts/misc/tooltool-download.sh
+fi
+
+# OSX cross builds are a bit harder
+if [ "$TARGET" == "x86_64-apple-darwin" ]; then
+ export PATH="$MOZ_FETCHES_DIR/llvm-dsymutil/bin:$PATH"
+ export PATH="$MOZ_FETCHES_DIR/cctools/bin:$PATH"
+ export RUSTFLAGS="-C linker=$GECKO_PATH/taskcluster/scripts/misc/osx-cross-linker"
+fi
+
+export PATH="$(cd $MOZ_FETCHES_DIR && pwd)/rustc/bin:$PATH"
+
+cd $MOZ_FETCHES_DIR/cbindgen
+
+cargo build --verbose --release --target "$TARGET"
+
+mkdir cbindgen
+cp target/$TARGET/release/cbindgen* cbindgen/
+tar -acf cbindgen.tar.$COMPRESS_EXT cbindgen
+mkdir -p $UPLOAD_DIR
+cp cbindgen.tar.$COMPRESS_EXT $UPLOAD_DIR
+
+. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh
diff --git a/taskcluster/scripts/misc/build-cctools-port.sh b/taskcluster/scripts/misc/build-cctools-port.sh
new file mode 100755
index 0000000000..7ae789c1ca
--- /dev/null
+++ b/taskcluster/scripts/misc/build-cctools-port.sh
@@ -0,0 +1,91 @@
+#!/bin/bash
+
+# cctools sometimes needs to be rebuilt when clang is modified.
+# Until bug 1471905 is addressed, increase the following number
+# when a forced rebuild of cctools is necessary: 1
+
+set -x -e -v
+
+# This script is for building cctools (Apple's binutils) for Linux using
+# cctools-port (https://github.com/tpoechtrager/cctools-port).
+WORKSPACE=$HOME/workspace
+
+# Set some crosstools-port and libtapi directories
+CROSSTOOLS_SOURCE_DIR=$MOZ_FETCHES_DIR/cctools-port
+CROSSTOOLS_CCTOOLS_DIR=$CROSSTOOLS_SOURCE_DIR/cctools
+CROSSTOOLS_BUILD_DIR=$WORKSPACE/cctools
+LIBTAPI_SOURCE_DIR=$MOZ_FETCHES_DIR/apple-libtapi
+LIBTAPI_BUILD_DIR=$WORKSPACE/libtapi-build
+CLANG_DIR=$MOZ_FETCHES_DIR/clang
+
+# Create our directories
+mkdir -p $CROSSTOOLS_BUILD_DIR $LIBTAPI_BUILD_DIR
+
+cd $GECKO_PATH
+
+export PATH="$MOZ_FETCHES_DIR/binutils/bin:$PATH"
+
+# Common setup for libtapi and cctools
+export CC=$CLANG_DIR/bin/clang
+export CXX=$CLANG_DIR/bin/clang++
+# We also need this LD_LIBRARY_PATH at build time, since tapi builds bits of
+# clang build tools, and then executes those tools.
+export LD_LIBRARY_PATH=$CLANG_DIR/lib
+
+# Build libtapi; the included build.sh is not sufficient for our purposes.
+cd $LIBTAPI_BUILD_DIR
+
+# Values taken from build.sh
+TAPI_REPOSITORY=tapi-1000.10.8
+TAPI_VERSION=10.0.0
+
+INCLUDE_FIX="-I $LIBTAPI_SOURCE_DIR/src/llvm/projects/clang/include -I $PWD/projects/clang/include"
+
+cmake $LIBTAPI_SOURCE_DIR/src/llvm \
+ -GNinja \
+ -DCMAKE_CXX_FLAGS="$INCLUDE_FIX" \
+ -DLLVM_INCLUDE_TESTS=OFF \
+ -DCMAKE_BUILD_TYPE=RELEASE \
+ -DCMAKE_INSTALL_PREFIX=$CROSSTOOLS_BUILD_DIR \
+ -DLLVM_TARGETS_TO_BUILD="X86;ARM;AArch64" \
+ -DTAPI_REPOSITORY_STRING=$TAPI_REPOSITORY \
+ -DTAPI_FULL_VERSION=$TAPI_VERSION
+
+ninja clangBasic
+ninja libtapi install-libtapi install-tapi-headers
+
+# Setup LDFLAGS late so run-at-build-time tools in the basic clang build don't
+# pick up the possibly-incompatible libstdc++ from clang.
+# Also set it up such that loading libtapi doesn't require a LD_LIBRARY_PATH.
+# (this requires two dollars and extra backslashing because it's used verbatim
+# via a Makefile)
+export LDFLAGS="-lpthread -Wl,-rpath-link,$CLANG_DIR/lib -Wl,-rpath,\\\$\$ORIGIN/../lib,-rpath,\\\$\$ORIGIN/../../clang/lib"
+
+# Configure crosstools-port
+cd $CROSSTOOLS_CCTOOLS_DIR
+# Force re-libtoolization to overwrite files with the new libtool bits.
+perl -pi -e 's/(LIBTOOLIZE -c)/\1 -f/' autogen.sh
+./autogen.sh
+./configure \
+ --prefix=$CROSSTOOLS_BUILD_DIR \
+ --target=x86_64-apple-darwin \
+ --with-llvm-config=$CLANG_DIR/bin/llvm-config \
+ --enable-lto-support \
+ --enable-tapi-support \
+ --with-libtapi=$CROSSTOOLS_BUILD_DIR
+
+# Build cctools
+make -j `nproc --all` install
+strip $CROSSTOOLS_BUILD_DIR/bin/*
+# cctools-port doesn't include dsymutil but clang will need to find it.
+cp $CLANG_DIR/bin/dsymutil $CROSSTOOLS_BUILD_DIR/bin/x86_64-apple-darwin-dsymutil
+# various build scripts based on cmake want to find `lipo` without a prefix
+cp $CROSSTOOLS_BUILD_DIR/bin/x86_64-apple-darwin-lipo $CROSSTOOLS_BUILD_DIR/bin/lipo
+
+(cd $CROSSTOOLS_BUILD_DIR/bin/; for i in x86_64-apple-darwin-*; do
+ ln $i aarch64${i#x86_64}
+done)
+
+# Put a tarball in the artifacts dir
+mkdir -p $UPLOAD_DIR
+tar cJf $UPLOAD_DIR/cctools.tar.xz -C $CROSSTOOLS_BUILD_DIR/.. `basename $CROSSTOOLS_BUILD_DIR`
diff --git a/taskcluster/scripts/misc/build-clang-mingw.sh b/taskcluster/scripts/misc/build-clang-mingw.sh
new file mode 100755
index 0000000000..7dc7843de7
--- /dev/null
+++ b/taskcluster/scripts/misc/build-clang-mingw.sh
@@ -0,0 +1,311 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for building a mingw-clang toolchain for use on Linux.
+
+if [[ $# -eq 0 ]]; then
+ echo "Provide either x86 or x64 to specify a toolchain."
+ exit 1;
+elif [ "$1" == "x86" ]; then
+ machine="i686"
+ compiler_rt_machine="i386"
+ crt_flags="--enable-lib32 --disable-lib64"
+ WRAPPER_FLAGS=""
+elif [ "$1" == "x64" ]; then
+ machine="x86_64"
+ compiler_rt_machine="x86_64"
+ crt_flags="--disable-lib32 --enable-lib64"
+ WRAPPER_FLAGS=""
+else
+ echo "Provide either x86 or x64 to specify a toolchain."
+ exit 1;
+fi
+
+TOOLCHAIN_DIR=$MOZ_FETCHES_DIR/llvm-project
+INSTALL_DIR=$TOOLCHAIN_DIR/build/stage4/clang
+CROSS_PREFIX_DIR=$INSTALL_DIR/$machine-w64-mingw32
+
+make_flags="-j$(nproc)"
+
+if [ -d "$MOZ_FETCHES_DIR/binutils/bin" ]; then
+ export PATH="$MOZ_FETCHES_DIR/binutils/bin:$PATH"
+fi
+
+# This is default value of _WIN32_WINNT. Gecko configure script explicitly sets this,
+# so this is not used to build Gecko itself. We default to 0x601, which is Windows 7.
+default_win32_winnt=0x601
+
+cd $GECKO_PATH
+
+patch_file1="$(pwd)/taskcluster/scripts/misc/mingw-winrt.patch"
+patch_file2="$(pwd)/taskcluster/scripts/misc/mingw-dwrite_3.patch"
+
+prepare() {
+ pushd $MOZ_FETCHES_DIR/mingw-w64
+ patch -p1 <$patch_file1
+ patch -p1 <$patch_file2
+ popd
+}
+
+install_wrappers() {
+ pushd $INSTALL_DIR/bin
+
+ compiler_flags="--sysroot \$DIR/../$machine-w64-mingw32 -rtlib=compiler-rt -stdlib=libc++ -fuse-ld=lld $WRAPPER_FLAGS -fuse-cxa-atexit -Qunused-arguments"
+
+ cat <<EOF >$machine-w64-mingw32-clang
+#!/bin/sh
+DIR="\$(cd "\$(dirname "\$0")" && pwd)"
+\$DIR/clang -target $machine-w64-mingw32 $compiler_flags "\$@"
+EOF
+ chmod +x $machine-w64-mingw32-clang
+
+ cat <<EOF >$machine-w64-mingw32-clang++
+#!/bin/sh
+DIR="\$(cd "\$(dirname "\$0")" && pwd)"
+\$DIR/clang -target $machine-w64-mingw32 --driver-mode=g++ $compiler_flags "\$@"
+EOF
+ chmod +x $machine-w64-mingw32-clang++
+
+ CC="$machine-w64-mingw32-clang"
+ CXX="$machine-w64-mingw32-clang++"
+
+ popd
+}
+
+build_mingw() {
+ mkdir mingw-w64-headers
+ pushd mingw-w64-headers
+ $MOZ_FETCHES_DIR/mingw-w64/mingw-w64-headers/configure \
+ --host=$machine-w64-mingw32 \
+ --enable-sdk=all \
+ --enable-idl \
+ --with-default-msvcrt=ucrt \
+ --with-default-win32-winnt=$default_win32_winnt \
+ --prefix=$CROSS_PREFIX_DIR
+ make $make_flags install
+ popd
+
+ mkdir mingw-w64-crt
+ pushd mingw-w64-crt
+ $MOZ_FETCHES_DIR/mingw-w64/mingw-w64-crt/configure \
+ --host=$machine-w64-mingw32 \
+ $crt_flags \
+ --with-default-msvcrt=ucrt \
+ CC="$CC" \
+ AR=llvm-ar \
+ RANLIB=llvm-ranlib \
+ DLLTOOL=llvm-dlltool \
+ --prefix=$CROSS_PREFIX_DIR
+ make $make_flags
+ make $make_flags install
+ popd
+
+ mkdir widl
+ pushd widl
+ $MOZ_FETCHES_DIR/mingw-w64/mingw-w64-tools/widl/configure --target=$machine-w64-mingw32 --prefix=$INSTALL_DIR
+ make $make_flags
+ make $make_flags install
+ popd
+}
+
+build_compiler_rt() {
+ CLANG_VERSION=$(basename $(dirname $(dirname $(dirname $($CC --print-libgcc-file-name -rtlib=compiler-rt)))))
+ mkdir compiler-rt
+ pushd compiler-rt
+ cmake \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_C_COMPILER=$CC \
+ -DCMAKE_SYSTEM_NAME=Windows \
+ -DCMAKE_AR=$INSTALL_DIR/bin/llvm-ar \
+ -DCMAKE_RANLIB=$INSTALL_DIR/bin/llvm-ranlib \
+ -DCMAKE_C_COMPILER_WORKS=1 \
+ -DCMAKE_C_COMPILER_TARGET=$compiler_rt_machine-windows-gnu \
+ -DCOMPILER_RT_DEFAULT_TARGET_ONLY=TRUE \
+ $TOOLCHAIN_DIR/compiler-rt/lib/builtins
+ make $make_flags
+ mkdir -p $INSTALL_DIR/lib/clang/$CLANG_VERSION/lib/windows
+ cp lib/windows/libclang_rt.builtins-$compiler_rt_machine.a $INSTALL_DIR/lib/clang/$CLANG_VERSION/lib/windows/
+ popd
+}
+
+merge_libs() {
+ cat <<EOF |llvm-ar -M
+CREATE tmp.a
+ADDLIB $1
+ADDLIB $2
+SAVE
+END
+EOF
+ llvm-ranlib tmp.a
+ mv tmp.a $1
+}
+
+build_libcxx() {
+ # Below, we specify -g -gcodeview to build static libraries with debug information.
+ # Because we're not distributing these builds, this is fine. If one were to distribute
+ # the builds, perhaps one would want to make those flags conditional or investigation
+ # other options.
+ DEBUG_FLAGS="-g -gcodeview"
+
+ mkdir libunwind
+ pushd libunwind
+ cmake \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_INSTALL_PREFIX=$CROSS_PREFIX_DIR \
+ -DCMAKE_C_COMPILER=$CC \
+ -DCMAKE_CXX_COMPILER=$CXX \
+ -DCMAKE_CROSSCOMPILING=TRUE \
+ -DCMAKE_SYSROOT=$CROSS_PREFIX_DIR \
+ -DCMAKE_SYSTEM_NAME=Windows \
+ -DCMAKE_C_COMPILER_WORKS=TRUE \
+ -DCMAKE_CXX_COMPILER_WORKS=TRUE \
+ -DLLVM_COMPILER_CHECKED=TRUE \
+ -DCMAKE_AR=$INSTALL_DIR/bin/llvm-ar \
+ -DCMAKE_RANLIB=$INSTALL_DIR/bin/llvm-ranlib \
+ -DLLVM_NO_OLD_LIBSTDCXX=TRUE \
+ -DCXX_SUPPORTS_CXX11=TRUE \
+ -DCXX_SUPPORTS_CXX_STD=TRUE \
+ -DLIBUNWIND_USE_COMPILER_RT=TRUE \
+ -DLIBUNWIND_ENABLE_THREADS=TRUE \
+ -DLIBUNWIND_ENABLE_SHARED=FALSE \
+ -DLIBUNWIND_ENABLE_CROSS_UNWINDING=FALSE \
+ -DCMAKE_CXX_FLAGS="${DEBUG_FLAGS} -Wno-dll-attribute-on-redeclaration -nostdinc++ -I$TOOLCHAIN_DIR/libcxx/include -DPSAPI_VERSION=2" \
+ -DCMAKE_C_FLAGS="-Wno-dll-attribute-on-redeclaration" \
+ $MOZ_FETCHES_DIR/libunwind
+ make $make_flags
+ make $make_flags install
+ popd
+
+ mkdir libcxxabi
+ pushd libcxxabi
+ cmake \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_INSTALL_PREFIX=$CROSS_PREFIX_DIR \
+ -DCMAKE_C_COMPILER=$CC \
+ -DCMAKE_CXX_COMPILER=$CXX \
+ -DCMAKE_CROSSCOMPILING=TRUE \
+ -DCMAKE_SYSTEM_NAME=Windows \
+ -DCMAKE_C_COMPILER_WORKS=TRUE \
+ -DCMAKE_CXX_COMPILER_WORKS=TRUE \
+ -DCMAKE_SYSROOT=$CROSS_PREFIX_DIR \
+ -DLLVM_COMPILER_CHECKED=TRUE \
+ -DCMAKE_AR=$INSTALL_DIR/bin/llvm-ar \
+ -DCMAKE_RANLIB=$INSTALL_DIR/bin/llvm-ranlib \
+ -DLIBCXXABI_USE_COMPILER_RT=ON \
+ -DLIBCXXABI_ENABLE_EXCEPTIONS=ON \
+ -DLIBCXXABI_ENABLE_THREADS=ON \
+ -DLIBCXXABI_TARGET_TRIPLE=$machine-w64-mingw32 \
+ -DLIBCXXABI_ENABLE_SHARED=OFF \
+ -DLIBCXXABI_LIBCXX_INCLUDES=$TOOLCHAIN_DIR/libcxx/include \
+ -DLLVM_NO_OLD_LIBSTDCXX=TRUE \
+ -DCXX_SUPPORTS_CXX11=TRUE \
+ -DCXX_SUPPORTS_CXX_STD=TRUE \
+ -DCMAKE_CXX_FLAGS="${DEBUG_FLAGS} -D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS -D_LIBCPP_HAS_THREAD_API_WIN32" \
+ $TOOLCHAIN_DIR/libcxxabi
+ make $make_flags VERBOSE=1
+ popd
+
+ mkdir libcxx
+ pushd libcxx
+ cmake \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_INSTALL_PREFIX=$CROSS_PREFIX_DIR \
+ -DCMAKE_C_COMPILER=$CC \
+ -DCMAKE_CXX_COMPILER=$CXX \
+ -DCMAKE_CROSSCOMPILING=TRUE \
+ -DCMAKE_SYSTEM_NAME=Windows \
+ -DCMAKE_C_COMPILER_WORKS=TRUE \
+ -DCMAKE_CXX_COMPILER_WORKS=TRUE \
+ -DLLVM_COMPILER_CHECKED=TRUE \
+ -DCMAKE_AR=$INSTALL_DIR/bin/llvm-ar \
+ -DCMAKE_RANLIB=$INSTALL_DIR/bin/llvm-ranlib \
+ -DLIBCXX_USE_COMPILER_RT=ON \
+ -DLIBCXX_INSTALL_HEADERS=ON \
+ -DLIBCXX_ENABLE_EXCEPTIONS=ON \
+ -DLIBCXX_ENABLE_THREADS=ON \
+ -DLIBCXX_HAS_WIN32_THREAD_API=ON \
+ -DLIBCXX_ENABLE_MONOTONIC_CLOCK=ON \
+ -DLIBCXX_ENABLE_SHARED=OFF \
+ -DLIBCXX_SUPPORTS_STD_EQ_CXX11_FLAG=TRUE \
+ -DLIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB=TRUE \
+ -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \
+ -DLIBCXX_ENABLE_FILESYSTEM=OFF \
+ -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \
+ -DLIBCXX_CXX_ABI=libcxxabi \
+ -DLIBCXX_CXX_ABI_INCLUDE_PATHS=$TOOLCHAIN_DIR/libcxxabi/include \
+ -DLIBCXX_CXX_ABI_LIBRARY_PATH=../libcxxabi/lib \
+ -DCMAKE_CXX_FLAGS="${DEBUG_FLAGS} -D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS" \
+ $TOOLCHAIN_DIR/libcxx
+ make $make_flags VERBOSE=1
+ make $make_flags install
+
+ # libc++.a depends on libunwind.a. Whild linker will automatically link
+ # to libc++.a in C++ mode, it won't pick libunwind.a, requiring caller
+ # to explicitly pass -lunwind. Wo work around that, we merge libunwind.a
+ # into libc++.a.
+ merge_libs $CROSS_PREFIX_DIR/lib/libc++.a $CROSS_PREFIX_DIR/lib/libunwind.a
+ popd
+}
+
+build_libssp() {
+ pushd $MOZ_FETCHES_DIR/gcc-source/
+
+ # Massage the environment for the build-libssp.sh script
+ mkdir -p ./$machine-w64-mingw32/lib
+ cp $MOZ_FETCHES_DIR/llvm-mingw/libssp-Makefile .
+ sed -i 's/set -e/set -x -e -v/' $MOZ_FETCHES_DIR/llvm-mingw/build-libssp.sh
+ sed -i 's/(CROSS)gcc/(CROSS)clang/' libssp-Makefile
+ sed -i 's/\$(CROSS)ar/llvm-ar/' libssp-Makefile
+ OLDPATH=$PATH
+ PATH=$INSTALL_DIR/clang/bin:$PATH
+
+ # Run the script
+ TOOLCHAIN_ARCHS=$machine $MOZ_FETCHES_DIR/llvm-mingw/build-libssp.sh .
+
+ # Grab the artifacts, cleanup
+ cp $MOZ_FETCHES_DIR/gcc-source/$machine-w64-mingw32/lib/{libssp.a,libssp_nonshared.a} $INSTALL_DIR/$machine-w64-mingw32/lib/
+ unset TOOLCHAIN_ARCHS
+ PATH=$OLDPATH
+ popd
+}
+
+build_utils() {
+ pushd $INSTALL_DIR/bin/
+ ln -s llvm-nm $machine-w64-mingw32-nm
+ ln -s llvm-strip $machine-w64-mingw32-strip
+ ln -s llvm-readobj $machine-w64-mingw32-readobj
+ ln -s llvm-objcopy $machine-w64-mingw32-objcopy
+ ./clang $MOZ_FETCHES_DIR/llvm-mingw/wrappers/windres-wrapper.c -O2 -Wl,-s -o $machine-w64-mingw32-windres
+ popd
+}
+
+export PATH=$INSTALL_DIR/bin:$PATH
+
+prepare
+
+# gets a bit too verbose here
+set +x
+
+cd $TOOLCHAIN_DIR
+python3 $GECKO_PATH/build/build-clang/build-clang.py -c $GECKO_PATH/$2 --skip-tar
+
+set -x
+
+pushd $TOOLCHAIN_DIR/build
+
+install_wrappers
+build_mingw
+build_compiler_rt
+build_libcxx
+build_libssp
+build_utils
+
+popd
+
+# Put a tarball in the artifacts dir
+mkdir -p $UPLOAD_DIR
+
+pushd $(dirname $INSTALL_DIR)
+tar c clang | $GECKO_PATH/taskcluster/scripts/misc/zstdpy > clangmingw.tar.zst
+mv clangmingw.tar.zst $UPLOAD_DIR
+popd
diff --git a/taskcluster/scripts/misc/build-clang-tidy-external.sh b/taskcluster/scripts/misc/build-clang-tidy-external.sh
new file mode 100755
index 0000000000..e3503fe14a
--- /dev/null
+++ b/taskcluster/scripts/misc/build-clang-tidy-external.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+set -x
+
+# Because we specify a private artifact, UPLOAD_DIR is not populated for us
+export UPLOAD_DIR="/builds/worker/private-artifacts/"
+
+# # Delete the external directory
+rm -rf $GECKO_PATH/build/clang-plugin/external/*
+
+# Move external repository into its place
+cp -r $MOZ_FETCHES_DIR/civet.git/* $GECKO_PATH/build/clang-plugin/external
+
+# Call build-clang.sh with this script's first argument (our JSON config)
+$GECKO_PATH/taskcluster/scripts/misc/build-clang.sh $1
diff --git a/taskcluster/scripts/misc/build-clang.sh b/taskcluster/scripts/misc/build-clang.sh
new file mode 100755
index 0000000000..e0f88150c6
--- /dev/null
+++ b/taskcluster/scripts/misc/build-clang.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for building clang.
+
+ORIGPWD="$PWD"
+JSON_CONFIG="$1"
+
+cd $GECKO_PATH
+
+if [ -n "$TOOLTOOL_MANIFEST" ]; then
+ . taskcluster/scripts/misc/tooltool-download.sh
+fi
+
+if [ -d "$MOZ_FETCHES_DIR/binutils/bin" ]; then
+ export PATH="$MOZ_FETCHES_DIR/binutils/bin:$PATH"
+fi
+
+case "$JSON_CONFIG" in
+*macosx64*)
+ # these variables are used in build-clang.py
+ export CROSS_CCTOOLS_PATH=$MOZ_FETCHES_DIR/cctools
+ export CROSS_SYSROOT=$(ls -d $MOZ_FETCHES_DIR/MacOSX10.*.sdk)
+ export PATH=$PATH:$CROSS_CCTOOLS_PATH/bin
+ ;;
+*win64*)
+ export UPLOAD_DIR=$ORIGPWD/public/build
+ # Set up all the Visual Studio paths.
+ . taskcluster/scripts/misc/vs-setup.sh
+
+ # LLVM_ENABLE_DIA_SDK is set if the directory "$ENV{VSINSTALLDIR}DIA SDK"
+ # exists.
+ export VSINSTALLDIR="${VSPATH}/"
+
+ export PATH="$(cd $MOZ_FETCHES_DIR/cmake && pwd)/bin:${PATH}"
+ export PATH="$(cd $MOZ_FETCHES_DIR/ninja && pwd)/bin:${PATH}"
+ ;;
+*linux64*|*android*)
+ ;;
+*)
+ echo Cannot figure out build configuration for $JSON_CONFIG
+ exit 1
+ ;;
+esac
+
+# gets a bit too verbose here
+set +x
+
+cd $MOZ_FETCHES_DIR/llvm-project
+python3 $GECKO_PATH/build/build-clang/build-clang.py -c $GECKO_PATH/$1
+
+set -x
+
+# Put a tarball in the artifacts dir
+mkdir -p $UPLOAD_DIR
+cp clang*.tar.* $UPLOAD_DIR
+
+. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh
diff --git a/taskcluster/scripts/misc/build-compiler-rt.sh b/taskcluster/scripts/misc/build-compiler-rt.sh
new file mode 100755
index 0000000000..1b2cb3df35
--- /dev/null
+++ b/taskcluster/scripts/misc/build-compiler-rt.sh
@@ -0,0 +1,78 @@
+#!/bin/sh
+
+set -e
+
+target=$1
+shift
+
+case "$target" in
+aarch64-apple-darwin)
+ arch=arm64
+ sdk=11.0
+ extra_flags="-mcpu=apple-a12"
+ ;;
+x86_64-apple-darwin)
+ arch=x86_64
+ sdk=10.12
+ ;;
+*)
+ echo $target is not supported yet
+ exit 1
+ ;;
+esac
+
+export PATH="$MOZ_FETCHES_DIR/cctools/bin:$PATH"
+
+if [ -n "$TOOLTOOL_MANIFEST" ]; then
+ . $GECKO_PATH/taskcluster/scripts/misc/tooltool-download.sh
+fi
+
+mkdir compiler-rt
+cd compiler-rt
+
+compiler_wrapper() {
+cat > $1 <<EOF
+exec \$MOZ_FETCHES_DIR/clang/bin/$1 -target $target $extra_flags -isysroot \$MOZ_FETCHES_DIR/MacOSX$sdk.sdk "\$@"
+EOF
+chmod +x $1
+}
+compiler_wrapper clang
+compiler_wrapper clang++
+
+for patchfile in "$@"; do
+ patch -d $MOZ_FETCHES_DIR/llvm-project -p1 < $GECKO_PATH/$patchfile
+done
+
+cmake \
+ $MOZ_FETCHES_DIR/llvm-project/compiler-rt \
+ -GNinja \
+ -DCMAKE_C_COMPILER=$PWD/clang \
+ -DCMAKE_CXX_COMPILER=$PWD/clang++ \
+ -DCMAKE_LINKER=$MOZ_FETCHES_DIR/cctools/bin/$target-ld \
+ -DCMAKE_LIPO=$MOZ_FETCHES_DIR/cctools/bin/lipo \
+ -DCMAKE_AR=$MOZ_FETCHES_DIR/cctools/bin/$target-ar \
+ -DCMAKE_RANLIB=$MOZ_FETCHES_DIR/cctools/bin/$target-ranlib \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DLLVM_ENABLE_ASSERTIONS=OFF \
+ -DLLVM_CONFIG_PATH=$MOZ_FETCHES_DIR/clang/bin/llvm-config \
+ -DCMAKE_SYSTEM_NAME=Darwin \
+ -DCMAKE_SYSTEM_VERSION=$sdk \
+ -DDARWIN_osx_ARCHS=$arch \
+ -DDARWIN_osx_SYSROOT=$MOZ_FETCHES_DIR/MacOSX$sdk.sdk \
+ -DLLVM_DEFAULT_TARGET_TRIPLE=$target \
+ -DDARWIN_macosx_OVERRIDE_SDK_VERSION=$sdk \
+ -DDARWIN_osx_BUILTIN_ARCHS=$arch
+
+# compiler-rt build script expects to find `codesign` in $PATH.
+# Give it a fake one.
+echo "#!/bin/sh" > codesign
+chmod +x codesign
+
+PATH=$PATH:$PWD ninja -v
+
+cd ..
+
+tar -cf - compiler-rt/lib/darwin | python3 $GECKO_PATH/taskcluster/scripts/misc/zstdpy > "compiler-rt.tar.zst"
+
+mkdir -p "$UPLOAD_DIR"
+mv "compiler-rt.tar.zst" "$UPLOAD_DIR"
diff --git a/taskcluster/scripts/misc/build-custom-v8.sh b/taskcluster/scripts/misc/build-custom-v8.sh
new file mode 100755
index 0000000000..11dbd5dd52
--- /dev/null
+++ b/taskcluster/scripts/misc/build-custom-v8.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for building a custom version of V8
+ARTIFACT_NAME='d8.zip'
+CONFIG='is_debug=false target_cpu="x64"'
+if [[ $# -eq 0 ]]; then
+ echo "Using default configuration for v8 build."
+ CONFIG=$(echo $CONFIG | tr -d "'")
+else
+ # First argument must be the artifact name
+ ARTIFACT_NAME="$1"
+ shift
+
+ # Use the rest of the arguments as the build config
+ CONFIG=$(echo $* | tr -d "'")
+fi
+
+echo "Config: $CONFIG"
+echo "Artifact name: $ARTIFACT_NAME"
+
+cd $GECKO_PATH
+
+# Setup depot_tools
+git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
+export PATH=$PATH:$GECKO_PATH/depot_tools
+
+# Get v8 source code and dependencies
+fetch --force v8
+cd v8
+
+# Build v8
+gn gen out/release --args="$CONFIG"
+ninja -C out/release d8
+
+# Gather binary and related files into a zip, and upload it
+cd ..
+mkdir d8
+
+cp -R v8/out/release d8
+cp -R v8/include d8
+chmod -R +x d8
+
+zip -r $ARTIFACT_NAME d8
+
+mkdir -p $UPLOAD_DIR
+cp $ARTIFACT_NAME $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/build-dist-toolchains.sh b/taskcluster/scripts/misc/build-dist-toolchains.sh
new file mode 100755
index 0000000000..1ad1871775
--- /dev/null
+++ b/taskcluster/scripts/misc/build-dist-toolchains.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for packaging toolchains suitable for use by distributed sccache.
+TL_NAME="$1"
+
+mkdir -p $HOME/artifacts
+mkdir -p $HOME/toolchains
+
+mv $MOZ_FETCHES_DIR/$TL_NAME $HOME/toolchains/$TL_NAME
+
+$MOZ_FETCHES_DIR/sccache/sccache --package-toolchain $HOME/toolchains/$TL_NAME/bin/$TL_NAME $HOME/artifacts/$TL_NAME-dist-toolchain.tar.xz
diff --git a/taskcluster/scripts/misc/build-dump-syms.sh b/taskcluster/scripts/misc/build-dump-syms.sh
new file mode 100755
index 0000000000..9f5415d636
--- /dev/null
+++ b/taskcluster/scripts/misc/build-dump-syms.sh
@@ -0,0 +1,66 @@
+#!/bin/bash
+set -x -e -v
+
+PROJECT=dump_syms
+# Needed by osx-cross-linker.
+export TARGET=$1
+
+# This script is for building dump_syms
+case "$(uname -s)" in
+Linux)
+ COMPRESS_EXT=xz
+ ;;
+MINGW*)
+ UPLOAD_DIR=$PWD/public/build
+ COMPRESS_EXT=bz2
+
+ . $GECKO_PATH/taskcluster/scripts/misc/vs-setup.sh
+ ;;
+esac
+
+cd $GECKO_PATH
+
+if [ -n "$TOOLTOOL_MANIFEST" ]; then
+ . taskcluster/scripts/misc/tooltool-download.sh
+fi
+
+PATH="$(cd $MOZ_FETCHES_DIR && pwd)/rustc/bin:$PATH"
+
+cd $MOZ_FETCHES_DIR/$PROJECT
+
+case "$(uname -s)" in
+Linux)
+ if [ "$TARGET" == "x86_64-apple-darwin" ]; then
+ export PATH="$MOZ_FETCHES_DIR/llvm-dsymutil/bin:$PATH"
+ export PATH="$MOZ_FETCHES_DIR/cctools/bin:$PATH"
+ export RUSTFLAGS="-C linker=$GECKO_PATH/taskcluster/scripts/misc/osx-cross-linker"
+ export CC="$MOZ_FETCHES_DIR/clang/bin/clang"
+ export TARGET_CC="$MOZ_FETCHES_DIR/clang/bin/clang -isysroot $MOZ_FETCHES_DIR/MacOSX10.12.sdk"
+ export TARGET_CXX="$MOZ_FETCHES_DIR/clang/bin/clang++ -isysroot $MOZ_FETCHES_DIR/MacOSX10.12.sdk -stdlib=libc++"
+ cargo build --verbose --release --target $TARGET
+ else
+ export RUSTFLAGS=-Clinker=clang++
+ export CC=clang
+ export CXX=clang++
+ export CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0
+ export PATH="$MOZ_FETCHES_DIR/clang/bin:$MOZ_FETCHES_DIR/binutils/bin:$PATH"
+ cargo build --verbose --release --features "vendored-openssl"
+ fi
+ ;;
+MINGW*)
+ cargo build --verbose --release
+ ;;
+esac
+
+mkdir $PROJECT
+PROJECT_OUT=target/release/${PROJECT}*
+if [ -n "$TARGET" ]; then
+ PROJECT_OUT=target/${TARGET}/release/${PROJECT}*
+fi
+cp ${PROJECT_OUT} ${PROJECT}/
+tar -acf ${PROJECT}.tar.$COMPRESS_EXT $PROJECT
+mkdir -p $UPLOAD_DIR
+cp ${PROJECT}.tar.$COMPRESS_EXT $UPLOAD_DIR
+
+cd ..
+. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh
diff --git a/taskcluster/scripts/misc/build-fix-stacks.sh b/taskcluster/scripts/misc/build-fix-stacks.sh
new file mode 100755
index 0000000000..ab1b8028a4
--- /dev/null
+++ b/taskcluster/scripts/misc/build-fix-stacks.sh
@@ -0,0 +1,71 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for building fix-stacks.
+PROJECT=fix-stacks
+
+export TARGET="$1"
+
+case "$TARGET" in
+x86_64-unknown-linux-gnu)
+ EXE=
+ COMPRESS_EXT=xz
+ # {CC,CXX} and TARGET_{CC,CXX} must be set because a build.rs file builds
+ # some C and C++ code.
+ export CC=$MOZ_FETCHES_DIR/clang/bin/clang
+ export CXX=$MOZ_FETCHES_DIR/clang/bin/clang++
+ export PATH="$MOZ_FETCHES_DIR/binutils/bin:$PATH"
+ export RUSTFLAGS="-C linker=$CXX"
+ ;;
+x86_64-apple-darwin)
+ # Cross-compiling for Mac on Linux.
+ EXE=
+ COMPRESS_EXT=xz
+ # {CC,CXX} and TARGET_{CC,CXX} must be set because a build.rs file builds
+ # some C and C++ code.
+ export CC=$MOZ_FETCHES_DIR/clang/bin/clang
+ export CXX=$MOZ_FETCHES_DIR/clang/bin/clang++
+ export PATH="$MOZ_FETCHES_DIR/cctools/bin:$PATH"
+ export RUSTFLAGS="-C linker=$GECKO_PATH/taskcluster/scripts/misc/osx-cross-linker"
+ export TARGET_CC="$CC -isysroot $MOZ_FETCHES_DIR/MacOSX10.12.sdk"
+ export TARGET_CXX="$CXX -isysroot $MOZ_FETCHES_DIR/MacOSX10.12.sdk"
+ ;;
+i686-pc-windows-msvc)
+ # Cross-compiling for Windows on Linux.
+ EXE=.exe
+ COMPRESS_EXT=bz2
+ # Some magic that papers over differences in case-sensitivity/insensitivity on Linux
+ # and Windows file systems.
+ export LD_PRELOAD="/builds/worker/fetches/liblowercase/liblowercase.so"
+ export LOWERCASE_DIRS="/builds/worker/fetches/vs2017_15.8.4"
+ # {CC,CXX} and TARGET_{CC,CXX} must be set because a build.rs file builds
+ # some C and C++ code.
+ export CC=$MOZ_FETCHES_DIR/clang/bin/clang-cl
+ export CXX=$MOZ_FETCHES_DIR/clang/bin/clang-cl
+ export TARGET_AR=$MOZ_FETCHES_DIR/clang/bin/llvm-lib
+ . $GECKO_PATH/taskcluster/scripts/misc/vs-setup32.sh
+ export CARGO_TARGET_I686_PC_WINDOWS_MSVC_LINKER=$MOZ_FETCHES_DIR/clang/bin/lld-link
+ ;;
+esac
+
+cd $GECKO_PATH
+
+if [ -n "$TOOLTOOL_MANIFEST" ]; then
+ . taskcluster/scripts/misc/tooltool-download.sh
+fi
+
+PATH="$(cd $MOZ_FETCHES_DIR && pwd)/rustc/bin:$PATH"
+
+cd $MOZ_FETCHES_DIR/$PROJECT
+
+cargo build --verbose --release --target "$TARGET"
+
+mkdir $PROJECT
+cp target/$TARGET/release/${PROJECT}${EXE} ${PROJECT}/
+tar -acf ${PROJECT}.tar.$COMPRESS_EXT $PROJECT
+mkdir -p $UPLOAD_DIR
+cp ${PROJECT}.tar.$COMPRESS_EXT $UPLOAD_DIR
+
+cd ..
+
+. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh
diff --git a/taskcluster/scripts/misc/build-gcc-linux.sh b/taskcluster/scripts/misc/build-gcc-linux.sh
new file mode 100755
index 0000000000..42a7bc85e2
--- /dev/null
+++ b/taskcluster/scripts/misc/build-gcc-linux.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+set -e
+
+# This script is for building GCC for Linux.
+
+root_dir=$MOZ_FETCHES_DIR
+data_dir=$GECKO_PATH/build/unix/build-gcc
+
+. $data_dir/build-gcc.sh
+
+pushd $root_dir/gcc-source
+ln -sf ../gmp-source gmp
+ln -sf ../isl-source isl
+ln -sf ../mpc-source mpc
+ln -sf ../mpfr-source mpfr
+popd
+
+build_binutils
+build_gcc
+
+# Put a tarball in the artifacts dir
+mkdir -p $UPLOAD_DIR
+cp $MOZ_FETCHES_DIR/gcc.tar.* $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/build-gcc-mingw32.sh b/taskcluster/scripts/misc/build-gcc-mingw32.sh
new file mode 100755
index 0000000000..7d8525fc76
--- /dev/null
+++ b/taskcluster/scripts/misc/build-gcc-mingw32.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+set -e
+
+# This script is for building a MinGW GCC (and headers) to be used on Linux to compile for Windows.
+
+root_dir=$MOZ_FETCHES_DIR
+data_dir=$GECKO_PATH/build/unix/build-gcc
+
+. $data_dir/build-gcc.sh
+
+binutils_configure_flags="--target=i686-w64-mingw32"
+mingw_version=bcf1f29d6dc80b6025b416bef104d2314fa9be57
+
+pushd $root_dir/gcc-source
+ln -sf ../gmp-source gmp
+ln -sf ../isl-source isl
+ln -sf ../mpc-source mpc
+ln -sf ../mpfr-source mpfr
+popd
+
+prepare_mingw
+build_binutils
+build_gcc_and_mingw
+
+# Put a tarball in the artifacts dir
+mkdir -p $UPLOAD_DIR
+cp $root_dir/mingw32.tar.* $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/build-gcc-sixgill-plugin-linux.sh b/taskcluster/scripts/misc/build-gcc-sixgill-plugin-linux.sh
new file mode 100755
index 0000000000..b3d15b3c8b
--- /dev/null
+++ b/taskcluster/scripts/misc/build-gcc-sixgill-plugin-linux.sh
@@ -0,0 +1,81 @@
+#!/bin/bash
+
+set -e
+set -x
+
+# This script is for building the sixgill GCC plugin for Linux. It relies on
+# the gcc checkout because it needs to recompile gmp and the gcc build script
+# determines the version of gmp to download.
+
+root_dir=$MOZ_FETCHES_DIR
+build_dir=$GECKO_PATH/build
+data_dir=$GECKO_PATH/build/unix/build-gcc
+
+sixgill_rev=88d1a251c92a
+sixgill_repo=https://hg.mozilla.org/users/sfink_mozilla.com/sixgill
+
+. $data_dir/build-gcc.sh
+
+mkdir $root_dir/gcc-source || true
+pushd $root_dir/gcc-source
+ln -sf ../binutils-source binutils
+ln -sf ../gmp-source gmp
+ln -sf ../isl-source isl
+ln -sf ../mpc-source mpc
+ln -sf ../mpfr-source mpfr
+popd
+
+export TMPDIR=${TMPDIR:-/tmp/}
+export gcc_bindir=$MOZ_FETCHES_DIR/gcc/bin
+export gmp_prefix=/tools/gmp
+export gmp_dir=$root_dir$gmp_prefix
+
+prepare_sixgill() {(
+ cd $root_dir
+ hg clone -r $sixgill_rev $sixgill_repo || ( cd sixgill && hg update -r $sixgill_rev )
+)}
+
+build_gmp() {
+ if ! [ -x $gcc_bindir/gcc ]; then
+ echo "GCC not found in $gcc_bindir/gcc" >&2
+ exit 1
+ fi
+
+ # The sixgill plugin uses some gmp symbols, including some not exported by
+ # cc1/cc1plus. So link the plugin statically to libgmp. Except that the
+ # default static build does not have -fPIC, and will result in a relocation
+ # error, so build our own. This requires the gcc and related source to be
+ # in $root_dir/gcc-source.
+
+ mkdir $root_dir/gmp-objdir || true
+ (
+ cd $root_dir/gmp-objdir
+ $root_dir/gcc-source/gmp/configure --disable-shared --with-pic --prefix=$gmp_prefix
+ make -j8
+ make install DESTDIR=$root_dir
+ )
+}
+
+build_sixgill() {(
+ cd $root_dir/sixgill
+ export CC=$gcc_bindir/gcc
+ export CXX=$gcc_bindir/g++
+ export PATH="$gcc_bindir:$PATH"
+ export LD_LIBRARY_PATH="${gcc_bindir%/bin}/lib64"
+ export TARGET_CC=$CC
+ export CPPFLAGS=-I$gmp_dir/include
+ export EXTRA_LDFLAGS=-L$gmp_dir/lib
+ export HOST_CFLAGS=$CPPFLAGS
+
+ ./release.sh --build-and-package --with-gmp=$gmp_dir
+ tarball=$(ls -td *-sixgill | head -1)/sixgill.tar.xz
+ cp $tarball $root_dir/sixgill.tar.xz
+)}
+
+prepare_sixgill
+build_gmp
+build_sixgill
+
+# Put a tarball in the artifacts dir
+mkdir -p $UPLOAD_DIR
+cp $MOZ_FETCHES_DIR/sixgill.tar.* $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/build-geckodriver.sh b/taskcluster/scripts/misc/build-geckodriver.sh
new file mode 100755
index 0000000000..d9bfd4d911
--- /dev/null
+++ b/taskcluster/scripts/misc/build-geckodriver.sh
@@ -0,0 +1,66 @@
+#!/bin/bash
+# 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/.
+set -x -e -v
+
+# Needed by osx-cross-linker.
+export TARGET="$1"
+
+cd $GECKO_PATH
+
+if [ -n "$TOOLTOOL_MANIFEST" ]; then
+ . taskcluster/scripts/misc/tooltool-download.sh
+fi
+
+EXE=
+COMPRESS_EXT=gz
+
+case "$TARGET" in
+*windows-msvc)
+ EXE=.exe
+ COMPRESS_EXT=zip
+ if [[ $TARGET == "i686-pc-windows-msvc" ]]; then
+ . $GECKO_PATH/taskcluster/scripts/misc/vs-setup32.sh
+ export CARGO_TARGET_I686_PC_WINDOWS_MSVC_LINKER=$MOZ_FETCHES_DIR/clang/bin/lld-link
+ else
+ . $GECKO_PATH/taskcluster/scripts/misc/vs-setup.sh
+ export CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_LINKER=$MOZ_FETCHES_DIR/clang/bin/lld-link
+ fi
+ ( IFS=\;
+ for d in $LIB; do
+ (cd "$d"; rename y/A-Z/a-z/ *)
+ done
+ )
+ # Bug 1584530: don't require the Microsoft MSVC runtime to be installed.
+ export RUSTFLAGS="-Ctarget-feature=+crt-static"
+ ;;
+# OSX cross builds are a bit harder
+x86_64-apple-darwin)
+ export PATH="$MOZ_FETCHES_DIR/llvm-dsymutil/bin:$PATH"
+ export PATH="$MOZ_FETCHES_DIR/cctools/bin:$PATH"
+ export RUSTFLAGS="-C linker=$GECKO_PATH/taskcluster/scripts/misc/osx-cross-linker"
+ ;;
+esac
+
+export PATH="$MOZ_FETCHES_DIR/rustc/bin:$PATH"
+
+cd $GECKO_PATH/testing/geckodriver
+
+cp $GECKO_PATH/.cargo/config.in $GECKO_PATH/.cargo/config
+
+cargo build --frozen --verbose --release --target "$TARGET"
+
+cd $GECKO_PATH
+mkdir -p $UPLOAD_DIR
+
+cp target/$TARGET/release/geckodriver$EXE .
+if [ "$COMPRESS_EXT" = "zip" ]; then
+ zip geckodriver.zip geckodriver$EXE
+ cp geckodriver.zip $UPLOAD_DIR
+else
+ tar -acf geckodriver.tar.$COMPRESS_EXT geckodriver$EXE
+ cp geckodriver.tar.$COMPRESS_EXT $UPLOAD_DIR
+fi
+
+. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh
diff --git a/taskcluster/scripts/misc/build-gn-common.sh b/taskcluster/scripts/misc/build-gn-common.sh
new file mode 100755
index 0000000000..66e74914c5
--- /dev/null
+++ b/taskcluster/scripts/misc/build-gn-common.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+set -e -v
+
+# This is shared code for building GN.
+cd $MOZ_FETCHES_DIR/gn
+
+# We remove /WC because of https://bugs.chromium.org/p/gn/issues/detail?id=51
+# And /MACHINE:x64 because we just let the PATH decide what cl and link are
+# used, and if cl is targetting x86, we don't want linkage to fail because of
+# /MACHINE:x64.
+patch -p1 <<'EOF'
+diff --git a/build/gen.py b/build/gen.py
+index a7142fab..78d0fd56 100755
+--- a/build/gen.py
++++ b/build/gen.py
+@@ -357,7 +357,6 @@ def WriteGNNinja(path, platform, host, options):
+ '/D_WIN32_WINNT=0x0A00',
+ '/FS',
+ '/W4',
+- '/WX',
+ '/Zi',
+ '/wd4099',
+ '/wd4100',
+@@ -373,7 +372,7 @@ def WriteGNNinja(path, platform, host, options):
+ '/D_HAS_EXCEPTIONS=0',
+ ])
+
+- ldflags.extend(['/DEBUG', '/MACHINE:x64'])
++ ldflags.extend(['/DEBUG'])
+
+ static_libraries = {
+ 'base': {'sources': [
+EOF
+
+if test -n "$MAC_CROSS"; then
+ python build/gen.py --platform darwin --no-last-commit-position
+else
+ python build/gen.py --no-last-commit-position
+fi
+
+cat > out/last_commit_position.h <<EOF
+#ifndef OUT_LAST_COMMIT_POSITION_H_
+#define OUT_LAST_COMMIT_POSITION_H_
+
+#define LAST_COMMIT_POSITION "unknown"
+
+#endif // OUT_LAST_COMMIT_POSITION_H_
+EOF
+
+ninja -C out -v
+
+STAGE=gn
+mkdir -p $UPLOAD_DIR $STAGE
+
+# At this point, the resulting binary is at:
+# $WORKSPACE/out/Release/gn
+if test "$MAC_CROSS" = "" -a "$(uname)" = "Linux"; then
+ strip out/gn
+fi
+cp out/gn $STAGE
+
+tar -acf gn.tar.$COMPRESS_EXT $STAGE
+cp gn.tar.$COMPRESS_EXT $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/build-gn-linux.sh b/taskcluster/scripts/misc/build-gn-linux.sh
new file mode 100755
index 0000000000..578b8a8984
--- /dev/null
+++ b/taskcluster/scripts/misc/build-gn-linux.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+set -e -v
+
+# This script is for building GN on Linux.
+
+WORKSPACE=$HOME/workspace
+COMPRESS_EXT=xz
+export CC=$MOZ_FETCHES_DIR/gcc/bin/gcc
+export CXX=$MOZ_FETCHES_DIR/gcc/bin/g++
+export LDFLAGS=-lrt
+
+# Gn build scripts use #!/usr/bin/env python, which will be python 2.6 on
+# the worker and cause failures. Work around this by putting python2.7
+# ahead of it in PATH.
+mkdir -p $WORKSPACE/python_bin
+ln -s /usr/bin/python2.7 $WORKSPACE/python_bin/python
+export PATH=$WORKSPACE/python_bin:$PATH
+
+cd $GECKO_PATH
+
+. taskcluster/scripts/misc/build-gn-common.sh
diff --git a/taskcluster/scripts/misc/build-gn-macosx.sh b/taskcluster/scripts/misc/build-gn-macosx.sh
new file mode 100755
index 0000000000..e745141516
--- /dev/null
+++ b/taskcluster/scripts/misc/build-gn-macosx.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+set -e -v
+
+# This script is for building GN.
+
+WORKSPACE=$HOME/workspace
+COMPRESS_EXT=xz
+
+CROSS_CCTOOLS_PATH=$MOZ_FETCHES_DIR/cctools
+CROSS_SYSROOT=$MOZ_FETCHES_DIR/MacOSX10.12.sdk
+
+export CC=$MOZ_FETCHES_DIR/clang/bin/clang
+export CXX=$MOZ_FETCHES_DIR/clang/bin/clang++
+export AR=$MOZ_FETCHES_DIR/clang/bin/llvm-ar
+export CFLAGS="-target x86_64-apple-darwin -mlinker-version=137 -B ${CROSS_CCTOOLS_PATH}/bin -isysroot ${CROSS_SYSROOT} -I${CROSS_SYSROOT}/usr/include -iframework ${CROSS_SYSROOT}/System/Library/Frameworks"
+export CXXFLAGS="-stdlib=libc++ ${CFLAGS}"
+export LDFLAGS="${CXXFLAGS} -Wl,-syslibroot,${CROSS_SYSROOT} -Wl,-dead_strip"
+
+# We patch tools/gn/bootstrap/bootstrap.py to detect this.
+export MAC_CROSS=1
+
+# Gn build scripts use #!/usr/bin/env python, which will be python 2.6 on
+# the worker and cause failures. Work around this by putting python2.7
+# ahead of it in PATH.
+mkdir -p $WORKSPACE/python_bin
+ln -s /usr/bin/python2.7 $WORKSPACE/python_bin/python
+export PATH=$WORKSPACE/python_bin:$PATH
+
+cd $GECKO_PATH
+
+. taskcluster/scripts/misc/tooltool-download.sh
+
+# The ninja templates used to bootstrap gn have hard-coded references to
+# 'libtool', make sure we find the right one.
+ln -s $CROSS_CCTOOLS_PATH/bin/x86_64-apple-darwin-libtool $CROSS_CCTOOLS_PATH/bin/libtool
+export PATH=$CROSS_CCTOOLS_PATH/bin:$PATH
+
+. taskcluster/scripts/misc/build-gn-common.sh
diff --git a/taskcluster/scripts/misc/build-gn-win32.sh b/taskcluster/scripts/misc/build-gn-win32.sh
new file mode 100755
index 0000000000..8eb5a8ad03
--- /dev/null
+++ b/taskcluster/scripts/misc/build-gn-win32.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+set -e -v -x
+
+# This script is for building GN on Windows.
+
+UPLOAD_DIR=$PWD/public/build
+COMPRESS_EXT=bz2
+
+cd $GECKO_PATH
+
+export PATH="$(cd $MOZ_FETCHES_DIR && pwd)/ninja/bin:$PATH"
+export PATH="$(cd $MOZ_FETCHES_DIR && pwd)/mingw64/bin:$PATH"
+
+. taskcluster/scripts/misc/vs-setup.sh
+. taskcluster/scripts/misc/tooltool-download.sh
+. taskcluster/scripts/misc/build-gn-common.sh
+
+. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh
diff --git a/taskcluster/scripts/misc/build-grcov.sh b/taskcluster/scripts/misc/build-grcov.sh
new file mode 100755
index 0000000000..3fd770c0e4
--- /dev/null
+++ b/taskcluster/scripts/misc/build-grcov.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for building grcov
+
+PROJECT=grcov
+
+case "$(uname -s)" in
+Linux)
+ COMPRESS_EXT=xz
+
+ export CC=clang
+ export CXX=clang++
+ export RUSTFLAGS=-Clinker=clang++
+
+ export PATH="$MOZ_FETCHES_DIR/clang/bin:$MOZ_FETCHES_DIR/binutils/bin:$PATH"
+ ;;
+MINGW*)
+ UPLOAD_DIR=$PWD/public/build
+ COMPRESS_EXT=bz2
+
+ . $GECKO_PATH/taskcluster/scripts/misc/vs-setup.sh
+ ;;
+esac
+
+cd $GECKO_PATH
+
+if [ -n "$TOOLTOOL_MANIFEST" ]; then
+ . taskcluster/scripts/misc/tooltool-download.sh
+fi
+
+PATH="$(cd $MOZ_FETCHES_DIR && pwd)/rustc/bin:$PATH"
+
+pushd $MOZ_FETCHES_DIR/$PROJECT
+
+cargo build --verbose --release
+
+mkdir $PROJECT
+cp target/release/${PROJECT}* ${PROJECT}/
+pushd $PROJECT
+tar -acf ../${PROJECT}.tar.$COMPRESS_EXT *
+popd
+mkdir -p $UPLOAD_DIR
+cp ${PROJECT}.tar.$COMPRESS_EXT $UPLOAD_DIR
+
+popd
+
+. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh
diff --git a/taskcluster/scripts/misc/build-hfsplus-linux.sh b/taskcluster/scripts/misc/build-hfsplus-linux.sh
new file mode 100755
index 0000000000..32f12d5b8f
--- /dev/null
+++ b/taskcluster/scripts/misc/build-hfsplus-linux.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for building hfsplus for Linux.
+
+cd $GECKO_PATH
+
+export PATH=$PATH:$MOZ_FETCHES_DIR/clang/bin
+
+build/unix/build-hfsplus/build-hfsplus.sh $MOZ_FETCHES_DIR
+
+# Put a tarball in the artifacts dir
+mkdir -p $UPLOAD_DIR
+cp $MOZ_FETCHES_DIR/hfsplus-tools.tar.* $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/build-infer-linux.sh b/taskcluster/scripts/misc/build-infer-linux.sh
new file mode 100755
index 0000000000..89780f6284
--- /dev/null
+++ b/taskcluster/scripts/misc/build-infer-linux.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for building infer for Linux.
+
+cd $GECKO_PATH
+
+# gets a bit too verbose here
+set +x
+
+cd build/build-infer
+./build-infer.py -c infer-linux64.json
+
+set -x
+
+# Put a tarball in the artifacts dir
+mkdir -p $UPLOAD_DIR
+cp infer.tar.* $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/build-libdmg-hfsplus.sh b/taskcluster/scripts/misc/build-libdmg-hfsplus.sh
new file mode 100755
index 0000000000..c76b722d8d
--- /dev/null
+++ b/taskcluster/scripts/misc/build-libdmg-hfsplus.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for building libdmg-hfsplus to get the `dmg` and `hfsplus`
+# tools for producing DMG archives on Linux.
+
+WORKSPACE=$HOME/workspace
+STAGE=$WORKSPACE/dmg
+
+mkdir -p $UPLOAD_DIR $STAGE
+
+cd $MOZ_FETCHES_DIR/libdmg-hfsplus
+
+cmake -DOPENSSL_USE_STATIC_LIBS=1 .
+make -j$(nproc)
+
+# We only need the dmg and hfsplus tools.
+strip dmg/dmg hfs/hfsplus
+cp dmg/dmg hfs/hfsplus $STAGE
+
+# duplicate the functionality of taskcluster-lib-urls, but in bash..
+queue_base="$TASKCLUSTER_ROOT_URL/api/queue/v1"
+
+cat >$STAGE/README<<EOF
+Source is available as a taskcluster artifact:
+$queue_base/task/$(python -c 'import json, os; print "{task}/artifacts/{artifact}".format(**next(f for f in json.loads(os.environ["MOZ_FETCHES"]) if "libdmg-hfsplus" in f["artifact"]))')
+EOF
+tar cf - -C $WORKSPACE `basename $STAGE` | xz > $UPLOAD_DIR/dmg.tar.xz
diff --git a/taskcluster/scripts/misc/build-liblowercase.sh b/taskcluster/scripts/misc/build-liblowercase.sh
new file mode 100755
index 0000000000..0846a60c4d
--- /dev/null
+++ b/taskcluster/scripts/misc/build-liblowercase.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+set -x -e -v
+
+: WORKSPACE ${WORKSPACE:=/builds/worker/workspace}
+
+# This script is for building liblowercase
+
+PATH="$MOZ_FETCHES_DIR/rustc/bin:$PATH"
+
+cd $GECKO_PATH/build/liblowercase
+
+cargo build --verbose --release --target-dir $WORKSPACE/obj
+
+mkdir $WORKSPACE/liblowercase
+cp $WORKSPACE/obj/release/liblowercase.so $WORKSPACE/liblowercase
+strip $WORKSPACE/liblowercase/liblowercase.so
+tar -C $WORKSPACE -acf $WORKSPACE/liblowercase.tar.xz liblowercase
+mkdir -p $UPLOAD_DIR
+cp $WORKSPACE/liblowercase.tar.xz $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/build-llvm-dsymutil.sh b/taskcluster/scripts/misc/build-llvm-dsymutil.sh
new file mode 100755
index 0000000000..aeafb6acf2
--- /dev/null
+++ b/taskcluster/scripts/misc/build-llvm-dsymutil.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for building clang for Linux.
+
+cd $GECKO_PATH
+
+cd $MOZ_FETCHES_DIR/llvm-project/llvm
+
+mkdir build
+cd build
+
+cmake \
+ -GNinja \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DLLVM_TARGETS_TO_BUILD="X86;AArch64" \
+ -DCMAKE_C_COMPILER=$MOZ_FETCHES_DIR/gcc/bin/gcc \
+ ..
+
+export LD_LIBRARY_PATH=$MOZ_FETCHES_DIR/gcc/lib64
+
+ninja dsymutil llvm-symbolizer
+
+tar --xform='s,^,llvm-dsymutil/,' -Jcf llvm-dsymutil.tar.xz bin/dsymutil bin/llvm-symbolizer
+
+mkdir -p $UPLOAD_DIR
+cp llvm-dsymutil.tar.xz $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/build-lucetc.sh b/taskcluster/scripts/misc/build-lucetc.sh
new file mode 100755
index 0000000000..b4a8d17629
--- /dev/null
+++ b/taskcluster/scripts/misc/build-lucetc.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+set -x -e -v
+
+cd $MOZ_FETCHES_DIR/lucet_sandbox_compiler
+
+export PATH=$MOZ_FETCHES_DIR/binutils/bin:$MOZ_FETCHES_DIR/clang/bin:$PATH:$MOZ_FETCHES_DIR/rustc/bin:$MOZ_FETCHES_DIR/cmake/bin
+export CC=$MOZ_FETCHES_DIR/clang/bin/clang
+export CFLAGS="-L$MOZ_FETCHES_DIR/clang/lib"
+export CXXFLAGS=$CFLAGS
+export CXX=$MOZ_FETCHES_DIR/clang/bin/clang++
+export AR=$MOZ_FETCHES_DIR/clang/bin/llvm-ar
+export RUSTFLAGS="-C linker=$CXX -C link-arg=$CXXFLAGS"
+make build
+
+# Put the lucetc binary in a directory called "lucetc", which is where consumers
+# will expect it.
+mkdir -p $UPLOAD_DIR/lucetc
+mv target/release/lucetc $UPLOAD_DIR/lucetc
+tar -C $UPLOAD_DIR --xz -cf $UPLOAD_DIR/lucetc.tar.xz lucetc
+rm -rf $UPLOAD_DIR/lucetc
diff --git a/taskcluster/scripts/misc/build-makecab.sh b/taskcluster/scripts/misc/build-makecab.sh
new file mode 100755
index 0000000000..4d8d2ade3e
--- /dev/null
+++ b/taskcluster/scripts/misc/build-makecab.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# 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/.
+set -x -e -v
+
+export PATH="$MOZ_FETCHES_DIR/rustc/bin:$PATH"
+
+cd $MOZ_FETCHES_DIR/rust-makecab
+
+cargo build --verbose --release
+
+mkdir makecab
+cp target/release/makecab makecab/
+tar -c makecab | $GECKO_PATH/taskcluster/scripts/misc/zstdpy > makecab.tar.zst
+mkdir -p $UPLOAD_DIR
+cp makecab.tar.zst $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/build-mar-tools.sh b/taskcluster/scripts/misc/build-mar-tools.sh
new file mode 100755
index 0000000000..42b4639978
--- /dev/null
+++ b/taskcluster/scripts/misc/build-mar-tools.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for building mar and mbsdiff
+
+COMPRESS_EXT=xz
+
+cd $GECKO_PATH
+
+export MOZ_OBJDIR=obj-mar
+
+echo ac_add_options --enable-project=tools/update-packaging > .mozconfig
+
+TOOLCHAINS="binutils clang"
+
+for t in $TOOLCHAINS; do
+ PATH="$MOZ_FETCHES_DIR/$t/bin:$PATH"
+done
+
+./mach build -v
+
+mkdir mar-tools
+cp $MOZ_OBJDIR/dist/host/bin/{mar,mbsdiff} mar-tools/
+
+tar -acf mar-tools.tar.$COMPRESS_EXT mar-tools/
+mkdir -p $UPLOAD_DIR
+cp mar-tools.tar.$COMPRESS_EXT $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/build-mingw-fxc2-x86.sh b/taskcluster/scripts/misc/build-mingw-fxc2-x86.sh
new file mode 100755
index 0000000000..4cdeb13e02
--- /dev/null
+++ b/taskcluster/scripts/misc/build-mingw-fxc2-x86.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+set -x -e -v
+
+WORKSPACE=$HOME/workspace
+INSTALL_DIR=$WORKSPACE/fxc2
+
+mkdir -p $INSTALL_DIR/bin
+
+export PATH="$MOZ_FETCHES_DIR/clang/bin:$PATH"
+
+# --------------
+
+cd $MOZ_FETCHES_DIR/fxc2
+make -j$(nproc) x86
+
+cp fxc2.exe $INSTALL_DIR/bin/
+cp dll/d3dcompiler_47_32.dll $INSTALL_DIR/bin/d3dcompiler_47.dll
+
+# --------------
+
+cd $WORKSPACE
+tar caf fxc2.tar.xz fxc2
+
+mkdir -p $UPLOAD_DIR
+cp fxc2.tar.* $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/build-mingw32-nsis.sh b/taskcluster/scripts/misc/build-mingw32-nsis.sh
new file mode 100755
index 0000000000..0c6fcca284
--- /dev/null
+++ b/taskcluster/scripts/misc/build-mingw32-nsis.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+set -x -e -v
+
+# We set the INSTALL_DIR to match the directory that it will run in exactly,
+# otherwise we get an NSIS error of the form:
+# checking for NSIS version...
+# DEBUG: Executing: `/home/worker/workspace/build/src/mingw32/
+# DEBUG: The command returned non-zero exit status 1.
+# DEBUG: Its error output was:
+# DEBUG: | Error: opening stub "/home/worker/workspace/mingw32/
+# DEBUG: | Error initalizing CEXEBuild: error setting
+# ERROR: Failed to get nsis version.
+
+INSTALL_DIR=$MOZ_FETCHES_DIR/mingw32
+
+mkdir -p $INSTALL_DIR
+
+cd $MOZ_FETCHES_DIR
+
+# As explained above, we have to build nsis to the directory it
+# will eventually be run from, which is the same place we just
+# installed our compiler. But at the end of the script we want
+# to package up what we just built. If we don't move the compiler,
+# we will package up the compiler we downloaded along with the
+# stuff we just built.
+mv mingw32 mingw32-gcc
+export PATH="$MOZ_FETCHES_DIR/mingw32-gcc/bin:$PATH"
+
+# --------------
+
+cd zlib-1.2.11
+make -f win32/Makefile.gcc PREFIX=i686-w64-mingw32-
+
+cd ../nsis-3.01-src
+patch -p1 < $GECKO_PATH/build/win32/nsis-no-insert-timestamp.patch
+# I don't know how to make the version work with the environment variables/config flags the way the author appears to
+sed -i "s/'VERSION', 'Version of NSIS', cvs_version/'VERSION', 'Version of NSIS', '3.01'/" SConstruct
+scons XGCC_W32_PREFIX=i686-w64-mingw32- ZLIB_W32=../zlib-1.2.11 SKIPUTILS="NSIS Menu" PREFIX=$INSTALL_DIR/ install
+
+# --------------
+
+cd $MOZ_FETCHES_DIR
+
+tar caf nsis.tar.xz mingw32
+
+mkdir -p $UPLOAD_DIR
+cp nsis.tar.* $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/build-minidump-stackwalk.sh b/taskcluster/scripts/misc/build-minidump-stackwalk.sh
new file mode 100755
index 0000000000..277faa37ff
--- /dev/null
+++ b/taskcluster/scripts/misc/build-minidump-stackwalk.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for building minidump_stackwalk
+
+COMPRESS_EXT=xz
+
+cd $GECKO_PATH
+
+if [ -n "$TOOLTOOL_MANIFEST" ]; then
+ . taskcluster/scripts/misc/tooltool-download.sh
+fi
+
+export MOZ_OBJDIR=obj-minidump
+
+echo ac_add_options --enable-project=tools/crashreporter > .mozconfig
+
+MINIDUMP_STACKWALK=minidump_stackwalk
+
+case "$1" in
+macosx64)
+ TOOLCHAINS="cctools rustc clang"
+ echo ac_add_options --target=x86_64-apple-darwin >> .mozconfig
+ echo ac_add_options --with-macos-sdk=$MOZ_FETCHES_DIR/MacOSX10.12.sdk >> .mozconfig
+ ;;
+mingw32)
+ TOOLCHAINS="binutils rustc clang"
+ echo ac_add_options --target=i686-w64-mingw32 >> .mozconfig
+ echo export CC=i686-w64-mingw32-clang >> .mozconfig
+ echo export HOST_CC=clang >> .mozconfig
+ MINIDUMP_STACKWALK=minidump_stackwalk.exe
+ ;;
+*)
+ TOOLCHAINS="binutils rustc clang"
+ ;;
+esac
+
+for t in $TOOLCHAINS; do
+ PATH="$MOZ_FETCHES_DIR/$t/bin:$PATH"
+done
+
+./mach build -v
+
+mkdir minidump_stackwalk
+cp $MOZ_OBJDIR/dist/bin/$MINIDUMP_STACKWALK minidump_stackwalk/
+
+tar -acf minidump_stackwalk.tar.$COMPRESS_EXT minidump_stackwalk/
+mkdir -p $UPLOAD_DIR
+cp minidump_stackwalk.tar.$COMPRESS_EXT $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/build-nasm.sh b/taskcluster/scripts/misc/build-nasm.sh
new file mode 100755
index 0000000000..2c1cd8de57
--- /dev/null
+++ b/taskcluster/scripts/misc/build-nasm.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+set -x -e -v
+
+COMPRESS_EXT=bz2
+
+if [ -n "$TOOLTOOL_MANIFEST" ]; then
+ . $GECKO_PATH/taskcluster/scripts/misc/tooltool-download.sh
+fi
+
+cd $MOZ_FETCHES_DIR/nasm-*
+case "$1" in
+ win64)
+ export PATH="$MOZ_FETCHES_DIR/clang/bin:$PATH"
+ ./configure CC=x86_64-w64-mingw32-clang AR=llvm-ar RANLIB=llvm-ranlib --host=x86_64-w64-mingw32
+ EXE=.exe
+ ;;
+ macosx64)
+ export PATH="$MOZ_FETCHES_DIR/clang/bin:$MOZ_FETCHES_DIR/cctools/bin:$PATH"
+ export LD_LIBRARY_PATH="$MOZ_FETCHES_DIR/clang/lib"
+ ./configure CC="clang --target=x86_64-apple-darwin -isysroot $MOZ_FETCHES_DIR/MacOSX10.12.sdk" --host=x86_64-apple-darwin
+ cat config.log
+ EXE=
+ ;;
+ *)
+ # Fix for .debug_loc section containing garbage on elf32
+ # https://bugzilla.nasm.us/show_bug.cgi?id=3392631
+ patch -p1 <<'EOF'
+diff --git a/output/outelf.c b/output/outelf.c
+index de99d076..47031e12 100644
+--- a/output/outelf.c
++++ b/output/outelf.c
+@@ -3275,7 +3275,7 @@ static void dwarf_generate(void)
+ WRITELONG(pbuf,framelen-4); /* initial length */
+
+ /* build loc section */
+- loclen = 16;
++ loclen = is_elf64() ? 16 : 8;
+ locbuf = pbuf = nasm_malloc(loclen);
+ if (is_elf32()) {
+ WRITELONG(pbuf,0); /* null beginning offset */
+EOF
+ ./configure
+ EXE=
+ ;;
+esac
+make -j$(nproc)
+
+mv nasm$EXE nasm-tmp
+mkdir nasm
+mv nasm-tmp nasm/nasm$EXE
+tar -acf nasm.tar.$COMPRESS_EXT nasm
+mkdir -p "$UPLOAD_DIR"
+cp nasm.tar.$COMPRESS_EXT "$UPLOAD_DIR"
diff --git a/taskcluster/scripts/misc/build-resourcemonitor.sh b/taskcluster/scripts/misc/build-resourcemonitor.sh
new file mode 100755
index 0000000000..f12317012e
--- /dev/null
+++ b/taskcluster/scripts/misc/build-resourcemonitor.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+set -x -e -v
+
+cd "$MOZ_FETCHES_DIR"/resource-monitor/ || exit 1
+COMPRESS_EXT=xz
+
+PATH="$MOZ_FETCHES_DIR/go/bin:$PATH"
+export PATH
+
+EXE_SUFFIX=""
+
+case "$1" in
+ linux64) GOOS=linux; GOARCH=amd64 ;;
+ macos64) GOOS=darwin; GOARCH=amd64 ;;
+ windows64) GOOS=windows; GOARCH=amd64; EXE_SUFFIX=".exe" ;;
+ windows32) GOOS=windows; GOARCH=386; EXE_SUFFIX=".exe" ;;
+ *)
+ echo "Unknown architecture $1 not recognized in build-resourcemonitor.sh" >&2
+ exit 1
+ ;;
+esac
+
+export GOOS
+export GOARCH
+export EXE_SUFFIX
+
+echo "GOOS=$GOOS"
+echo "GOARCH=$GOARCH"
+
+go build .
+
+STAGING_DIR="resource-monitor"
+mv "resource-monitor${EXE_SUFFIX}" resource-monitor.tmp
+mkdir "${STAGING_DIR}"
+
+cp resource-monitor.tmp "${STAGING_DIR}/resource-monitor${EXE_SUFFIX}"
+
+tar -acf "resource-monitor.tar.$COMPRESS_EXT" "${STAGING_DIR}"/
+mkdir -p "$UPLOAD_DIR"
+cp "resource-monitor.tar.$COMPRESS_EXT" "$UPLOAD_DIR"
diff --git a/taskcluster/scripts/misc/build-rust-size.sh b/taskcluster/scripts/misc/build-rust-size.sh
new file mode 100755
index 0000000000..0d4f64bb52
--- /dev/null
+++ b/taskcluster/scripts/misc/build-rust-size.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+set -x -e -v
+
+PROJECT=rust-size
+
+# This script is for building rust-size
+case "$(uname -s)" in
+Linux)
+ COMPRESS_EXT=xz
+ ;;
+MINGW*)
+ UPLOAD_DIR=$PWD/public/build
+ COMPRESS_EXT=bz2
+
+ . $GECKO_PATH/taskcluster/scripts/misc/vs-setup.sh
+ ;;
+esac
+
+cd $GECKO_PATH
+
+if [ -n "$TOOLTOOL_MANIFEST" ]; then
+ . taskcluster/scripts/misc/tooltool-download.sh
+fi
+
+PATH="$(cd $MOZ_FETCHES_DIR && pwd)/rustc/bin:$PATH"
+
+cd $MOZ_FETCHES_DIR/$PROJECT
+
+cargo build --verbose --release
+
+mkdir $PROJECT
+cp target/release/${PROJECT}* ${PROJECT}/
+tar -acf ${PROJECT}.tar.$COMPRESS_EXT $PROJECT
+mkdir -p $UPLOAD_DIR
+cp ${PROJECT}.tar.$COMPRESS_EXT $UPLOAD_DIR
+
+cd ..
+
+. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh
diff --git a/taskcluster/scripts/misc/build-sccache.sh b/taskcluster/scripts/misc/build-sccache.sh
new file mode 100755
index 0000000000..a2df62ac2a
--- /dev/null
+++ b/taskcluster/scripts/misc/build-sccache.sh
@@ -0,0 +1,64 @@
+#!/bin/bash
+set -x -e -v
+
+# Needed by osx-cross-linker.
+export TARGET="$1"
+
+# This script is for building sccache
+
+case "$(uname -s)" in
+Linux)
+ COMPRESS_EXT=xz
+ PATH="$MOZ_FETCHES_DIR/binutils/bin:$PATH"
+ ;;
+MINGW*)
+ UPLOAD_DIR=$PWD/public/build
+ COMPRESS_EXT=bz2
+
+ . $GECKO_PATH/taskcluster/scripts/misc/vs-setup.sh
+ ;;
+esac
+
+cd $GECKO_PATH
+
+if [ -n "$TOOLTOOL_MANIFEST" ]; then
+ . taskcluster/scripts/misc/tooltool-download.sh
+fi
+
+PATH="$(cd $MOZ_FETCHES_DIR && pwd)/rustc/bin:$PATH"
+
+cd $MOZ_FETCHES_DIR/sccache
+
+COMMON_FEATURES="native-zlib"
+
+case "$(uname -s)" in
+Linux)
+ if [ "$TARGET" == "x86_64-apple-darwin" ]; then
+ export PATH="$MOZ_FETCHES_DIR/llvm-dsymutil/bin:$PATH"
+ export PATH="$MOZ_FETCHES_DIR/cctools/bin:$PATH"
+ export RUSTFLAGS="-C linker=$GECKO_PATH/taskcluster/scripts/misc/osx-cross-linker"
+ export CC="$MOZ_FETCHES_DIR/clang/bin/clang"
+ export TARGET_CC="$MOZ_FETCHES_DIR/clang/bin/clang -isysroot $MOZ_FETCHES_DIR/MacOSX10.12.sdk"
+ cargo build --features "all $COMMON_FEATURES" --verbose --release --target $TARGET
+ else
+ cargo build --features "all dist-server openssl/vendored $COMMON_FEATURES" --verbose --release
+ fi
+
+ ;;
+MINGW*)
+ cargo build --verbose --release --features="dist-client s3 gcs $COMMON_FEATURES"
+ ;;
+esac
+
+SCCACHE_OUT=target/release/sccache*
+if [ -n "$TARGET" ]; then
+ SCCACHE_OUT=target/$TARGET/release/sccache*
+fi
+
+mkdir sccache
+cp $SCCACHE_OUT sccache/
+tar -acf sccache.tar.$COMPRESS_EXT sccache
+mkdir -p $UPLOAD_DIR
+cp sccache.tar.$COMPRESS_EXT $UPLOAD_DIR
+
+. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh
diff --git a/taskcluster/scripts/misc/build-upx.sh b/taskcluster/scripts/misc/build-upx.sh
new file mode 100755
index 0000000000..22272926dd
--- /dev/null
+++ b/taskcluster/scripts/misc/build-upx.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+set -x -e -v
+
+WORKSPACE=$HOME/workspace
+INSTALL_DIR=$WORKSPACE/upx
+
+mkdir -p $INSTALL_DIR/bin
+
+cd $WORKSPACE
+
+git clone -n https://github.com/upx/upx.git upx-clone
+cd upx-clone
+# https://github.com/upx/upx/releases/tag/v3.95
+git checkout 7a3637ff5a800b8bcbad20ae7f668d8c8449b014 # Asserts integrity of the clone (right?)
+git submodule update --init --recursive
+cd src
+make -j$(nproc)
+cp upx.out $INSTALL_DIR/bin/upx
+
+# --------------
+
+cd $WORKSPACE
+tar caf upx.tar.xz upx
+
+mkdir -p $UPLOAD_DIR
+cp upx.tar.* $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/build-wasi-sysroot.sh b/taskcluster/scripts/misc/build-wasi-sysroot.sh
new file mode 100755
index 0000000000..db2de5651f
--- /dev/null
+++ b/taskcluster/scripts/misc/build-wasi-sysroot.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+set -x -e -v
+
+export PATH="$MOZ_FETCHES_DIR/gcc/bin:$MOZ_FETCHES_DIR/binutils/bin:$PATH"
+export LD_LIBRARY_PATH="$MOZ_FETCHES_DIR/gcc/lib64/:$LD_LIBRARY_PATH"
+cd $MOZ_FETCHES_DIR/wasi-sdk
+PREFIX=$MOZ_FETCHES_DIR/wasi-sdk/wasi-sysroot
+LLVM_PROJ_DIR=$MOZ_FETCHES_DIR/llvm-project
+make LLVM_PROJ_DIR=$LLVM_PROJ_DIR PREFIX=$PREFIX
+# Put a tarball in the artifacts dir
+mkdir -p $UPLOAD_DIR
+tar -C $MOZ_FETCHES_DIR/wasi-sdk/build/install/$PREFIX/../ -caf $UPLOAD_DIR/wasi-sysroot.tar.xz wasi-sysroot
diff --git a/taskcluster/scripts/misc/build-winchecksec.sh b/taskcluster/scripts/misc/build-winchecksec.sh
new file mode 100755
index 0000000000..5f9d8b0620
--- /dev/null
+++ b/taskcluster/scripts/misc/build-winchecksec.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+set -e -v -x
+
+mkdir -p $UPLOAD_DIR
+
+cd $MOZ_FETCHES_DIR/winchecksec
+
+if test -n "$TOOLTOOL_MANIFEST"; then
+ export PATH="$MOZ_FETCHES_DIR/clang/bin:$PATH"
+
+ export LD_PRELOAD=$MOZ_FETCHES_DIR/liblowercase/liblowercase.so
+ export LOWERCASE_DIRS=$MOZ_FETCHES_DIR/vs2017_15.8.4
+
+ . $GECKO_PATH/taskcluster/scripts/misc/vs-setup.sh
+ . $GECKO_PATH/taskcluster/scripts/misc/tooltool-download.sh
+
+ # Patch pe-parse because clang-cl doesn't support /analyze.
+ patch -p1 <<'EOF'
+--- a/pe-parse/cmake/compilation_flags.cmake
++++ b/pe-parse/cmake/compilation_flags.cmake
+@@ -1,5 +1,5 @@
+ if (MSVC)
+- list(APPEND DEFAULT_CXX_FLAGS /W4 /analyze)
++ list(APPEND DEFAULT_CXX_FLAGS /W4)
+
+ if (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
+ list(APPEND DEFAULT_CXX_FLAGS /Zi)
+EOF
+
+ CMAKE_FLAGS='
+ -DCMAKE_CXX_COMPILER=clang-cl
+ -DCMAKE_C_COMPILER=clang-cl
+ -DCMAKE_LINKER=lld-link
+ -DCMAKE_C_FLAGS=-fuse-ld=lld
+ -DCMAKE_CXX_FLAGS="-fuse-ld=lld -EHsc"
+ -DCMAKE_RC_COMPILER=llvm-rc
+ -DCMAKE_MT=llvm-mt
+ -DCMAKE_SYSTEM_NAME=Windows
+ -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded
+ '
+fi
+
+eval cmake \
+ -GNinja \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DBUILD_SHARED_LIBS=Off \
+ $CMAKE_FLAGS
+
+ninja -v
+
+cd ..
+tar -caf winchecksec.tar.bz2 winchecksec/winchecksec${TOOLTOOL_MANIFEST:+.exe}
+cp winchecksec.tar.bz2 $UPLOAD_DIR/
diff --git a/taskcluster/scripts/misc/build-wine.sh b/taskcluster/scripts/misc/build-wine.sh
new file mode 100755
index 0000000000..f1ebba7553
--- /dev/null
+++ b/taskcluster/scripts/misc/build-wine.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+set -x -e -v
+
+WORKSPACE=$HOME/workspace
+INSTALL_DIR=$WORKSPACE/wine
+
+mkdir -p $INSTALL_DIR
+mkdir -p $WORKSPACE/build/wine
+mkdir -p $WORKSPACE/build/wine64
+
+cd $WORKSPACE/build/wine64
+$MOZ_FETCHES_DIR/wine-5.0/configure --enable-win64 --without-x --without-freetype --prefix=$INSTALL_DIR/
+make -j$(nproc)
+
+cd $WORKSPACE/build/wine
+$MOZ_FETCHES_DIR/wine-5.0/configure --with-wine64=../wine64 --without-x --without-freetype --prefix=$INSTALL_DIR/
+make -j$(nproc)
+make install
+
+cd $WORKSPACE/build/wine64
+make install
+
+# --------------
+
+cd $WORKSPACE/
+tar caf wine.tar.xz wine
+
+mkdir -p $UPLOAD_DIR
+cp wine.tar.* $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/exfiltrate-pdbstr.sh b/taskcluster/scripts/misc/exfiltrate-pdbstr.sh
new file mode 100644
index 0000000000..301de5e363
--- /dev/null
+++ b/taskcluster/scripts/misc/exfiltrate-pdbstr.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+set -x -e -v
+
+# Copy the file that already exists on Windows workers.
+mkdir pdbstr
+cp "c:/Program Files (x86)/Windows Kits/10/Debuggers/$1/srcsrv/pdbstr.exe" pdbstr
+
+tar -jcvf pdbstr.tar.bz2 pdbstr
diff --git a/taskcluster/scripts/misc/fetch-chromium.py b/taskcluster/scripts/misc/fetch-chromium.py
new file mode 100644
index 0000000000..c7eae1df5e
--- /dev/null
+++ b/taskcluster/scripts/misc/fetch-chromium.py
@@ -0,0 +1,234 @@
+#!/usr/bin/python3 -u
+# -*- coding: utf-8 -*-
+
+# 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 downloads the latest chromium build (or a manually
+defined version) for a given platform. It then uploads the build,
+with the revision of the build stored in a REVISION file.
+"""
+
+from __future__ import absolute_import, print_function
+
+import argparse
+import errno
+import os
+import shutil
+import subprocess
+import requests
+import tempfile
+
+
+LAST_CHANGE_URL = (
+ # formatted with platform
+ "https://www.googleapis.com/download/storage/v1/b/"
+ "chromium-browser-snapshots/o/{}%2FLAST_CHANGE?alt=media"
+)
+
+CHROMIUM_BASE_URL = (
+ # formatted with (platform/revision/archive)
+ "https://www.googleapis.com/download/storage/v1/b/"
+ "chromium-browser-snapshots/o/{}%2F{}%2F{}?alt=media"
+)
+
+
+CHROMIUM_INFO = {
+ "linux": {
+ "platform": "Linux_x64",
+ "chromium": "chrome-linux.zip",
+ "result": "chromium-linux.tar.bz2",
+ "chromedriver": "chromedriver_linux64.zip",
+ },
+ "win32": {
+ "platform": "Win",
+ "chromium": "chrome-win.zip",
+ "result": "chromium-win32.tar.bz2",
+ "chromedriver": "chromedriver_win32.zip",
+ },
+ "win64": {
+ "platform": "Win",
+ "chromium": "chrome-win.zip",
+ "result": "chromium-win64.tar.bz2",
+ "chromedriver": "chromedriver_win32.zip",
+ },
+ "mac": {
+ "platform": "Mac",
+ "chromium": "chrome-mac.zip",
+ "result": "chromium-mac.tar.bz2",
+ "chromedriver": "chromedriver_mac64.zip",
+ },
+}
+
+
+def log(msg):
+ print("build-chromium: %s" % msg)
+
+
+def fetch_file(url, filepath):
+ """Download a file from the given url to a given file."""
+ size = 4096
+ r = requests.get(url, stream=True)
+ r.raise_for_status()
+
+ with open(filepath, "wb") as fd:
+ for chunk in r.iter_content(size):
+ fd.write(chunk)
+
+
+def unzip(zippath, target):
+ """Unzips an archive to the target location."""
+ log("Unpacking archive at: %s to: %s" % (zippath, target))
+ unzip_command = ["unzip", "-q", "-o", zippath, "-d", target]
+ subprocess.check_call(unzip_command)
+
+
+def fetch_chromium_revision(platform):
+ """Get the revision of the latest chromium build. """
+ chromium_platform = CHROMIUM_INFO[platform]["platform"]
+ revision_url = LAST_CHANGE_URL.format(chromium_platform)
+
+ log("Getting revision number for latest %s chromium build..." % chromium_platform)
+
+ # Expecting a file with a single number indicating the latest
+ # chromium build with a chromedriver that we can download
+ r = requests.get(revision_url, timeout=30)
+ r.raise_for_status()
+
+ chromium_revision = r.content.decode("utf-8")
+ return chromium_revision.strip()
+
+
+def fetch_chromium_build(platform, revision, zippath):
+ """Download a chromium build for a given revision, or the latest. """
+ if not revision:
+ revision = fetch_chromium_revision(platform)
+
+ download_platform = CHROMIUM_INFO[platform]["platform"]
+ download_url = CHROMIUM_BASE_URL.format(
+ download_platform, revision, CHROMIUM_INFO[platform]["chromium"]
+ )
+
+ log("Downloading %s chromium build revision %s..." % (download_platform, revision))
+
+ fetch_file(download_url, zippath)
+ return revision
+
+
+def fetch_chromedriver(platform, revision, chromium_dir):
+ """Get the chromedriver for the given revision and repackage it."""
+ download_url = CHROMIUM_BASE_URL.format(
+ CHROMIUM_INFO[platform]["platform"],
+ revision,
+ CHROMIUM_INFO[platform]["chromedriver"],
+ )
+
+ tmpzip = os.path.join(tempfile.mkdtemp(), "cd-tmp.zip")
+ log("Downloading chromedriver from %s" % download_url)
+ fetch_file(download_url, tmpzip)
+
+ tmppath = tempfile.mkdtemp()
+ unzip(tmpzip, tmppath)
+
+ # Find the chromedriver then copy it to the chromium directory
+ cd_path = None
+ for dirpath, _, filenames in os.walk(tmppath):
+ for filename in filenames:
+ if filename == "chromedriver" or filename == "chromedriver.exe":
+ cd_path = os.path.join(dirpath, filename)
+ break
+ if cd_path is not None:
+ break
+ if cd_path is None:
+ raise Exception("Could not find chromedriver binary in %s" % tmppath)
+ log("Copying chromedriver from: %s to: %s" % (cd_path, chromium_dir))
+ shutil.copy(cd_path, chromium_dir)
+
+
+def build_chromium_archive(platform, revision=None):
+ """
+ Download and store a chromium build for a given platform.
+
+ Retrieves either the latest version, or uses a pre-defined version if
+ the `--revision` option is given a revision.
+ """
+ upload_dir = os.environ.get("UPLOAD_DIR")
+ if upload_dir:
+ # Create the upload directory if it doesn't exist.
+ try:
+ log("Creating upload directory in %s..." % os.path.abspath(upload_dir))
+ os.makedirs(upload_dir)
+ except OSError as e:
+ if e.errno != errno.EEXIST:
+ raise
+
+ # Make a temporary location for the file
+ tmppath = tempfile.mkdtemp()
+ tmpzip = os.path.join(tmppath, "tmp-chromium.zip")
+
+ revision = fetch_chromium_build(platform, revision, tmpzip)
+
+ # Unpack archive in `tmpzip` to store the revision number and
+ # the chromedriver
+ unzip(tmpzip, tmppath)
+
+ dirs = [
+ d
+ for d in os.listdir(tmppath)
+ if os.path.isdir(os.path.join(tmppath, d)) and d.startswith("chrome-")
+ ]
+
+ if len(dirs) > 1:
+ raise Exception(
+ "Too many directories starting with `chrome-` after extracting."
+ )
+ elif len(dirs) == 0:
+ raise Exception(
+ "Could not find any directories after extraction of chromium zip."
+ )
+
+ chromium_dir = os.path.join(tmppath, dirs[0])
+ revision_file = os.path.join(chromium_dir, ".REVISION")
+ with open(revision_file, "w+") as f:
+ f.write(str(revision))
+
+ # Get and store the chromedriver
+ fetch_chromedriver(platform, revision, chromium_dir)
+
+ tar_file = CHROMIUM_INFO[platform]["result"]
+ tar_command = ["tar", "cjf", tar_file, "-C", tmppath, dirs[0]]
+ log("Added revision to %s file." % revision_file)
+
+ log("Tarring with the command: %s" % str(tar_command))
+ subprocess.check_call(tar_command)
+
+ upload_dir = os.environ.get("UPLOAD_DIR")
+ if upload_dir:
+ # Move the tarball to the output directory for upload.
+ log("Moving %s to the upload directory..." % tar_file)
+ shutil.copy(tar_file, os.path.join(upload_dir, tar_file))
+
+ shutil.rmtree(tmppath)
+
+
+def parse_args():
+ """Read command line arguments and return options."""
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ "--platform", help="Platform version of chromium to build.", required=True
+ )
+ parser.add_argument(
+ "--revision",
+ help="Revision of chromium to build to get. "
+ "(Defaults to the newest chromium build).",
+ default=None,
+ )
+
+ return parser.parse_args()
+
+
+if __name__ == "__main__":
+ args = vars(parse_args())
+ build_chromium_archive(**args)
diff --git a/taskcluster/scripts/misc/fetch-content b/taskcluster/scripts/misc/fetch-content
new file mode 100755
index 0000000000..11c7002592
--- /dev/null
+++ b/taskcluster/scripts/misc/fetch-content
@@ -0,0 +1,733 @@
+#!/usr/bin/python3 -u
+# 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/.
+
+import argparse
+import bz2
+import concurrent.futures
+import contextlib
+import datetime
+import gzip
+import hashlib
+import json
+import lzma
+import multiprocessing
+import os
+import pathlib
+import random
+import stat
+import subprocess
+import sys
+import tarfile
+import tempfile
+import time
+import urllib.parse
+import urllib.request
+import zipfile
+
+try:
+ import zstandard
+except ImportError:
+ zstandard = None
+
+try:
+ import certifi
+except ImportError:
+ certifi = None
+
+
+CONCURRENCY = multiprocessing.cpu_count()
+
+
+def log(msg):
+ print(msg, file=sys.stderr)
+ sys.stderr.flush()
+
+
+class IntegrityError(Exception):
+ """Represents an integrity error when downloading a URL."""
+
+
+def ZstdCompressor(*args, **kwargs):
+ if not zstandard:
+ raise ValueError('zstandard Python package not available')
+ return zstandard.ZstdCompressor(*args, **kwargs)
+
+
+def ZstdDecompressor(*args, **kwargs):
+ if not zstandard:
+ raise ValueError('zstandard Python package not available')
+ return zstandard.ZstdDecompressor(*args, **kwargs)
+
+
+@contextlib.contextmanager
+def rename_after_close(fname, *args, **kwargs):
+ """
+ Context manager that opens a temporary file to use as a writer,
+ and closes the file on context exit, renaming it to the expected
+ file name in case of success, or removing it in case of failure.
+
+ Takes the same options as open(), but must be used as a context
+ manager.
+ """
+ path = pathlib.Path(fname)
+ tmp = path.with_name('%s.tmp' % path.name)
+ try:
+ with tmp.open(*args, **kwargs) as fh:
+ yield fh
+ except Exception:
+ tmp.unlink()
+ raise
+ else:
+ tmp.rename(fname)
+
+
+# The following is copied from
+# https://github.com/mozilla-releng/redo/blob/6d07678a014e0c525e54a860381a165d34db10ff/redo/__init__.py#L15-L85
+def retrier(attempts=5, sleeptime=10, max_sleeptime=300, sleepscale=1.5, jitter=1):
+ """
+ A generator function that sleeps between retries, handles exponential
+ backoff and jitter. The action you are retrying is meant to run after
+ retrier yields.
+
+ At each iteration, we sleep for sleeptime + random.randint(-jitter, jitter).
+ Afterwards sleeptime is multiplied by sleepscale for the next iteration.
+
+ Args:
+ attempts (int): maximum number of times to try; defaults to 5
+ sleeptime (float): how many seconds to sleep between tries; defaults to
+ 60s (one minute)
+ max_sleeptime (float): the longest we'll sleep, in seconds; defaults to
+ 300s (five minutes)
+ sleepscale (float): how much to multiply the sleep time by each
+ iteration; defaults to 1.5
+ jitter (int): random jitter to introduce to sleep time each iteration.
+ the amount is chosen at random between [-jitter, +jitter]
+ defaults to 1
+
+ Yields:
+ None, a maximum of `attempts` number of times
+
+ Example:
+ >>> n = 0
+ >>> for _ in retrier(sleeptime=0, jitter=0):
+ ... if n == 3:
+ ... # We did the thing!
+ ... break
+ ... n += 1
+ >>> n
+ 3
+
+ >>> n = 0
+ >>> for _ in retrier(sleeptime=0, jitter=0):
+ ... if n == 6:
+ ... # We did the thing!
+ ... break
+ ... n += 1
+ ... else:
+ ... print("max tries hit")
+ max tries hit
+ """
+ jitter = jitter or 0 # py35 barfs on the next line if jitter is None
+ if jitter > sleeptime:
+ # To prevent negative sleep times
+ raise Exception('jitter ({}) must be less than sleep time ({})'.format(jitter, sleeptime))
+
+ sleeptime_real = sleeptime
+ for _ in range(attempts):
+ log("attempt %i/%i" % (_ + 1, attempts))
+
+ yield sleeptime_real
+
+ if jitter:
+ sleeptime_real = sleeptime + random.randint(-jitter, jitter)
+ # our jitter should scale along with the sleeptime
+ jitter = int(jitter * sleepscale)
+ else:
+ sleeptime_real = sleeptime
+
+ sleeptime *= sleepscale
+
+ if sleeptime_real > max_sleeptime:
+ sleeptime_real = max_sleeptime
+
+ # Don't need to sleep the last time
+ if _ < attempts - 1:
+ log("sleeping for %.2fs (attempt %i/%i)" % (sleeptime_real, _ + 1, attempts))
+ time.sleep(sleeptime_real)
+
+
+def stream_download(url, sha256=None, size=None):
+ """Download a URL to a generator, optionally with content verification.
+
+ If ``sha256`` or ``size`` are defined, the downloaded URL will be
+ validated against those requirements and ``IntegrityError`` will be
+ raised if expectations do not match.
+
+ Because verification cannot occur until the file is completely downloaded
+ it is recommended for consumers to not do anything meaningful with the
+ data if content verification is being used. To securely handle retrieved
+ content, it should be streamed to a file or memory and only operated
+ on after the generator is exhausted without raising.
+ """
+ log('Downloading %s' % url)
+
+ h = hashlib.sha256()
+ length = 0
+
+ t0 = time.time()
+ with urllib.request.urlopen(url, cafile=certifi.where()) if certifi else urllib.request.urlopen(url) as fh:
+ if not url.endswith('.gz') and fh.info().get('Content-Encoding') == 'gzip':
+ fh = gzip.GzipFile(fileobj=fh)
+
+ while True:
+ chunk = fh.read(65536)
+ if not chunk:
+ break
+
+ h.update(chunk)
+ length += len(chunk)
+
+ yield chunk
+
+ duration = time.time() - t0
+ digest = h.hexdigest()
+
+ log('%s resolved to %d bytes with sha256 %s in %.3fs' % (
+ url, length, digest, duration))
+
+ if size:
+ if size == length:
+ log('Verified size of %s' % url)
+ else:
+ raise IntegrityError('size mismatch on %s: wanted %d; got %d' % (
+ url, size, length))
+
+ if sha256:
+ if digest == sha256:
+ log('Verified sha256 integrity of %s' % url)
+ else:
+ raise IntegrityError('sha256 mismatch on %s: wanted %s; got %s' % (
+ url, sha256, digest))
+
+
+def download_to_path(url, path, sha256=None, size=None):
+ """Download a URL to a filesystem path, possibly with verification."""
+
+ # We download to a temporary file and rename at the end so there's
+ # no chance of the final file being partially written or containing
+ # bad data.
+ try:
+ path.unlink()
+ except FileNotFoundError:
+ pass
+
+ for _ in retrier(attempts=5, sleeptime=60):
+ try:
+ log('Downloading %s to %s' % (url, path))
+
+ with rename_after_close(path, 'wb') as fh:
+ for chunk in stream_download(url, sha256=sha256, size=size):
+ fh.write(chunk)
+
+ return
+ except IntegrityError:
+ raise
+ except Exception as e:
+ log("Download failed: {}".format(e))
+ continue
+
+ raise Exception("Download failed, no more retries!")
+
+
+def download_to_memory(url, sha256=None, size=None):
+ """Download a URL to memory, possibly with verification."""
+
+ data = b""
+ for _ in retrier(attempts=5, sleeptime=60):
+ try:
+ log('Downloading %s' % (url))
+
+ for chunk in stream_download(url, sha256=sha256, size=size):
+ data += chunk
+
+ return data
+ except IntegrityError:
+ raise
+ except Exception as e:
+ log("Download failed: {}".format(e))
+ continue
+
+ raise Exception("Download failed, no more retries!")
+
+
+def gpg_verify_path(path: pathlib.Path, public_key_data: bytes,
+ signature_data: bytes):
+ """Verify that a filesystem path verifies using GPG.
+
+ Takes a Path defining a file to verify. ``public_key_data`` contains
+ bytes with GPG public key data. ``signature_data`` contains a signed
+ GPG document to use with ``gpg --verify``.
+ """
+ log('Validating GPG signature of %s' % path)
+ log('GPG key data:\n%s' % public_key_data.decode('ascii'))
+
+ with tempfile.TemporaryDirectory() as td:
+ try:
+ # --batch since we're running unattended.
+ gpg_args = ['gpg', '--homedir', td, '--batch']
+
+ log('Importing GPG key...')
+ subprocess.run(gpg_args + ['--import'],
+ input=public_key_data,
+ check=True)
+
+ log('Verifying GPG signature...')
+ subprocess.run(gpg_args + ['--verify', '-', '%s' % path],
+ input=signature_data,
+ check=True)
+
+ log('GPG signature verified!')
+ finally:
+ # There is a race between the agent self-terminating and
+ # shutil.rmtree() from the temporary directory cleanup that can
+ # lead to exceptions. Kill the agent before cleanup to prevent this.
+ env = dict(os.environ)
+ env['GNUPGHOME'] = td
+ subprocess.run(['gpgconf', '--kill', 'gpg-agent'], env=env)
+
+
+def open_tar_stream(path: pathlib.Path):
+ """"""
+ if path.suffix == '.bz2':
+ return bz2.open(str(path), 'rb')
+ elif path.suffix == '.gz':
+ return gzip.open(str(path), 'rb')
+ elif path.suffix == '.xz':
+ return lzma.open(str(path), 'rb')
+ elif path.suffix == '.zst':
+ dctx = ZstdDecompressor()
+ return dctx.stream_reader(path.open('rb'))
+ elif path.suffix == '.tar':
+ return path.open('rb')
+ else:
+ raise ValueError('unknown archive format for tar file: %s' % path)
+
+
+def archive_type(path: pathlib.Path):
+ """Attempt to identify a path as an extractable archive."""
+ if path.suffixes[-2:-1] == ['.tar']:
+ return 'tar'
+ elif path.suffix == '.zip':
+ return 'zip'
+ else:
+ return None
+
+
+def extract_archive(path, dest_dir, typ):
+ """Extract an archive to a destination directory."""
+
+ # Resolve paths to absolute variants.
+ path = path.resolve()
+ dest_dir = dest_dir.resolve()
+
+ log('Extracting %s to %s' % (path, dest_dir))
+ t0 = time.time()
+
+ # We pipe input to the decompressor program so that we can apply
+ # custom decompressors that the program may not know about.
+ if typ == 'tar':
+ ifh = open_tar_stream(path)
+ # On Windows, the tar program doesn't support things like symbolic
+ # links, while Windows actually support them. The tarfile module in
+ # python does. So use that. But since it's significantly slower than
+ # the tar program on Linux, only use tarfile on Windows (tarfile is
+ # also not much slower on Windows, presumably because of the
+ # notoriously bad I/O).
+ if sys.platform == 'win32':
+ tar = tarfile.open(fileobj=ifh, mode='r|')
+ tar.extractall(str(dest_dir))
+ args = []
+ else:
+ args = ['tar', 'xf', '-']
+ pipe_stdin = True
+ elif typ == 'zip':
+ # unzip from stdin has wonky behavior. We don't use a pipe for it.
+ ifh = open(os.devnull, 'rb')
+ args = ['unzip', '-o', str(path)]
+ pipe_stdin = False
+ else:
+ raise ValueError('unknown archive format: %s' % path)
+
+ if args:
+ with ifh, subprocess.Popen(args, cwd=str(dest_dir), bufsize=0,
+ stdin=subprocess.PIPE) as p:
+ while True:
+ if not pipe_stdin:
+ break
+
+ chunk = ifh.read(131072)
+ if not chunk:
+ break
+
+ p.stdin.write(chunk)
+
+ if p.returncode:
+ raise Exception('%r exited %d' % (args, p.returncode))
+
+ log('%s extracted in %.3fs' % (path, time.time() - t0))
+
+
+def repack_archive(orig: pathlib.Path, dest: pathlib.Path,
+ strip_components=0, prefix=''):
+ assert orig != dest
+ log('Repacking as %s' % dest)
+ orig_typ = archive_type(orig)
+ typ = archive_type(dest)
+ if not orig_typ:
+ raise Exception('Archive type not supported for %s' % orig.name)
+ if not typ:
+ raise Exception('Archive type not supported for %s' % dest.name)
+
+ if dest.suffixes[-2:] != ['.tar', '.zst']:
+ raise Exception('Only producing .tar.zst archives is supported.')
+
+ if strip_components or prefix:
+ def filter(name):
+ if strip_components:
+ stripped = '/'.join(name.split('/')[strip_components:])
+ if not stripped:
+ raise Exception(
+ 'Stripping %d components would remove files'
+ % strip_components)
+ name = stripped
+ return prefix + name
+ else:
+ filter = None
+
+ with rename_after_close(dest, 'wb') as fh:
+ ctx = ZstdCompressor()
+ if orig_typ == 'zip':
+ assert typ == 'tar'
+ zip = zipfile.ZipFile(orig)
+ # Convert the zip stream to a tar on the fly.
+ with ctx.stream_writer(fh) as compressor, \
+ tarfile.open(fileobj=compressor, mode='w:') as tar:
+ for zipinfo in zip.infolist():
+ if zipinfo.is_dir():
+ continue
+ tarinfo = tarfile.TarInfo()
+ filename = zipinfo.filename
+ tarinfo.name = filter(filename) if filter else filename
+ tarinfo.size = zipinfo.file_size
+ # Zip files don't have any knowledge of the timezone
+ # they were created in. Which is not really convenient to
+ # reliably convert to a timestamp. But we don't really
+ # care about accuracy, but rather about reproducibility,
+ # so we pick UTC.
+ time = datetime.datetime(
+ *zipinfo.date_time, tzinfo=datetime.timezone.utc)
+ tarinfo.mtime = time.timestamp()
+ # 0 is MS-DOS, 3 is UNIX. Only in the latter case do we
+ # get anything useful for the tar file mode.
+ if zipinfo.create_system == 3:
+ mode = zipinfo.external_attr >> 16
+ else:
+ mode = 0o0644
+ tarinfo.mode = stat.S_IMODE(mode)
+ if stat.S_ISLNK(mode):
+ tarinfo.type = tarfile.SYMTYPE
+ tarinfo.linkname = zip.read(filename).decode()
+ tar.addfile(tarinfo, zip.open(filename))
+ elif stat.S_ISREG(mode) or stat.S_IFMT(mode) == 0:
+ tar.addfile(tarinfo, zip.open(filename))
+ else:
+ raise Exception('Unsupported file mode %o'
+ % stat.S_IFMT(mode))
+
+ elif orig_typ == 'tar':
+ if typ == 'zip':
+ raise Exception('Repacking a tar to zip is not supported')
+ assert typ == 'tar'
+
+ ifh = open_tar_stream(orig)
+ if filter:
+ # To apply the filter, we need to open the tar stream and
+ # tweak it.
+ origtar = tarfile.open(fileobj=ifh, mode='r|')
+ with ctx.stream_writer(fh) as compressor, \
+ tarfile.open(fileobj=compressor, mode='w:') as tar:
+ for tarinfo in origtar:
+ if tarinfo.isdir():
+ continue
+ tarinfo.name = filter(tarinfo.name)
+ tar.addfile(tarinfo, origtar.extractfile(tarinfo))
+ else:
+ # We only change compression here. The tar stream is unchanged.
+ ctx.copy_stream(ifh, fh)
+
+
+def fetch_and_extract(url, dest_dir, extract=True, sha256=None, size=None):
+ """Fetch a URL and extract it to a destination path.
+
+ If the downloaded URL is an archive, it is extracted automatically
+ and the archive is deleted. Otherwise the file remains in place in
+ the destination directory.
+ """
+
+ basename = urllib.parse.urlparse(url).path.split('/')[-1]
+ dest_path = dest_dir / basename
+
+ download_to_path(url, dest_path, sha256=sha256, size=size)
+
+ if not extract:
+ return
+
+ typ = archive_type(dest_path)
+ if typ:
+ extract_archive(dest_path, dest_dir, typ)
+ log('Removing %s' % dest_path)
+ dest_path.unlink()
+
+
+def fetch_urls(downloads):
+ """Fetch URLs pairs to a pathlib.Path."""
+ with concurrent.futures.ThreadPoolExecutor(CONCURRENCY) as e:
+ fs = []
+
+ for download in downloads:
+ fs.append(e.submit(fetch_and_extract, *download))
+
+ for f in fs:
+ f.result()
+
+
+def git_checkout_archive(dest_path: pathlib.Path, repo: str, commit: str,
+ prefix=None, ssh_key=None):
+ """Produce an archive of the files comprising a Git checkout."""
+ dest_path.parent.mkdir(parents=True, exist_ok=True)
+
+ if dest_path.suffixes[-2:] != ['.tar', '.zst']:
+ raise Exception('Only producing .tar.zst archives is supported.')
+
+ with tempfile.TemporaryDirectory() as td:
+ temp_dir = pathlib.Path(td)
+
+ if not prefix:
+ prefix = repo.rstrip('/').rsplit('/', 1)[-1]
+ git_dir = temp_dir / prefix
+
+ # This could be faster with a shallow clone. However, Git requires a ref
+ # to initiate a clone. Since the commit-ish may not refer to a ref, we
+ # simply perform a full clone followed by a checkout.
+ print('cloning %s to %s' % (repo, git_dir))
+
+ env = os.environ.copy()
+ keypath = ""
+ if ssh_key:
+ taskcluster_secret_url = api(os.environ.get('TASKCLUSTER_PROXY_URL'), "secrets", "v1", "secret/{keypath}".format(keypath=ssh_key))
+ taskcluster_secret = b''.join(stream_download(taskcluster_secret_url))
+ taskcluster_secret = json.loads(taskcluster_secret)
+ sshkey = taskcluster_secret['secret']['ssh_privkey']
+
+ keypath = temp_dir.joinpath("ssh-key")
+ keypath.write_text(sshkey)
+ keypath.chmod(0o600)
+
+ env = {"GIT_SSH_COMMAND": "ssh -o 'StrictHostKeyChecking no' -i {keypath}".format(keypath=keypath)}
+
+ subprocess.run(['git', 'clone', '-n', repo, str(git_dir)],
+ check=True, env=env)
+
+ subprocess.run(['git', 'checkout', commit],
+ cwd=str(git_dir), check=True)
+
+ subprocess.run(['git', 'submodule', 'update', '--init'],
+ cwd=str(git_dir), check=True)
+
+ if keypath:
+ os.remove(keypath)
+
+ print('creating archive %s of commit %s' % (dest_path, commit))
+ proc = subprocess.Popen([
+ 'tar', 'cf', '-', '--exclude=.git', '-C', str(temp_dir), prefix,
+ ], stdout=subprocess.PIPE)
+
+ with rename_after_close(dest_path, 'wb') as out:
+ ctx = ZstdCompressor()
+ ctx.copy_stream(proc.stdout, out)
+
+ proc.wait()
+
+
+def command_git_checkout_archive(args):
+ dest = pathlib.Path(args.dest)
+
+ try:
+ git_checkout_archive(dest, args.repo, args.commit,
+ prefix=args.path_prefix, ssh_key=args.ssh_key_secret)
+ except Exception:
+ try:
+ dest.unlink()
+ except FileNotFoundError:
+ pass
+
+ raise
+
+
+def command_static_url(args):
+ gpg_sig_url = args.gpg_sig_url
+ gpg_env_key = args.gpg_key_env
+
+ if bool(gpg_sig_url) != bool(gpg_env_key):
+ print('--gpg-sig-url and --gpg-key-env must both be defined')
+ return 1
+
+ if gpg_sig_url:
+ gpg_signature = b''.join(stream_download(gpg_sig_url))
+ gpg_key = os.environb[gpg_env_key.encode('ascii')]
+
+ dest = pathlib.Path(args.dest)
+ dest.parent.mkdir(parents=True, exist_ok=True)
+
+ basename = urllib.parse.urlparse(args.url).path.split('/')[-1]
+ if basename.endswith(''.join(dest.suffixes)):
+ dl_dest = dest
+ else:
+ dl_dest = dest.parent / basename
+
+ try:
+ download_to_path(args.url, dl_dest, sha256=args.sha256, size=args.size)
+
+ if gpg_sig_url:
+ gpg_verify_path(dl_dest, gpg_key, gpg_signature)
+
+ if dl_dest != dest or args.strip_components or args.add_prefix:
+ repack_archive(dl_dest, dest, args.strip_components, args.add_prefix)
+ except Exception:
+ try:
+ dl_dest.unlink()
+ except FileNotFoundError:
+ pass
+
+ raise
+
+ if dl_dest != dest:
+ log('Removing %s' % dl_dest)
+ dl_dest.unlink()
+
+
+def api(root_url, service, version, path):
+ # taskcluster-lib-urls is not available when this script runs, so
+ # simulate its behavior:
+ return '{root_url}/api/{service}/{version}/{path}'.format(
+ root_url=root_url, service=service, version=version, path=path)
+
+
+def get_hash(fetch, root_url):
+ path = 'task/{task}/artifacts/{artifact}'.format(
+ task=fetch['task'], artifact='public/chain-of-trust.json')
+ url = api(root_url, 'queue', 'v1', path)
+ cot = json.loads(download_to_memory(url))
+ return cot['artifacts'][fetch['artifact']]['sha256']
+
+
+def command_task_artifacts(args):
+ start = time.monotonic()
+ fetches = json.loads(os.environ['MOZ_FETCHES'])
+ downloads = []
+ for fetch in fetches:
+ extdir = pathlib.Path(args.dest)
+ if 'dest' in fetch:
+ # Note: normpath doesn't like pathlib.Path in python 3.5
+ extdir = pathlib.Path(os.path.normpath(str(extdir.joinpath(fetch['dest']))))
+ extdir.mkdir(parents=True, exist_ok=True)
+ root_url = os.environ['TASKCLUSTER_ROOT_URL']
+ sha256 = None
+ if fetch.get('verify-hash'):
+ sha256 = get_hash(fetch, root_url)
+ if fetch['artifact'].startswith('public/'):
+ path = 'task/{task}/artifacts/{artifact}'.format(
+ task=fetch['task'], artifact=fetch['artifact'])
+ url = api(root_url, 'queue', 'v1', path)
+ else:
+ url = ('{proxy_url}/api/queue/v1/task/{task}/artifacts/{artifact}').format(
+ proxy_url=os.environ['TASKCLUSTER_PROXY_URL'],
+ task=fetch['task'],
+ artifact=fetch['artifact'])
+ downloads.append((url, extdir, fetch['extract'], sha256))
+
+ fetch_urls(downloads)
+ end = time.monotonic()
+
+ perfherder_data = {
+ 'framework': {'name': 'build_metrics'},
+ 'suites': [{
+ 'name': 'fetch_content',
+ 'value': end - start,
+ 'lowerIsBetter': True,
+ 'shouldAlert': False,
+ 'subtests': [],
+ }],
+ }
+ print('PERFHERDER_DATA: {}'.format(json.dumps(perfherder_data)), file=sys.stderr)
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ subparsers = parser.add_subparsers(title='sub commands')
+
+ git_checkout = subparsers.add_parser(
+ 'git-checkout-archive',
+ help='Obtain an archive of files from a Git repository checkout')
+ git_checkout.set_defaults(func=command_git_checkout_archive)
+ git_checkout.add_argument('--path-prefix',
+ help='Prefix for paths in produced archive')
+ git_checkout.add_argument('repo',
+ help='URL to Git repository to be cloned')
+ git_checkout.add_argument('commit',
+ help='Git commit to check out')
+ git_checkout.add_argument('dest',
+ help='Destination path of archive')
+ git_checkout.add_argument('--ssh-key-secret',
+ help='The scope path of the ssh key to used for checkout')
+
+ url = subparsers.add_parser('static-url', help='Download a static URL')
+ url.set_defaults(func=command_static_url)
+ url.add_argument('--sha256', required=True,
+ help='SHA-256 of downloaded content')
+ url.add_argument('--size', required=True, type=int,
+ help='Size of downloaded content, in bytes')
+ url.add_argument('--gpg-sig-url',
+ help='URL containing signed GPG document validating '
+ 'URL to fetch')
+ url.add_argument('--gpg-key-env',
+ help='Environment variable containing GPG key to validate')
+ url.add_argument('--strip-components', type=int, default=0,
+ help='Number of leading components to strip from file '
+ 'names in the downloaded archive')
+ url.add_argument('--add-prefix', default='',
+ help='Prefix to add to file names in the downloaded '
+ 'archive')
+ url.add_argument('url', help='URL to fetch')
+ url.add_argument('dest', help='Destination path')
+
+ artifacts = subparsers.add_parser('task-artifacts',
+ help='Fetch task artifacts')
+ artifacts.set_defaults(func=command_task_artifacts)
+ artifacts.add_argument('-d', '--dest', default=os.environ.get('MOZ_FETCHES_DIR'),
+ help='Destination directory which will contain all '
+ 'artifacts (defaults to $MOZ_FETCHES_DIR)')
+
+ args = parser.parse_args()
+
+ if not args.dest:
+ parser.error('no destination directory specified, either pass in --dest '
+ 'or set $MOZ_FETCHES_DIR')
+
+ return args.func(args)
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/taskcluster/scripts/misc/generate-codeql-db-cpp.sh b/taskcluster/scripts/misc/generate-codeql-db-cpp.sh
new file mode 100755
index 0000000000..57d72fd426
--- /dev/null
+++ b/taskcluster/scripts/misc/generate-codeql-db-cpp.sh
@@ -0,0 +1,19 @@
+#! /bin/bash -vex
+
+set -x -e
+
+####
+# Wrapper for building the CodeQL database with the build-linux script
+####
+
+cd /builds/worker
+
+$MOZ_FETCHES_DIR/codeql/codeql database create \
+ --language=cpp \
+ -J=-Xmx32768M \
+ --command="${GECKO_PATH}/taskcluster/scripts/builder/build-linux.sh" \
+ codeql-database
+
+# TODO Switch this to zst per 1637381 when this is used for static analysis jobs
+tar cf codeql-db-cpp.tar codeql-database
+xz codeql-db-cpp.tar
diff --git a/taskcluster/scripts/misc/generate-codeql-db-javascript.sh b/taskcluster/scripts/misc/generate-codeql-db-javascript.sh
new file mode 100755
index 0000000000..329a472140
--- /dev/null
+++ b/taskcluster/scripts/misc/generate-codeql-db-javascript.sh
@@ -0,0 +1,17 @@
+#! /bin/bash -vex
+
+set -x -e
+
+export PATH=$MOZ_FETCHES_DIR/node/bin:$PATH
+
+cd /builds/worker
+
+$MOZ_FETCHES_DIR/codeql/codeql database create \
+ --language=javascript \
+ -J=-Xmx32768M \
+ --source-root=$GECKO_PATH \
+ codeql-database
+
+# TODO Switch this to zst per 1637381 when this is used for static analysis jobs
+tar cf codeql-db-javascript.tar codeql-database
+xz codeql-db-javascript.tar
diff --git a/taskcluster/scripts/misc/mingw-dwrite_3.patch b/taskcluster/scripts/misc/mingw-dwrite_3.patch
new file mode 100644
index 0000000000..7c7b8c968a
--- /dev/null
+++ b/taskcluster/scripts/misc/mingw-dwrite_3.patch
@@ -0,0 +1,84 @@
+From 86f4e9cbb5d3099179dc51332970d61d394116f6 Mon Sep 17 00:00:00 2001
+From: Sanketh Menda <me@snkth.com>
+Date: Sat, 17 Oct 2020 15:39:42 -0400
+Subject: [PATCH] dwrite_3.h: rename GetGlyphImageFormats_ to
+ GetGlyphImageFormats
+
+Wine's WIDL currently doesn't support overloading functions, so till
+that is fixed patch dwrite_3.h to rename GlyphImageFormats_ to
+GetGlyphImageFormats.
+---
+ mingw-w64-headers/include/dwrite_3.h | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+diff --git a/mingw-w64-headers/include/dwrite_3.h b/mingw-w64-headers/include/dwrite_3.h
+index 427c39e3b..dd894a8b1 100644
+--- a/mingw-w64-headers/include/dwrite_3.h
++++ b/mingw-w64-headers/include/dwrite_3.h
+@@ -8168,7 +8168,7 @@ DEFINE_GUID(IID_IDWriteFontFace4, 0x27f2a904, 0x4eb8, 0x441d, 0x96,0x78, 0x05,0x
+ MIDL_INTERFACE("27f2a904-4eb8-441d-9678-0563f53e3e2f")
+ IDWriteFontFace4 : public IDWriteFontFace3
+ {
+- virtual HRESULT STDMETHODCALLTYPE GetGlyphImageFormats_(
++ virtual HRESULT STDMETHODCALLTYPE GetGlyphImageFormats(
+ UINT16 glyph,
+ UINT32 ppem_first,
+ UINT32 ppem_last,
+@@ -8468,7 +8468,7 @@ typedef struct IDWriteFontFace4Vtbl {
+ WINBOOL *are_local);
+
+ /*** IDWriteFontFace4 methods ***/
+- HRESULT (STDMETHODCALLTYPE *GetGlyphImageFormats_)(
++ HRESULT (STDMETHODCALLTYPE *GetGlyphImageFormats)(
+ IDWriteFontFace4 *This,
+ UINT16 glyph,
+ UINT32 ppem_first,
+@@ -8549,7 +8549,7 @@ interface IDWriteFontFace4 {
+ #define IDWriteFontFace4_AreCharactersLocal(This,characters,count,enqueue_if_not,are_local) (This)->lpVtbl->AreCharactersLocal(This,characters,count,enqueue_if_not,are_local)
+ #define IDWriteFontFace4_AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local) (This)->lpVtbl->AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local)
+ /*** IDWriteFontFace4 methods ***/
+-#define IDWriteFontFace4_GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats) (This)->lpVtbl->GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats)
++#define IDWriteFontFace4_GetGlyphImageFormats(This,glyph,ppem_first,ppem_last,formats) (This)->lpVtbl->GetGlyphImageFormats(This,glyph,ppem_first,ppem_last,formats)
+ #define IDWriteFontFace4_GetGlyphImageFormats(This) (This)->lpVtbl->GetGlyphImageFormats(This)
+ #define IDWriteFontFace4_GetGlyphImageData(This,glyph,ppem,format,data,context) (This)->lpVtbl->GetGlyphImageData(This,glyph,ppem,format,data,context)
+ #define IDWriteFontFace4_ReleaseGlyphImageData(This,context) (This)->lpVtbl->ReleaseGlyphImageData(This,context)
+@@ -8692,8 +8692,8 @@ static FORCEINLINE HRESULT IDWriteFontFace4_AreGlyphsLocal(IDWriteFontFace4* Thi
+ return This->lpVtbl->AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local);
+ }
+ /*** IDWriteFontFace4 methods ***/
+-static FORCEINLINE HRESULT IDWriteFontFace4_GetGlyphImageFormats_(IDWriteFontFace4* This,UINT16 glyph,UINT32 ppem_first,UINT32 ppem_last,DWRITE_GLYPH_IMAGE_FORMATS *formats) {
+- return This->lpVtbl->GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats);
++static FORCEINLINE HRESULT IDWriteFontFace4_GetGlyphImageFormats(IDWriteFontFace4* This,UINT16 glyph,UINT32 ppem_first,UINT32 ppem_last,DWRITE_GLYPH_IMAGE_FORMATS *formats) {
++ return This->lpVtbl->GetGlyphImageFormats(This,glyph,ppem_first,ppem_last,formats);
+ }
+ static FORCEINLINE DWRITE_GLYPH_IMAGE_FORMATS IDWriteFontFace4_GetGlyphImageFormats(IDWriteFontFace4* This) {
+ return This->lpVtbl->GetGlyphImageFormats(This);
+@@ -9020,7 +9020,7 @@ typedef struct IDWriteFontFace5Vtbl {
+ WINBOOL *are_local);
+
+ /*** IDWriteFontFace4 methods ***/
+- HRESULT (STDMETHODCALLTYPE *GetGlyphImageFormats_)(
++ HRESULT (STDMETHODCALLTYPE *GetGlyphImageFormats)(
+ IDWriteFontFace5 *This,
+ UINT16 glyph,
+ UINT32 ppem_first,
+@@ -9121,7 +9121,7 @@ interface IDWriteFontFace5 {
+ #define IDWriteFontFace5_AreCharactersLocal(This,characters,count,enqueue_if_not,are_local) (This)->lpVtbl->AreCharactersLocal(This,characters,count,enqueue_if_not,are_local)
+ #define IDWriteFontFace5_AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local) (This)->lpVtbl->AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local)
+ /*** IDWriteFontFace4 methods ***/
+-#define IDWriteFontFace5_GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats) (This)->lpVtbl->GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats)
++#define IDWriteFontFace5_GetGlyphImageFormats(This,glyph,ppem_first,ppem_last,formats) (This)->lpVtbl->GetGlyphImageFormats(This,glyph,ppem_first,ppem_last,formats)
+ #define IDWriteFontFace5_GetGlyphImageFormats(This) (This)->lpVtbl->GetGlyphImageFormats(This)
+ #define IDWriteFontFace5_GetGlyphImageData(This,glyph,ppem,format,data,context) (This)->lpVtbl->GetGlyphImageData(This,glyph,ppem,format,data,context)
+ #define IDWriteFontFace5_ReleaseGlyphImageData(This,context) (This)->lpVtbl->ReleaseGlyphImageData(This,context)
+@@ -9270,8 +9270,8 @@ static FORCEINLINE HRESULT IDWriteFontFace5_AreGlyphsLocal(IDWriteFontFace5* Thi
+ return This->lpVtbl->AreGlyphsLocal(This,glyphs,count,enqueue_if_not,are_local);
+ }
+ /*** IDWriteFontFace4 methods ***/
+-static FORCEINLINE HRESULT IDWriteFontFace5_GetGlyphImageFormats_(IDWriteFontFace5* This,UINT16 glyph,UINT32 ppem_first,UINT32 ppem_last,DWRITE_GLYPH_IMAGE_FORMATS *formats) {
+- return This->lpVtbl->GetGlyphImageFormats_(This,glyph,ppem_first,ppem_last,formats);
++static FORCEINLINE HRESULT IDWriteFontFace5_GetGlyphImageFormats(IDWriteFontFace5* This,UINT16 glyph,UINT32 ppem_first,UINT32 ppem_last,DWRITE_GLYPH_IMAGE_FORMATS *formats) {
++ return This->lpVtbl->GetGlyphImageFormats(This,glyph,ppem_first,ppem_last,formats);
+ }
+ static FORCEINLINE DWRITE_GLYPH_IMAGE_FORMATS IDWriteFontFace5_GetGlyphImageFormats(IDWriteFontFace5* This) {
+ return This->lpVtbl->GetGlyphImageFormats(This);
diff --git a/taskcluster/scripts/misc/mingw-winrt.patch b/taskcluster/scripts/misc/mingw-winrt.patch
new file mode 100644
index 0000000000..e7124e156b
--- /dev/null
+++ b/taskcluster/scripts/misc/mingw-winrt.patch
@@ -0,0 +1,5525 @@
+commit 07fff0900d668fbd75e0ac0a6382a86d486cee88
+Author: Jacek Caban <jacek@codeweavers.com>
+Date: Sun Mar 24 21:20:55 2019 +0100
+
+ winrt headers
+
+diff --git a/mingw-w64-headers/include/intsafe.h b/mingw-w64-headers/include/intsafe.h
+index 701d4cef..daaedb83 100644
+--- a/mingw-w64-headers/include/intsafe.h
++++ b/mingw-w64-headers/include/intsafe.h
+@@ -411,5 +411,8 @@ __MINGW_INTSAFE_API __MINGW_INTSAFE_MATH(ULongLongMult, ULONGLONG, mul)
+ __MINGW_INTSAFE_API __MINGW_INTSAFE_MATH(LongLongMult, LONGLONG, mul)
+
+ #endif /* __GNUC__ >= 5 */
++
++#define SizeTToUInt32 UIntPtrToUInt
++
+ #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
+ #endif /* _INTSAFE_H_INCLUDED_ */
+diff --git a/mingw-w64-headers/include/windows.foundation.h b/mingw-w64-headers/include/windows.foundation.h
+index 6c4d3ec8..59797984 100644
+--- a/mingw-w64-headers/include/windows.foundation.h
++++ b/mingw-w64-headers/include/windows.foundation.h
+@@ -1,11 +1,12 @@
+-/*** Autogenerated by WIDL 1.5.31 from include/windows.foundation.idl - Do not edit ***/
++/*** Autogenerated by WIDL 4.4 from windows.foundation.idl - Do not edit ***/
+
++#ifdef _WIN32
+ #ifndef __REQUIRED_RPCNDR_H_VERSION__
+ #define __REQUIRED_RPCNDR_H_VERSION__ 475
+ #endif
+-
+ #include <rpc.h>
+ #include <rpcndr.h>
++#endif
+
+ #ifndef COM_NO_WINDOWS_H
+ #include <windows.h>
+@@ -17,24 +18,18 @@
+
+ /* Forward declarations */
+
+-#ifndef __IAsyncInfo_FWD_DEFINED__
+-#define __IAsyncInfo_FWD_DEFINED__
+-typedef interface IAsyncInfo IAsyncInfo;
+-#endif
+-
+-#ifndef __IASyncAction_FWD_DEFINED__
+-#define __IASyncAction_FWD_DEFINED__
+-typedef interface IASyncAction IASyncAction;
+-#endif
+-
+-#ifndef __AsyncActionCompletedHandler_FWD_DEFINED__
+-#define __AsyncActionCompletedHandler_FWD_DEFINED__
+-typedef interface AsyncActionCompletedHandler AsyncActionCompletedHandler;
+-#endif
+-
+-#ifndef __IAsyncOperation_FWD_DEFINED__
+-#define __IAsyncOperation_FWD_DEFINED__
+-typedef interface IAsyncOperation IAsyncOperation;
++#ifndef ____x_ABI_CWindows_CFoundation_CIStringable_FWD_DEFINED__
++#define ____x_ABI_CWindows_CFoundation_CIStringable_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CFoundation_CIStringable __x_ABI_CWindows_CFoundation_CIStringable;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ interface IStringable;
++ }
++ }
++}
++#endif /* __cplusplus */
+ #endif
+
+ /* Headers for imported files */
+@@ -45,667 +40,331 @@ typedef interface IAsyncOperation IAsyncOperation;
+ extern "C" {
+ #endif
+
+-#ifndef __IAsyncInfo_FWD_DEFINED__
+-#define __IAsyncInfo_FWD_DEFINED__
+-typedef interface IAsyncInfo IAsyncInfo;
+-#endif
+-
+-#ifndef __IAsyncAction_FWD_DEFINED__
+-#define __IAsyncAction_FWD_DEFINED__
+-typedef interface IAsyncAction IAsyncAction;
+-#endif
+-
+-#ifndef __IAsyncOperation_FWD_DEFINED__
+-#define __IAsyncOperation_FWD_DEFINED__
+-typedef interface IAsyncOperation IAsyncOperation;
+-#endif
+-
+-#ifndef __AsyncActionCompletedHandler_FWD_DEFINED__
+-#define __AsyncActionCompletedHandler_FWD_DEFINED__
+-typedef interface AsyncActionCompletedHandler AsyncActionCompletedHandler;
+-#endif
+-
+-#ifndef __TypedEventHandler_FWD_DEFINED__
+-#define __TypedEventHandler_FWD_DEFINED__
+-typedef interface TypedEventHandler TypedEventHandler;
+-#endif
+-
+-struct DateTime;
+-
+-struct EventRegistrationToken;
+-
+-#ifndef __IVectorView_FWD_DEFINED__
+-#define __IVectorView_FWD_DEFINED__
+-typedef interface IVectorView IVectorView;
+-#endif
+-
+-#ifndef __IPropertySet_FWD_DEFINED__
+-#define __IPropertySet_FWD_DEFINED__
+-typedef interface IPropertySet IPropertySet;
+-#endif
+-
+-typedef enum AsyncStatus {
+- Started = 0,
+- Completed = 1,
+- Canceled = 2,
+- Error = 3
+-} AsyncStatus;
+-typedef struct DateTime {
+- UINT64 UniversalTime;
+-} DateTime;
+-typedef struct EventRegistrationToken {
+- UINT64 Value;
+-} EventRegistrationToken;
+-/*****************************************************************************
+- * IAsyncInfo interface
+- */
+-#ifndef __IAsyncInfo_INTERFACE_DEFINED__
+-#define __IAsyncInfo_INTERFACE_DEFINED__
+-
+-DEFINE_GUID(IID_IAsyncInfo, 0x00000036, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
+-#if defined(__cplusplus) && !defined(CINTERFACE)
+-MIDL_INTERFACE("00000036-0000-0000-c000-000000000046")
+-IAsyncInfo : public IInspectable
+-{
+- virtual HRESULT STDMETHODCALLTYPE get_Id(
+- unsigned int *id) = 0;
+-
+- virtual HRESULT STDMETHODCALLTYPE get_Status(
+- AsyncStatus *status) = 0;
+-
+- virtual HRESULT STDMETHODCALLTYPE get_ErrorCode(
+- HRESULT *errorCode) = 0;
+-
+- virtual HRESULT STDMETHODCALLTYPE Cancel(
+- ) = 0;
+-
+- virtual HRESULT STDMETHODCALLTYPE Close(
+- ) = 0;
+-
+-};
+-#ifdef __CRT_UUID_DECL
+-__CRT_UUID_DECL(IAsyncInfo, 0x00000036, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
+-#endif
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ enum PropertyType {
++ PropertyType_Empty = 0,
++ PropertyType_UInt8 = 1,
++ PropertyType_Int16 = 2,
++ PropertyType_UInt16 = 3,
++ PropertyType_Int32 = 4,
++ PropertyType_UInt32 = 5,
++ PropertyType_Int64 = 6,
++ PropertyType_UInt64 = 7,
++ PropertyType_Single = 8,
++ PropertyType_Double = 9,
++ PropertyType_Char16 = 10,
++ PropertyType_Boolean = 11,
++ PropertyType_String = 12,
++ PropertyType_Inspectable = 13,
++ PropertyType_DateTime = 14,
++ PropertyType_TimeSpan = 15,
++ PropertyType_Guid = 16,
++ PropertyType_Point = 17,
++ PropertyType_Size = 18,
++ PropertyType_Rect = 19,
++ PropertyType_OtherType = 20,
++ PropertyType_UInt8Array = 1025,
++ PropertyType_Int16Array = 1026,
++ PropertyType_UInt16Array = 1027,
++ PropertyType_Int32Array = 1028,
++ PropertyType_UInt32Array = 1029,
++ PropertyType_Int64Array = 1030,
++ PropertyType_UInt64Array = 1031,
++ PropertyType_SingleArray = 1032,
++ PropertyType_DoubleArray = 1033,
++ PropertyType_Char16Array = 1034,
++ PropertyType_BooleanArray = 1035,
++ PropertyType_StringArray = 1036,
++ PropertyType_InspectableArray = 1037,
++ PropertyType_DateTimeArray = 1038,
++ PropertyType_TimeSpanArray = 1039,
++ PropertyType_GuidArray = 1040,
++ PropertyType_PointArray = 1041,
++ PropertyType_SizeArray = 1042,
++ PropertyType_RectArray = 1043,
++ PropertyType_OtherTypeArray = 1044
++ };
++ }
++ }
++}
++extern "C" {
+ #else
+-typedef struct IAsyncInfoVtbl {
+- BEGIN_INTERFACE
+-
+- /*** IUnknown methods ***/
+- HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+- IAsyncInfo* This,
+- REFIID riid,
+- void **ppvObject);
+-
+- ULONG (STDMETHODCALLTYPE *AddRef)(
+- IAsyncInfo* This);
+-
+- ULONG (STDMETHODCALLTYPE *Release)(
+- IAsyncInfo* This);
+-
+- /*** IInspectable methods ***/
+- HRESULT (STDMETHODCALLTYPE *GetIids)(
+- IAsyncInfo* This,
+- ULONG *iidCount,
+- IID **iids);
+-
+- HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+- IAsyncInfo* This,
+- HSTRING *className);
+-
+- HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+- IAsyncInfo* This,
+- TrustLevel *trustLevel);
+-
+- /*** IAsyncInfo methods ***/
+- HRESULT (STDMETHODCALLTYPE *get_Id)(
+- IAsyncInfo* This,
+- unsigned int *id);
+-
+- HRESULT (STDMETHODCALLTYPE *get_Status)(
+- IAsyncInfo* This,
+- AsyncStatus *status);
+-
+- HRESULT (STDMETHODCALLTYPE *get_ErrorCode)(
+- IAsyncInfo* This,
+- HRESULT *errorCode);
+-
+- HRESULT (STDMETHODCALLTYPE *Cancel)(
+- IAsyncInfo* This);
+-
+- HRESULT (STDMETHODCALLTYPE *Close)(
+- IAsyncInfo* This);
+-
+- END_INTERFACE
+-} IAsyncInfoVtbl;
+-interface IAsyncInfo {
+- CONST_VTBL IAsyncInfoVtbl* lpVtbl;
++enum __x_ABI_CWindows_CFoundation_CPropertyType {
++ PropertyType_Empty = 0,
++ PropertyType_UInt8 = 1,
++ PropertyType_Int16 = 2,
++ PropertyType_UInt16 = 3,
++ PropertyType_Int32 = 4,
++ PropertyType_UInt32 = 5,
++ PropertyType_Int64 = 6,
++ PropertyType_UInt64 = 7,
++ PropertyType_Single = 8,
++ PropertyType_Double = 9,
++ PropertyType_Char16 = 10,
++ PropertyType_Boolean = 11,
++ PropertyType_String = 12,
++ PropertyType_Inspectable = 13,
++ PropertyType_DateTime = 14,
++ PropertyType_TimeSpan = 15,
++ PropertyType_Guid = 16,
++ PropertyType_Point = 17,
++ PropertyType_Size = 18,
++ PropertyType_Rect = 19,
++ PropertyType_OtherType = 20,
++ PropertyType_UInt8Array = 1025,
++ PropertyType_Int16Array = 1026,
++ PropertyType_UInt16Array = 1027,
++ PropertyType_Int32Array = 1028,
++ PropertyType_UInt32Array = 1029,
++ PropertyType_Int64Array = 1030,
++ PropertyType_UInt64Array = 1031,
++ PropertyType_SingleArray = 1032,
++ PropertyType_DoubleArray = 1033,
++ PropertyType_Char16Array = 1034,
++ PropertyType_BooleanArray = 1035,
++ PropertyType_StringArray = 1036,
++ PropertyType_InspectableArray = 1037,
++ PropertyType_DateTimeArray = 1038,
++ PropertyType_TimeSpanArray = 1039,
++ PropertyType_GuidArray = 1040,
++ PropertyType_PointArray = 1041,
++ PropertyType_SizeArray = 1042,
++ PropertyType_RectArray = 1043,
++ PropertyType_OtherTypeArray = 1044
+ };
+-
+-#ifdef COBJMACROS
+-#ifndef WIDL_C_INLINE_WRAPPERS
+-/*** IUnknown methods ***/
+-#define IAsyncInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+-#define IAsyncInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
+-#define IAsyncInfo_Release(This) (This)->lpVtbl->Release(This)
+-/*** IInspectable methods ***/
+-#define IAsyncInfo_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+-#define IAsyncInfo_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+-#define IAsyncInfo_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+-/*** IAsyncInfo methods ***/
+-#define IAsyncInfo_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
+-#define IAsyncInfo_get_Status(This,status) (This)->lpVtbl->get_Status(This,status)
+-#define IAsyncInfo_get_ErrorCode(This,errorCode) (This)->lpVtbl->get_ErrorCode(This,errorCode)
+-#define IAsyncInfo_Cancel(This) (This)->lpVtbl->Cancel(This)
+-#define IAsyncInfo_Close(This) (This)->lpVtbl->Close(This)
+-#else
+-/*** IUnknown methods ***/
+-static FORCEINLINE HRESULT IAsyncInfo_QueryInterface(IAsyncInfo* This,REFIID riid,void **ppvObject) {
+- return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+-}
+-static FORCEINLINE ULONG IAsyncInfo_AddRef(IAsyncInfo* This) {
+- return This->lpVtbl->AddRef(This);
+-}
+-static FORCEINLINE ULONG IAsyncInfo_Release(IAsyncInfo* This) {
+- return This->lpVtbl->Release(This);
+-}
+-/*** IInspectable methods ***/
+-static FORCEINLINE HRESULT IAsyncInfo_GetIids(IAsyncInfo* This,ULONG *iidCount,IID **iids) {
+- return This->lpVtbl->GetIids(This,iidCount,iids);
+-}
+-static FORCEINLINE HRESULT IAsyncInfo_GetRuntimeClassName(IAsyncInfo* This,HSTRING *className) {
+- return This->lpVtbl->GetRuntimeClassName(This,className);
+-}
+-static FORCEINLINE HRESULT IAsyncInfo_GetTrustLevel(IAsyncInfo* This,TrustLevel *trustLevel) {
+- return This->lpVtbl->GetTrustLevel(This,trustLevel);
+-}
+-/*** IAsyncInfo methods ***/
+-static FORCEINLINE HRESULT IAsyncInfo_get_Id(IAsyncInfo* This,unsigned int *id) {
+- return This->lpVtbl->get_Id(This,id);
+-}
+-static FORCEINLINE HRESULT IAsyncInfo_get_Status(IAsyncInfo* This,AsyncStatus *status) {
+- return This->lpVtbl->get_Status(This,status);
+-}
+-static FORCEINLINE HRESULT IAsyncInfo_get_ErrorCode(IAsyncInfo* This,HRESULT *errorCode) {
+- return This->lpVtbl->get_ErrorCode(This,errorCode);
+-}
+-static FORCEINLINE HRESULT IAsyncInfo_Cancel(IAsyncInfo* This) {
+- return This->lpVtbl->Cancel(This);
+-}
+-static FORCEINLINE HRESULT IAsyncInfo_Close(IAsyncInfo* This) {
+- return This->lpVtbl->Close(This);
+-}
+ #endif
+-#endif
+-
+-#endif
+-
+-HRESULT STDMETHODCALLTYPE IAsyncInfo_get_Id_Proxy(
+- IAsyncInfo* This,
+- unsigned int *id);
+-void __RPC_STUB IAsyncInfo_get_Id_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-HRESULT STDMETHODCALLTYPE IAsyncInfo_get_Status_Proxy(
+- IAsyncInfo* This,
+- AsyncStatus *status);
+-void __RPC_STUB IAsyncInfo_get_Status_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-HRESULT STDMETHODCALLTYPE IAsyncInfo_get_ErrorCode_Proxy(
+- IAsyncInfo* This,
+- HRESULT *errorCode);
+-void __RPC_STUB IAsyncInfo_get_ErrorCode_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-HRESULT STDMETHODCALLTYPE IAsyncInfo_Cancel_Proxy(
+- IAsyncInfo* This);
+-void __RPC_STUB IAsyncInfo_Cancel_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-HRESULT STDMETHODCALLTYPE IAsyncInfo_Close_Proxy(
+- IAsyncInfo* This);
+-void __RPC_STUB IAsyncInfo_Close_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-
+-#endif /* __IAsyncInfo_INTERFACE_DEFINED__ */
+-
+-/*****************************************************************************
+- * IASyncAction interface
+- */
+-#ifndef __IASyncAction_INTERFACE_DEFINED__
+-#define __IASyncAction_INTERFACE_DEFINED__
+-
+-DEFINE_GUID(IID_IASyncAction, 0x5a648006, 0x843a, 0x4da9, 0x86,0x5b, 0x9d,0x26,0xe5,0xdf,0xad,0x7b);
+-#if defined(__cplusplus) && !defined(CINTERFACE)
+-MIDL_INTERFACE("5a648006-843a-4da9-865b-9d26e5dfad7b")
+-IASyncAction : public IInspectable
+-{
+- virtual HRESULT STDMETHODCALLTYPE put_Completed(
+- AsyncActionCompletedHandler *handler) = 0;
+-
+- virtual HRESULT STDMETHODCALLTYPE get_Completed(
+- AsyncActionCompletedHandler **handler) = 0;
+-
+- virtual HRESULT STDMETHODCALLTYPE GetResults(
+- ) = 0;
+
+-};
+-#ifdef __CRT_UUID_DECL
+-__CRT_UUID_DECL(IASyncAction, 0x5a648006, 0x843a, 0x4da9, 0x86,0x5b, 0x9d,0x26,0xe5,0xdf,0xad,0x7b)
+-#endif
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ struct Point {
++ FLOAT X;
++ FLOAT Y;
++ };
++ }
++ }
++}
++extern "C" {
+ #else
+-typedef struct IASyncActionVtbl {
+- BEGIN_INTERFACE
+-
+- /*** IUnknown methods ***/
+- HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+- IASyncAction* This,
+- REFIID riid,
+- void **ppvObject);
+-
+- ULONG (STDMETHODCALLTYPE *AddRef)(
+- IASyncAction* This);
+-
+- ULONG (STDMETHODCALLTYPE *Release)(
+- IASyncAction* This);
+-
+- /*** IInspectable methods ***/
+- HRESULT (STDMETHODCALLTYPE *GetIids)(
+- IASyncAction* This,
+- ULONG *iidCount,
+- IID **iids);
+-
+- HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+- IASyncAction* This,
+- HSTRING *className);
+-
+- HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+- IASyncAction* This,
+- TrustLevel *trustLevel);
+-
+- /*** IASyncAction methods ***/
+- HRESULT (STDMETHODCALLTYPE *put_Completed)(
+- IASyncAction* This,
+- AsyncActionCompletedHandler *handler);
+-
+- HRESULT (STDMETHODCALLTYPE *get_Completed)(
+- IASyncAction* This,
+- AsyncActionCompletedHandler **handler);
+-
+- HRESULT (STDMETHODCALLTYPE *GetResults)(
+- IASyncAction* This);
+-
+- END_INTERFACE
+-} IASyncActionVtbl;
+-interface IASyncAction {
+- CONST_VTBL IASyncActionVtbl* lpVtbl;
++struct __x_ABI_CWindows_CFoundation_CPoint {
++ FLOAT X;
++ FLOAT Y;
+ };
+-
+-#ifdef COBJMACROS
+-#ifndef WIDL_C_INLINE_WRAPPERS
+-/*** IUnknown methods ***/
+-#define IASyncAction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+-#define IASyncAction_AddRef(This) (This)->lpVtbl->AddRef(This)
+-#define IASyncAction_Release(This) (This)->lpVtbl->Release(This)
+-/*** IInspectable methods ***/
+-#define IASyncAction_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+-#define IASyncAction_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+-#define IASyncAction_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+-/*** IASyncAction methods ***/
+-#define IASyncAction_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
+-#define IASyncAction_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
+-#define IASyncAction_GetResults(This) (This)->lpVtbl->GetResults(This)
+-#else
+-/*** IUnknown methods ***/
+-static FORCEINLINE HRESULT IASyncAction_QueryInterface(IASyncAction* This,REFIID riid,void **ppvObject) {
+- return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+-}
+-static FORCEINLINE ULONG IASyncAction_AddRef(IASyncAction* This) {
+- return This->lpVtbl->AddRef(This);
+-}
+-static FORCEINLINE ULONG IASyncAction_Release(IASyncAction* This) {
+- return This->lpVtbl->Release(This);
+-}
+-/*** IInspectable methods ***/
+-static FORCEINLINE HRESULT IASyncAction_GetIids(IASyncAction* This,ULONG *iidCount,IID **iids) {
+- return This->lpVtbl->GetIids(This,iidCount,iids);
+-}
+-static FORCEINLINE HRESULT IASyncAction_GetRuntimeClassName(IASyncAction* This,HSTRING *className) {
+- return This->lpVtbl->GetRuntimeClassName(This,className);
+-}
+-static FORCEINLINE HRESULT IASyncAction_GetTrustLevel(IASyncAction* This,TrustLevel *trustLevel) {
+- return This->lpVtbl->GetTrustLevel(This,trustLevel);
+-}
+-/*** IASyncAction methods ***/
+-static FORCEINLINE HRESULT IASyncAction_put_Completed(IASyncAction* This,AsyncActionCompletedHandler *handler) {
+- return This->lpVtbl->put_Completed(This,handler);
+-}
+-static FORCEINLINE HRESULT IASyncAction_get_Completed(IASyncAction* This,AsyncActionCompletedHandler **handler) {
+- return This->lpVtbl->get_Completed(This,handler);
+-}
+-static FORCEINLINE HRESULT IASyncAction_GetResults(IASyncAction* This) {
+- return This->lpVtbl->GetResults(This);
+-}
+-#endif
+ #endif
+
+-#endif
+-
+-HRESULT STDMETHODCALLTYPE IASyncAction_put_Completed_Proxy(
+- IASyncAction* This,
+- AsyncActionCompletedHandler *handler);
+-void __RPC_STUB IASyncAction_put_Completed_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-HRESULT STDMETHODCALLTYPE IASyncAction_get_Completed_Proxy(
+- IASyncAction* This,
+- AsyncActionCompletedHandler **handler);
+-void __RPC_STUB IASyncAction_get_Completed_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-HRESULT STDMETHODCALLTYPE IASyncAction_GetResults_Proxy(
+- IASyncAction* This);
+-void __RPC_STUB IASyncAction_GetResults_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-
+-#endif /* __IASyncAction_INTERFACE_DEFINED__ */
+-
+-/*****************************************************************************
+- * AsyncActionCompletedHandler interface
+- */
+-#ifndef __AsyncActionCompletedHandler_INTERFACE_DEFINED__
+-#define __AsyncActionCompletedHandler_INTERFACE_DEFINED__
+-
+-DEFINE_GUID(IID_AsyncActionCompletedHandler, 0xa4ed5c81, 0x76c9, 0x40bd, 0x8b,0xe6, 0xb1,0xd9,0x0f,0xb2,0x0a,0xe7);
+-#if defined(__cplusplus) && !defined(CINTERFACE)
+-MIDL_INTERFACE("a4ed5c81-76c9-40bd-8be6-b1d90fb20ae7")
+-AsyncActionCompletedHandler : public IUnknown
+-{
+- virtual HRESULT STDMETHODCALLTYPE Invoke(
+- IInspectable *asyncAction,
+- AsyncStatus status) = 0;
+-
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ struct Size {
++ FLOAT Width;
++ FLOAT Height;
++ };
++ }
++ }
++}
++extern "C" {
++#else
++struct __x_ABI_CWindows_CFoundation_CSize {
++ FLOAT Width;
++ FLOAT Height;
+ };
+-#ifdef __CRT_UUID_DECL
+-__CRT_UUID_DECL(AsyncActionCompletedHandler, 0xa4ed5c81, 0x76c9, 0x40bd, 0x8b,0xe6, 0xb1,0xd9,0x0f,0xb2,0x0a,0xe7)
+ #endif
+-#else
+-typedef struct AsyncActionCompletedHandlerVtbl {
+- BEGIN_INTERFACE
+-
+- /*** IUnknown methods ***/
+- HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+- AsyncActionCompletedHandler* This,
+- REFIID riid,
+- void **ppvObject);
+-
+- ULONG (STDMETHODCALLTYPE *AddRef)(
+- AsyncActionCompletedHandler* This);
+-
+- ULONG (STDMETHODCALLTYPE *Release)(
+- AsyncActionCompletedHandler* This);
+-
+- /*** AsyncActionCompletedHandler methods ***/
+- HRESULT (STDMETHODCALLTYPE *Invoke)(
+- AsyncActionCompletedHandler* This,
+- IInspectable *asyncAction,
+- AsyncStatus status);
+
+- END_INTERFACE
+-} AsyncActionCompletedHandlerVtbl;
+-interface AsyncActionCompletedHandler {
+- CONST_VTBL AsyncActionCompletedHandlerVtbl* lpVtbl;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++typedef struct Size Size;
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ struct Rect {
++ FLOAT X;
++ FLOAT Y;
++ FLOAT Width;
++ FLOAT Height;
++ };
++ }
++ }
++}
++extern "C" {
++#else
++struct __x_ABI_CWindows_CFoundation_CRect {
++ FLOAT X;
++ FLOAT Y;
++ FLOAT Width;
++ FLOAT Height;
+ };
++#endif
+
+-#ifdef COBJMACROS
+-#ifndef WIDL_C_INLINE_WRAPPERS
+-/*** IUnknown methods ***/
+-#define AsyncActionCompletedHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+-#define AsyncActionCompletedHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
+-#define AsyncActionCompletedHandler_Release(This) (This)->lpVtbl->Release(This)
+-/*** AsyncActionCompletedHandler methods ***/
+-#define AsyncActionCompletedHandler_Invoke(This,asyncAction,status) (This)->lpVtbl->Invoke(This,asyncAction,status)
+-#else
+-/*** IUnknown methods ***/
+-static FORCEINLINE HRESULT AsyncActionCompletedHandler_QueryInterface(AsyncActionCompletedHandler* This,REFIID riid,void **ppvObject) {
+- return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+-}
+-static FORCEINLINE ULONG AsyncActionCompletedHandler_AddRef(AsyncActionCompletedHandler* This) {
+- return This->lpVtbl->AddRef(This);
+-}
+-static FORCEINLINE ULONG AsyncActionCompletedHandler_Release(AsyncActionCompletedHandler* This) {
+- return This->lpVtbl->Release(This);
+-}
+-/*** AsyncActionCompletedHandler methods ***/
+-static FORCEINLINE HRESULT AsyncActionCompletedHandler_Invoke(AsyncActionCompletedHandler* This,IInspectable *asyncAction,AsyncStatus status) {
+- return This->lpVtbl->Invoke(This,asyncAction,status);
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ struct DateTime {
++ INT64 UniversalTime;
++ };
++ }
++ }
+ }
+-#endif
++extern "C" {
++#else
++struct __x_ABI_CWindows_CFoundation_CDateTime {
++ INT64 UniversalTime;
++};
+ #endif
+
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ struct TimeSpan {
++ INT64 Duration;
++ };
++ }
++ }
++}
++extern "C" {
++#else
++struct __x_ABI_CWindows_CFoundation_CTimeSpan {
++ INT64 Duration;
++};
+ #endif
+
+-HRESULT STDMETHODCALLTYPE AsyncActionCompletedHandler_Invoke_Proxy(
+- AsyncActionCompletedHandler* This,
+- IInspectable *asyncAction,
+- AsyncStatus status);
+-void __RPC_STUB AsyncActionCompletedHandler_Invoke_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-
+-#endif /* __AsyncActionCompletedHandler_INTERFACE_DEFINED__ */
+-
+ /*****************************************************************************
+- * IAsyncOperation interface
++ * IStringable interface
+ */
+-#ifndef __IAsyncOperation_INTERFACE_DEFINED__
+-#define __IAsyncOperation_INTERFACE_DEFINED__
++#ifndef ____x_ABI_CWindows_CFoundation_CIStringable_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CFoundation_CIStringable_INTERFACE_DEFINED__
+
+-DEFINE_GUID(IID_IAsyncOperation, 0x9fc2b0bb, 0xe446, 0x44e2, 0xaa,0x61, 0x9c,0xab,0x8f,0x63,0x6a,0xf2);
++DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIStringable, 0x96369f54, 0x8eb6, 0x48f0, 0xab,0xce, 0xc1,0xb2,0x11,0xe6,0x27,0xc3);
+ #if defined(__cplusplus) && !defined(CINTERFACE)
+-MIDL_INTERFACE("9fc2b0bb-e446-44e2-aa61-9cab8f636af2")
+-IAsyncOperation : public IAsyncInfo
+-{
+- virtual HRESULT STDMETHODCALLTYPE put_Completed(
+- AsyncActionCompletedHandler *handler) = 0;
+-
+- virtual HRESULT STDMETHODCALLTYPE get_Completed(
+- AsyncActionCompletedHandler **handler) = 0;
+-
+- virtual IInspectable * STDMETHODCALLTYPE GetResults(
+- ) = 0;
+-
+-};
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ MIDL_INTERFACE("96369f54-8eb6-48f0-abce-c1b211e627c3")
++ IStringable : public IInspectable
++ {
++ virtual HRESULT STDMETHODCALLTYPE ToString(
++ HSTRING *value) = 0;
++
++ };
++ }
++ }
++}
++extern "C" {
+ #ifdef __CRT_UUID_DECL
+-__CRT_UUID_DECL(IAsyncOperation, 0x9fc2b0bb, 0xe446, 0x44e2, 0xaa,0x61, 0x9c,0xab,0x8f,0x63,0x6a,0xf2)
++__CRT_UUID_DECL(ABI::Windows::Foundation::IStringable, 0x96369f54, 0x8eb6, 0x48f0, 0xab,0xce, 0xc1,0xb2,0x11,0xe6,0x27,0xc3)
+ #endif
+ #else
+-typedef struct IAsyncOperationVtbl {
++typedef struct __x_ABI_CWindows_CFoundation_CIStringableVtbl {
+ BEGIN_INTERFACE
+
+ /*** IUnknown methods ***/
+ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+- IAsyncOperation* This,
++ __x_ABI_CWindows_CFoundation_CIStringable *This,
+ REFIID riid,
+ void **ppvObject);
+
+ ULONG (STDMETHODCALLTYPE *AddRef)(
+- IAsyncOperation* This);
++ __x_ABI_CWindows_CFoundation_CIStringable *This);
+
+ ULONG (STDMETHODCALLTYPE *Release)(
+- IAsyncOperation* This);
++ __x_ABI_CWindows_CFoundation_CIStringable *This);
+
+ /*** IInspectable methods ***/
+ HRESULT (STDMETHODCALLTYPE *GetIids)(
+- IAsyncOperation* This,
++ __x_ABI_CWindows_CFoundation_CIStringable *This,
+ ULONG *iidCount,
+ IID **iids);
+
+ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+- IAsyncOperation* This,
++ __x_ABI_CWindows_CFoundation_CIStringable *This,
+ HSTRING *className);
+
+ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+- IAsyncOperation* This,
++ __x_ABI_CWindows_CFoundation_CIStringable *This,
+ TrustLevel *trustLevel);
+
+- /*** IAsyncInfo methods ***/
+- HRESULT (STDMETHODCALLTYPE *get_Id)(
+- IAsyncOperation* This,
+- unsigned int *id);
+-
+- HRESULT (STDMETHODCALLTYPE *get_Status)(
+- IAsyncOperation* This,
+- AsyncStatus *status);
+-
+- HRESULT (STDMETHODCALLTYPE *get_ErrorCode)(
+- IAsyncOperation* This,
+- HRESULT *errorCode);
+-
+- HRESULT (STDMETHODCALLTYPE *Cancel)(
+- IAsyncOperation* This);
+-
+- HRESULT (STDMETHODCALLTYPE *Close)(
+- IAsyncOperation* This);
+-
+- /*** IAsyncOperation methods ***/
+- HRESULT (STDMETHODCALLTYPE *put_Completed)(
+- IAsyncOperation* This,
+- AsyncActionCompletedHandler *handler);
+-
+- HRESULT (STDMETHODCALLTYPE *get_Completed)(
+- IAsyncOperation* This,
+- AsyncActionCompletedHandler **handler);
+-
+- IInspectable * (STDMETHODCALLTYPE *GetResults)(
+- IAsyncOperation* This);
++ /*** IStringable methods ***/
++ HRESULT (STDMETHODCALLTYPE *ToString)(
++ __x_ABI_CWindows_CFoundation_CIStringable *This,
++ HSTRING *value);
+
+ END_INTERFACE
+-} IAsyncOperationVtbl;
+-interface IAsyncOperation {
+- CONST_VTBL IAsyncOperationVtbl* lpVtbl;
++} __x_ABI_CWindows_CFoundation_CIStringableVtbl;
++
++interface __x_ABI_CWindows_CFoundation_CIStringable {
++ CONST_VTBL __x_ABI_CWindows_CFoundation_CIStringableVtbl* lpVtbl;
+ };
+
+ #ifdef COBJMACROS
+ #ifndef WIDL_C_INLINE_WRAPPERS
+ /*** IUnknown methods ***/
+-#define IAsyncOperation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+-#define IAsyncOperation_AddRef(This) (This)->lpVtbl->AddRef(This)
+-#define IAsyncOperation_Release(This) (This)->lpVtbl->Release(This)
++#define __x_ABI_CWindows_CFoundation_CIStringable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CFoundation_CIStringable_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CFoundation_CIStringable_Release(This) (This)->lpVtbl->Release(This)
+ /*** IInspectable methods ***/
+-#define IAsyncOperation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+-#define IAsyncOperation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+-#define IAsyncOperation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+-/*** IAsyncInfo methods ***/
+-#define IAsyncOperation_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
+-#define IAsyncOperation_get_Status(This,status) (This)->lpVtbl->get_Status(This,status)
+-#define IAsyncOperation_get_ErrorCode(This,errorCode) (This)->lpVtbl->get_ErrorCode(This,errorCode)
+-#define IAsyncOperation_Cancel(This) (This)->lpVtbl->Cancel(This)
+-#define IAsyncOperation_Close(This) (This)->lpVtbl->Close(This)
+-/*** IAsyncOperation methods ***/
+-#define IAsyncOperation_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
+-#define IAsyncOperation_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
+-#define IAsyncOperation_GetResults(This) (This)->lpVtbl->GetResults(This)
++#define __x_ABI_CWindows_CFoundation_CIStringable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CFoundation_CIStringable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CFoundation_CIStringable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++/*** IStringable methods ***/
++#define __x_ABI_CWindows_CFoundation_CIStringable_ToString(This,value) (This)->lpVtbl->ToString(This,value)
+ #else
+ /*** IUnknown methods ***/
+-static FORCEINLINE HRESULT IAsyncOperation_QueryInterface(IAsyncOperation* This,REFIID riid,void **ppvObject) {
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIStringable_QueryInterface(__x_ABI_CWindows_CFoundation_CIStringable* This,REFIID riid,void **ppvObject) {
+ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+ }
+-static FORCEINLINE ULONG IAsyncOperation_AddRef(IAsyncOperation* This) {
++static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CIStringable_AddRef(__x_ABI_CWindows_CFoundation_CIStringable* This) {
+ return This->lpVtbl->AddRef(This);
+ }
+-static FORCEINLINE ULONG IAsyncOperation_Release(IAsyncOperation* This) {
++static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CIStringable_Release(__x_ABI_CWindows_CFoundation_CIStringable* This) {
+ return This->lpVtbl->Release(This);
+ }
+ /*** IInspectable methods ***/
+-static FORCEINLINE HRESULT IAsyncOperation_GetIids(IAsyncOperation* This,ULONG *iidCount,IID **iids) {
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIStringable_GetIids(__x_ABI_CWindows_CFoundation_CIStringable* This,ULONG *iidCount,IID **iids) {
+ return This->lpVtbl->GetIids(This,iidCount,iids);
+ }
+-static FORCEINLINE HRESULT IAsyncOperation_GetRuntimeClassName(IAsyncOperation* This,HSTRING *className) {
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIStringable_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIStringable* This,HSTRING *className) {
+ return This->lpVtbl->GetRuntimeClassName(This,className);
+ }
+-static FORCEINLINE HRESULT IAsyncOperation_GetTrustLevel(IAsyncOperation* This,TrustLevel *trustLevel) {
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIStringable_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIStringable* This,TrustLevel *trustLevel) {
+ return This->lpVtbl->GetTrustLevel(This,trustLevel);
+ }
+-/*** IAsyncInfo methods ***/
+-static FORCEINLINE HRESULT IAsyncOperation_get_Id(IAsyncOperation* This,unsigned int *id) {
+- return This->lpVtbl->get_Id(This,id);
+-}
+-static FORCEINLINE HRESULT IAsyncOperation_get_Status(IAsyncOperation* This,AsyncStatus *status) {
+- return This->lpVtbl->get_Status(This,status);
+-}
+-static FORCEINLINE HRESULT IAsyncOperation_get_ErrorCode(IAsyncOperation* This,HRESULT *errorCode) {
+- return This->lpVtbl->get_ErrorCode(This,errorCode);
+-}
+-static FORCEINLINE HRESULT IAsyncOperation_Cancel(IAsyncOperation* This) {
+- return This->lpVtbl->Cancel(This);
+-}
+-static FORCEINLINE HRESULT IAsyncOperation_Close(IAsyncOperation* This) {
+- return This->lpVtbl->Close(This);
+-}
+-/*** IAsyncOperation methods ***/
+-static FORCEINLINE HRESULT IAsyncOperation_put_Completed(IAsyncOperation* This,AsyncActionCompletedHandler *handler) {
+- return This->lpVtbl->put_Completed(This,handler);
+-}
+-static FORCEINLINE HRESULT IAsyncOperation_get_Completed(IAsyncOperation* This,AsyncActionCompletedHandler **handler) {
+- return This->lpVtbl->get_Completed(This,handler);
+-}
+-static FORCEINLINE IInspectable * IAsyncOperation_GetResults(IAsyncOperation* This) {
+- return This->lpVtbl->GetResults(This);
++/*** IStringable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIStringable_ToString(__x_ABI_CWindows_CFoundation_CIStringable* This,HSTRING *value) {
++ return This->lpVtbl->ToString(This,value);
+ }
+ #endif
+ #endif
+
+ #endif
+
+-HRESULT STDMETHODCALLTYPE IAsyncOperation_put_Completed_Proxy(
+- IAsyncOperation* This,
+- AsyncActionCompletedHandler *handler);
+-void __RPC_STUB IAsyncOperation_put_Completed_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-HRESULT STDMETHODCALLTYPE IAsyncOperation_get_Completed_Proxy(
+- IAsyncOperation* This,
+- AsyncActionCompletedHandler **handler);
+-void __RPC_STUB IAsyncOperation_get_Completed_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-IInspectable * STDMETHODCALLTYPE IAsyncOperation_GetResults_Proxy(
+- IAsyncOperation* This);
+-void __RPC_STUB IAsyncOperation_GetResults_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-
+-#endif /* __IAsyncOperation_INTERFACE_DEFINED__ */
++#endif /* ____x_ABI_CWindows_CFoundation_CIStringable_INTERFACE_DEFINED__ */
+
+ /* Begin additional prototypes for all interfaces */
+
++ULONG __RPC_USER HSTRING_UserSize (ULONG *, ULONG, HSTRING *);
++unsigned char * __RPC_USER HSTRING_UserMarshal (ULONG *, unsigned char *, HSTRING *);
++unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
++void __RPC_USER HSTRING_UserFree (ULONG *, HSTRING *);
+
+ /* End additional prototypes */
+
+diff --git a/mingw-w64-headers/include/windows.foundation.metadata.h b/mingw-w64-headers/include/windows.foundation.metadata.h
+new file mode 100644
+index 00000000..13262699
+--- /dev/null
++++ b/mingw-w64-headers/include/windows.foundation.metadata.h
+@@ -0,0 +1,315 @@
++/*** Autogenerated by WIDL 4.4 from windows.foundation.metadata.idl - Do not edit ***/
++
++#ifdef _WIN32
++#ifndef __REQUIRED_RPCNDR_H_VERSION__
++#define __REQUIRED_RPCNDR_H_VERSION__ 475
++#endif
++#include <rpc.h>
++#include <rpcndr.h>
++#endif
++
++#ifndef COM_NO_WINDOWS_H
++#include <windows.h>
++#include <ole2.h>
++#endif
++
++#ifndef __windows_foundation_metadata_h__
++#define __windows_foundation_metadata_h__
++
++/* Forward declarations */
++
++#ifndef ____x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_FWD_DEFINED__
++#define ____x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Metadata {
++ interface IApiInformationStatics;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++/* Headers for imported files */
++
++#include <inspectable.h>
++#include <windows.foundation.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*****************************************************************************
++ * IApiInformationStatics interface
++ */
++#ifndef ____x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics, 0x997439fe, 0xf681, 0x4a11, 0xb4,0x16, 0xc1,0x3a,0x47,0xe8,0xba,0x36);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Metadata {
++ MIDL_INTERFACE("997439fe-f681-4a11-b416-c13a47e8ba36")
++ IApiInformationStatics : public IInspectable
++ {
++ virtual HRESULT STDMETHODCALLTYPE IsTypePresent(
++ HSTRING typeName,
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE IsMethodPresent(
++ HSTRING typeName,
++ HSTRING methodName,
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE IsMethodPresentWithArity(
++ HSTRING typeName,
++ HSTRING methodName,
++ UINT32 inputParameterCount,
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE IsEventPresent(
++ HSTRING typeName,
++ HSTRING eventName,
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE IsPropertyPresent(
++ HSTRING typeName,
++ HSTRING propertyName,
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE IsReadOnlyPropertyPresent(
++ HSTRING typeName,
++ HSTRING propertyName,
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE IsWriteablePropertyPresent(
++ HSTRING typeName,
++ HSTRING propertyName,
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE IsEnumNamedValuePresent(
++ HSTRING enumTypeName,
++ HSTRING valueName,
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE IsApiContractPresentByMajor(
++ HSTRING contractName,
++ UINT16 majorVersion,
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE IsApiContractPresentByMajorAndMinor(
++ HSTRING contractName,
++ UINT16 majorVersion,
++ UINT16 minorVersion,
++ boolean *value) = 0;
++
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::Foundation::Metadata::IApiInformationStatics, 0x997439fe, 0xf681, 0x4a11, 0xb4,0x16, 0xc1,0x3a,0x47,0xe8,0xba,0x36)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStaticsVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ TrustLevel *trustLevel);
++
++ /*** IApiInformationStatics methods ***/
++ HRESULT (STDMETHODCALLTYPE *IsTypePresent)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING typeName,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *IsMethodPresent)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING typeName,
++ HSTRING methodName,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *IsMethodPresentWithArity)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING typeName,
++ HSTRING methodName,
++ UINT32 inputParameterCount,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *IsEventPresent)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING typeName,
++ HSTRING eventName,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *IsPropertyPresent)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING typeName,
++ HSTRING propertyName,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *IsReadOnlyPropertyPresent)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING typeName,
++ HSTRING propertyName,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *IsWriteablePropertyPresent)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING typeName,
++ HSTRING propertyName,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *IsEnumNamedValuePresent)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING enumTypeName,
++ HSTRING valueName,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *IsApiContractPresentByMajor)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING contractName,
++ UINT16 majorVersion,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *IsApiContractPresentByMajorAndMinor)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING contractName,
++ UINT16 majorVersion,
++ UINT16 minorVersion,
++ boolean *value);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStaticsVtbl;
++
++interface __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics {
++ CONST_VTBL __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStaticsVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++/*** IApiInformationStatics methods ***/
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsTypePresent(This,typeName,value) (This)->lpVtbl->IsTypePresent(This,typeName,value)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsMethodPresent(This,typeName,methodName,value) (This)->lpVtbl->IsMethodPresent(This,typeName,methodName,value)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsMethodPresentWithArity(This,typeName,methodName,inputParameterCount,value) (This)->lpVtbl->IsMethodPresentWithArity(This,typeName,methodName,inputParameterCount,value)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsEventPresent(This,typeName,eventName,value) (This)->lpVtbl->IsEventPresent(This,typeName,eventName,value)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsPropertyPresent(This,typeName,propertyName,value) (This)->lpVtbl->IsPropertyPresent(This,typeName,propertyName,value)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsReadOnlyPropertyPresent(This,typeName,propertyName,value) (This)->lpVtbl->IsReadOnlyPropertyPresent(This,typeName,propertyName,value)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsWriteablePropertyPresent(This,typeName,propertyName,value) (This)->lpVtbl->IsWriteablePropertyPresent(This,typeName,propertyName,value)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsEnumNamedValuePresent(This,enumTypeName,valueName,value) (This)->lpVtbl->IsEnumNamedValuePresent(This,enumTypeName,valueName,value)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsApiContractPresentByMajor(This,contractName,majorVersion,value) (This)->lpVtbl->IsApiContractPresentByMajor(This,contractName,majorVersion,value)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsApiContractPresentByMajorAndMinor(This,contractName,majorVersion,minorVersion,value) (This)->lpVtbl->IsApiContractPresentByMajorAndMinor(This,contractName,majorVersion,minorVersion,value)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_QueryInterface(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_AddRef(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_Release(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_GetIids(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_GetTrustLevel(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++/*** IApiInformationStatics methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsTypePresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,boolean *value) {
++ return This->lpVtbl->IsTypePresent(This,typeName,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsMethodPresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,HSTRING methodName,boolean *value) {
++ return This->lpVtbl->IsMethodPresent(This,typeName,methodName,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsMethodPresentWithArity(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,HSTRING methodName,UINT32 inputParameterCount,boolean *value) {
++ return This->lpVtbl->IsMethodPresentWithArity(This,typeName,methodName,inputParameterCount,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsEventPresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,HSTRING eventName,boolean *value) {
++ return This->lpVtbl->IsEventPresent(This,typeName,eventName,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsPropertyPresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,HSTRING propertyName,boolean *value) {
++ return This->lpVtbl->IsPropertyPresent(This,typeName,propertyName,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsReadOnlyPropertyPresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,HSTRING propertyName,boolean *value) {
++ return This->lpVtbl->IsReadOnlyPropertyPresent(This,typeName,propertyName,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsWriteablePropertyPresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,HSTRING propertyName,boolean *value) {
++ return This->lpVtbl->IsWriteablePropertyPresent(This,typeName,propertyName,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsEnumNamedValuePresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING enumTypeName,HSTRING valueName,boolean *value) {
++ return This->lpVtbl->IsEnumNamedValuePresent(This,enumTypeName,valueName,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsApiContractPresentByMajor(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING contractName,UINT16 majorVersion,boolean *value) {
++ return This->lpVtbl->IsApiContractPresentByMajor(This,contractName,majorVersion,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsApiContractPresentByMajorAndMinor(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING contractName,UINT16 majorVersion,UINT16 minorVersion,boolean *value) {
++ return This->lpVtbl->IsApiContractPresentByMajorAndMinor(This,contractName,majorVersion,minorVersion,value);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_INTERFACE_DEFINED__ */
++
++extern const __declspec(selectany) WCHAR RuntimeClass_Windows_Foundation_Metadata_ApiInformation[] = L"Windows.Foundation.Metadata.ApiInformation";
++/* Begin additional prototypes for all interfaces */
++
++ULONG __RPC_USER HSTRING_UserSize (ULONG *, ULONG, HSTRING *);
++unsigned char * __RPC_USER HSTRING_UserMarshal (ULONG *, unsigned char *, HSTRING *);
++unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
++void __RPC_USER HSTRING_UserFree (ULONG *, HSTRING *);
++
++/* End additional prototypes */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __windows_foundation_metadata_h__ */
+diff --git a/mingw-w64-headers/include/windows.foundation.numerics.h b/mingw-w64-headers/include/windows.foundation.numerics.h
+new file mode 100644
+index 00000000..e20017ce
+--- /dev/null
++++ b/mingw-w64-headers/include/windows.foundation.numerics.h
+@@ -0,0 +1,204 @@
++/*** Autogenerated by WIDL 4.4 from windows.foundation.numerics.idl - Do not edit ***/
++
++#ifdef _WIN32
++#ifndef __REQUIRED_RPCNDR_H_VERSION__
++#define __REQUIRED_RPCNDR_H_VERSION__ 475
++#endif
++#include <rpc.h>
++#include <rpcndr.h>
++#endif
++
++#ifndef COM_NO_WINDOWS_H
++#include <windows.h>
++#include <ole2.h>
++#endif
++
++#ifndef __windows_foundation_numerics_h__
++#define __windows_foundation_numerics_h__
++
++/* Forward declarations */
++
++/* Headers for imported files */
++
++#include <inspectable.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Numerics {
++typedef struct Vector2 Vector2;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Numerics {
++typedef struct Vector3 Vector3;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Numerics {
++typedef struct Matrix4x4 Matrix4x4;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Numerics {
++typedef struct Quaternion Quaternion;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Numerics {
++ struct Vector2 {
++ FLOAT X;
++ FLOAT Y;
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 {
++ FLOAT X;
++ FLOAT Y;
++};
++#endif
++
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Numerics {
++ struct Vector3 {
++ FLOAT X;
++ FLOAT Y;
++ FLOAT Z;
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 {
++ FLOAT X;
++ FLOAT Y;
++ FLOAT Z;
++};
++#endif
++
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Numerics {
++ struct Matrix4x4 {
++ FLOAT M11;
++ FLOAT M12;
++ FLOAT M13;
++ FLOAT M14;
++ FLOAT M21;
++ FLOAT M22;
++ FLOAT M23;
++ FLOAT M24;
++ FLOAT M31;
++ FLOAT M32;
++ FLOAT M33;
++ FLOAT M34;
++ FLOAT M41;
++ FLOAT M42;
++ FLOAT M43;
++ FLOAT M44;
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 {
++ FLOAT M11;
++ FLOAT M12;
++ FLOAT M13;
++ FLOAT M14;
++ FLOAT M21;
++ FLOAT M22;
++ FLOAT M23;
++ FLOAT M24;
++ FLOAT M31;
++ FLOAT M32;
++ FLOAT M33;
++ FLOAT M34;
++ FLOAT M41;
++ FLOAT M42;
++ FLOAT M43;
++ FLOAT M44;
++};
++#endif
++
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Numerics {
++ struct Quaternion {
++ FLOAT X;
++ FLOAT Y;
++ FLOAT Z;
++ FLOAT W;
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++struct __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion {
++ FLOAT X;
++ FLOAT Y;
++ FLOAT Z;
++ FLOAT W;
++};
++#endif
++
++/* Begin additional prototypes for all interfaces */
++
++
++/* End additional prototypes */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __windows_foundation_numerics_h__ */
+diff --git a/mingw-w64-headers/include/windows.graphics.directx.h b/mingw-w64-headers/include/windows.graphics.directx.h
+new file mode 100644
+index 00000000..4bc4cb44
+--- /dev/null
++++ b/mingw-w64-headers/include/windows.graphics.directx.h
+@@ -0,0 +1,343 @@
++/*** Autogenerated by WIDL 4.4 from windows.graphics.directx.idl - Do not edit ***/
++
++#ifdef _WIN32
++#ifndef __REQUIRED_RPCNDR_H_VERSION__
++#define __REQUIRED_RPCNDR_H_VERSION__ 475
++#endif
++#include <rpc.h>
++#include <rpcndr.h>
++#endif
++
++#ifndef COM_NO_WINDOWS_H
++#include <windows.h>
++#include <ole2.h>
++#endif
++
++#ifndef __windows_graphics_directx_h__
++#define __windows_graphics_directx_h__
++
++/* Forward declarations */
++
++/* Headers for imported files */
++
++#include <inspectable.h>
++#include <windows.foundation.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Graphics {
++ namespace DirectX {
++ enum DirectXAlphaMode {
++ DirectXAlphaMode_Unspecified = 0,
++ DirectXAlphaMode_Premultiplied = 1,
++ DirectXAlphaMode_Straight = 2,
++ DirectXAlphaMode_Ignore = 3
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++enum __x_ABI_CWindows_CGraphics_CDirectX_CDirectXAlphaMode {
++ DirectXAlphaMode_Unspecified = 0,
++ DirectXAlphaMode_Premultiplied = 1,
++ DirectXAlphaMode_Straight = 2,
++ DirectXAlphaMode_Ignore = 3
++};
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Graphics {
++ namespace DirectX {
++typedef enum DirectXAlphaMode DirectXAlphaMode;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Graphics {
++ namespace DirectX {
++ enum DirectXPixelFormat {
++ DirectXPixelFormat_Unknown = 0,
++ DirectXPixelFormat_R32G32B32A32Typeless = 1,
++ DirectXPixelFormat_R32G32B32A32Float = 2,
++ DirectXPixelFormat_R32G32B32A32UInt = 3,
++ DirectXPixelFormat_R32G32B32A32Int = 4,
++ DirectXPixelFormat_R32G32B32Typeless = 5,
++ DirectXPixelFormat_R32G32B32Float = 6,
++ DirectXPixelFormat_R32G32B32UInt = 7,
++ DirectXPixelFormat_R32G32B32Int = 8,
++ DirectXPixelFormat_R16G16B16A16Typeless = 9,
++ DirectXPixelFormat_R16G16B16A16Float = 10,
++ DirectXPixelFormat_R16G16B16A16UIntNormalized = 11,
++ DirectXPixelFormat_R16G16B16A16UInt = 12,
++ DirectXPixelFormat_R16G16B16A16IntNormalized = 13,
++ DirectXPixelFormat_R16G16B16A16Int = 14,
++ DirectXPixelFormat_R32G32Typeless = 15,
++ DirectXPixelFormat_R32G32Float = 16,
++ DirectXPixelFormat_R32G32UInt = 17,
++ DirectXPixelFormat_R32G32Int = 18,
++ DirectXPixelFormat_R32G8X24Typeless = 19,
++ DirectXPixelFormat_D32FloatS8X24UInt = 20,
++ DirectXPixelFormat_R32FloatX8X24Typeless = 21,
++ DirectXPixelFormat_X32TypelessG8X24UInt = 22,
++ DirectXPixelFormat_R10G10B10A2Typeless = 23,
++ DirectXPixelFormat_R10G10B10A2UIntNormalized = 24,
++ DirectXPixelFormat_R10G10B10A2UInt = 25,
++ DirectXPixelFormat_R11G11B10Float = 26,
++ DirectXPixelFormat_R8G8B8A8Typeless = 27,
++ DirectXPixelFormat_R8G8B8A8UIntNormalized = 28,
++ DirectXPixelFormat_R8G8B8A8UIntNormalizedSrgb = 29,
++ DirectXPixelFormat_R8G8B8A8UInt = 30,
++ DirectXPixelFormat_R8G8B8A8IntNormalized = 31,
++ DirectXPixelFormat_R8G8B8A8Int = 32,
++ DirectXPixelFormat_R16G16Typeless = 33,
++ DirectXPixelFormat_R16G16Float = 34,
++ DirectXPixelFormat_R16G16UIntNormalized = 35,
++ DirectXPixelFormat_R16G16UInt = 36,
++ DirectXPixelFormat_R16G16IntNormalized = 37,
++ DirectXPixelFormat_R16G16Int = 38,
++ DirectXPixelFormat_R32Typeless = 39,
++ DirectXPixelFormat_D32Float = 40,
++ DirectXPixelFormat_R32Float = 41,
++ DirectXPixelFormat_R32UInt = 42,
++ DirectXPixelFormat_R32Int = 43,
++ DirectXPixelFormat_R24G8Typeless = 44,
++ DirectXPixelFormat_D24UIntNormalizedS8UInt = 45,
++ DirectXPixelFormat_R24UIntNormalizedX8Typeless = 46,
++ DirectXPixelFormat_X24TypelessG8UInt = 47,
++ DirectXPixelFormat_R8G8Typeless = 48,
++ DirectXPixelFormat_R8G8UIntNormalized = 49,
++ DirectXPixelFormat_R8G8UInt = 50,
++ DirectXPixelFormat_R8G8IntNormalized = 51,
++ DirectXPixelFormat_R8G8Int = 52,
++ DirectXPixelFormat_R16Typeless = 53,
++ DirectXPixelFormat_R16Float = 54,
++ DirectXPixelFormat_D16UIntNormalized = 55,
++ DirectXPixelFormat_R16UIntNormalized = 56,
++ DirectXPixelFormat_R16UInt = 57,
++ DirectXPixelFormat_R16IntNormalized = 58,
++ DirectXPixelFormat_R16Int = 59,
++ DirectXPixelFormat_R8Typeless = 60,
++ DirectXPixelFormat_R8UIntNormalized = 61,
++ DirectXPixelFormat_R8UInt = 62,
++ DirectXPixelFormat_R8IntNormalized = 63,
++ DirectXPixelFormat_R8Int = 64,
++ DirectXPixelFormat_A8UIntNormalized = 65,
++ DirectXPixelFormat_R1UIntNormalized = 66,
++ DirectXPixelFormat_R9G9B9E5SharedExponent = 67,
++ DirectXPixelFormat_R8G8B8G8UIntNormalized = 68,
++ DirectXPixelFormat_G8R8G8B8UIntNormalized = 69,
++ DirectXPixelFormat_BC1Typeless = 70,
++ DirectXPixelFormat_BC1UIntNormalized = 71,
++ DirectXPixelFormat_BC1UIntNormalizedSrgb = 72,
++ DirectXPixelFormat_BC2Typeless = 73,
++ DirectXPixelFormat_BC2UIntNormalized = 74,
++ DirectXPixelFormat_BC2UIntNormalizedSrgb = 75,
++ DirectXPixelFormat_BC3Typeless = 76,
++ DirectXPixelFormat_BC3UIntNormalized = 77,
++ DirectXPixelFormat_BC3UIntNormalizedSrgb = 78,
++ DirectXPixelFormat_BC4Typeless = 79,
++ DirectXPixelFormat_BC4UIntNormalized = 80,
++ DirectXPixelFormat_BC4IntNormalized = 81,
++ DirectXPixelFormat_BC5Typeless = 82,
++ DirectXPixelFormat_BC5UIntNormalized = 83,
++ DirectXPixelFormat_BC5IntNormalized = 84,
++ DirectXPixelFormat_B5G6R5UIntNormalized = 85,
++ DirectXPixelFormat_B5G5R5A1UIntNormalized = 86,
++ DirectXPixelFormat_B8G8R8A8UIntNormalized = 87,
++ DirectXPixelFormat_B8G8R8X8UIntNormalized = 88,
++ DirectXPixelFormat_R10G10B10XRBiasA2UIntNormalized = 89,
++ DirectXPixelFormat_B8G8R8A8Typeless = 90,
++ DirectXPixelFormat_B8G8R8A8UIntNormalizedSrgb = 91,
++ DirectXPixelFormat_B8G8R8X8Typeless = 92,
++ DirectXPixelFormat_B8G8R8X8UIntNormalizedSrgb = 93,
++ DirectXPixelFormat_BC6HTypeless = 94,
++ DirectXPixelFormat_BC6H16UnsignedFloat = 95,
++ DirectXPixelFormat_BC6H16Float = 96,
++ DirectXPixelFormat_BC7Typeless = 97,
++ DirectXPixelFormat_BC7UIntNormalized = 98,
++ DirectXPixelFormat_BC7UIntNormalizedSrgb = 99,
++ DirectXPixelFormat_Ayuv = 100,
++ DirectXPixelFormat_Y410 = 101,
++ DirectXPixelFormat_Y416 = 102,
++ DirectXPixelFormat_NV12 = 103,
++ DirectXPixelFormat_P010 = 104,
++ DirectXPixelFormat_P016 = 105,
++ DirectXPixelFormat_Opaque420 = 106,
++ DirectXPixelFormat_Yuy2 = 107,
++ DirectXPixelFormat_Y210 = 108,
++ DirectXPixelFormat_Y216 = 109,
++ DirectXPixelFormat_NV11 = 110,
++ DirectXPixelFormat_AI44 = 111,
++ DirectXPixelFormat_IA44 = 112,
++ DirectXPixelFormat_P8 = 113,
++ DirectXPixelFormat_A8P8 = 114,
++ DirectXPixelFormat_B4G4R4A4UIntNormalized = 115,
++ DirectXPixelFormat_P208 = 130,
++ DirectXPixelFormat_V208 = 131,
++ DirectXPixelFormat_V408 = 132
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++enum __x_ABI_CWindows_CGraphics_CDirectX_CDirectXPixelFormat {
++ DirectXPixelFormat_Unknown = 0,
++ DirectXPixelFormat_R32G32B32A32Typeless = 1,
++ DirectXPixelFormat_R32G32B32A32Float = 2,
++ DirectXPixelFormat_R32G32B32A32UInt = 3,
++ DirectXPixelFormat_R32G32B32A32Int = 4,
++ DirectXPixelFormat_R32G32B32Typeless = 5,
++ DirectXPixelFormat_R32G32B32Float = 6,
++ DirectXPixelFormat_R32G32B32UInt = 7,
++ DirectXPixelFormat_R32G32B32Int = 8,
++ DirectXPixelFormat_R16G16B16A16Typeless = 9,
++ DirectXPixelFormat_R16G16B16A16Float = 10,
++ DirectXPixelFormat_R16G16B16A16UIntNormalized = 11,
++ DirectXPixelFormat_R16G16B16A16UInt = 12,
++ DirectXPixelFormat_R16G16B16A16IntNormalized = 13,
++ DirectXPixelFormat_R16G16B16A16Int = 14,
++ DirectXPixelFormat_R32G32Typeless = 15,
++ DirectXPixelFormat_R32G32Float = 16,
++ DirectXPixelFormat_R32G32UInt = 17,
++ DirectXPixelFormat_R32G32Int = 18,
++ DirectXPixelFormat_R32G8X24Typeless = 19,
++ DirectXPixelFormat_D32FloatS8X24UInt = 20,
++ DirectXPixelFormat_R32FloatX8X24Typeless = 21,
++ DirectXPixelFormat_X32TypelessG8X24UInt = 22,
++ DirectXPixelFormat_R10G10B10A2Typeless = 23,
++ DirectXPixelFormat_R10G10B10A2UIntNormalized = 24,
++ DirectXPixelFormat_R10G10B10A2UInt = 25,
++ DirectXPixelFormat_R11G11B10Float = 26,
++ DirectXPixelFormat_R8G8B8A8Typeless = 27,
++ DirectXPixelFormat_R8G8B8A8UIntNormalized = 28,
++ DirectXPixelFormat_R8G8B8A8UIntNormalizedSrgb = 29,
++ DirectXPixelFormat_R8G8B8A8UInt = 30,
++ DirectXPixelFormat_R8G8B8A8IntNormalized = 31,
++ DirectXPixelFormat_R8G8B8A8Int = 32,
++ DirectXPixelFormat_R16G16Typeless = 33,
++ DirectXPixelFormat_R16G16Float = 34,
++ DirectXPixelFormat_R16G16UIntNormalized = 35,
++ DirectXPixelFormat_R16G16UInt = 36,
++ DirectXPixelFormat_R16G16IntNormalized = 37,
++ DirectXPixelFormat_R16G16Int = 38,
++ DirectXPixelFormat_R32Typeless = 39,
++ DirectXPixelFormat_D32Float = 40,
++ DirectXPixelFormat_R32Float = 41,
++ DirectXPixelFormat_R32UInt = 42,
++ DirectXPixelFormat_R32Int = 43,
++ DirectXPixelFormat_R24G8Typeless = 44,
++ DirectXPixelFormat_D24UIntNormalizedS8UInt = 45,
++ DirectXPixelFormat_R24UIntNormalizedX8Typeless = 46,
++ DirectXPixelFormat_X24TypelessG8UInt = 47,
++ DirectXPixelFormat_R8G8Typeless = 48,
++ DirectXPixelFormat_R8G8UIntNormalized = 49,
++ DirectXPixelFormat_R8G8UInt = 50,
++ DirectXPixelFormat_R8G8IntNormalized = 51,
++ DirectXPixelFormat_R8G8Int = 52,
++ DirectXPixelFormat_R16Typeless = 53,
++ DirectXPixelFormat_R16Float = 54,
++ DirectXPixelFormat_D16UIntNormalized = 55,
++ DirectXPixelFormat_R16UIntNormalized = 56,
++ DirectXPixelFormat_R16UInt = 57,
++ DirectXPixelFormat_R16IntNormalized = 58,
++ DirectXPixelFormat_R16Int = 59,
++ DirectXPixelFormat_R8Typeless = 60,
++ DirectXPixelFormat_R8UIntNormalized = 61,
++ DirectXPixelFormat_R8UInt = 62,
++ DirectXPixelFormat_R8IntNormalized = 63,
++ DirectXPixelFormat_R8Int = 64,
++ DirectXPixelFormat_A8UIntNormalized = 65,
++ DirectXPixelFormat_R1UIntNormalized = 66,
++ DirectXPixelFormat_R9G9B9E5SharedExponent = 67,
++ DirectXPixelFormat_R8G8B8G8UIntNormalized = 68,
++ DirectXPixelFormat_G8R8G8B8UIntNormalized = 69,
++ DirectXPixelFormat_BC1Typeless = 70,
++ DirectXPixelFormat_BC1UIntNormalized = 71,
++ DirectXPixelFormat_BC1UIntNormalizedSrgb = 72,
++ DirectXPixelFormat_BC2Typeless = 73,
++ DirectXPixelFormat_BC2UIntNormalized = 74,
++ DirectXPixelFormat_BC2UIntNormalizedSrgb = 75,
++ DirectXPixelFormat_BC3Typeless = 76,
++ DirectXPixelFormat_BC3UIntNormalized = 77,
++ DirectXPixelFormat_BC3UIntNormalizedSrgb = 78,
++ DirectXPixelFormat_BC4Typeless = 79,
++ DirectXPixelFormat_BC4UIntNormalized = 80,
++ DirectXPixelFormat_BC4IntNormalized = 81,
++ DirectXPixelFormat_BC5Typeless = 82,
++ DirectXPixelFormat_BC5UIntNormalized = 83,
++ DirectXPixelFormat_BC5IntNormalized = 84,
++ DirectXPixelFormat_B5G6R5UIntNormalized = 85,
++ DirectXPixelFormat_B5G5R5A1UIntNormalized = 86,
++ DirectXPixelFormat_B8G8R8A8UIntNormalized = 87,
++ DirectXPixelFormat_B8G8R8X8UIntNormalized = 88,
++ DirectXPixelFormat_R10G10B10XRBiasA2UIntNormalized = 89,
++ DirectXPixelFormat_B8G8R8A8Typeless = 90,
++ DirectXPixelFormat_B8G8R8A8UIntNormalizedSrgb = 91,
++ DirectXPixelFormat_B8G8R8X8Typeless = 92,
++ DirectXPixelFormat_B8G8R8X8UIntNormalizedSrgb = 93,
++ DirectXPixelFormat_BC6HTypeless = 94,
++ DirectXPixelFormat_BC6H16UnsignedFloat = 95,
++ DirectXPixelFormat_BC6H16Float = 96,
++ DirectXPixelFormat_BC7Typeless = 97,
++ DirectXPixelFormat_BC7UIntNormalized = 98,
++ DirectXPixelFormat_BC7UIntNormalizedSrgb = 99,
++ DirectXPixelFormat_Ayuv = 100,
++ DirectXPixelFormat_Y410 = 101,
++ DirectXPixelFormat_Y416 = 102,
++ DirectXPixelFormat_NV12 = 103,
++ DirectXPixelFormat_P010 = 104,
++ DirectXPixelFormat_P016 = 105,
++ DirectXPixelFormat_Opaque420 = 106,
++ DirectXPixelFormat_Yuy2 = 107,
++ DirectXPixelFormat_Y210 = 108,
++ DirectXPixelFormat_Y216 = 109,
++ DirectXPixelFormat_NV11 = 110,
++ DirectXPixelFormat_AI44 = 111,
++ DirectXPixelFormat_IA44 = 112,
++ DirectXPixelFormat_P8 = 113,
++ DirectXPixelFormat_A8P8 = 114,
++ DirectXPixelFormat_B4G4R4A4UIntNormalized = 115,
++ DirectXPixelFormat_P208 = 130,
++ DirectXPixelFormat_V208 = 131,
++ DirectXPixelFormat_V408 = 132
++};
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Graphics {
++ namespace DirectX {
++typedef enum DirectXPixelFormat DirectXPixelFormat;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++/* Begin additional prototypes for all interfaces */
++
++
++/* End additional prototypes */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __windows_graphics_directx_h__ */
+diff --git a/mingw-w64-headers/include/windows.graphics.effects.h b/mingw-w64-headers/include/windows.graphics.effects.h
+new file mode 100644
+index 00000000..7c6e62a5
+--- /dev/null
++++ b/mingw-w64-headers/include/windows.graphics.effects.h
+@@ -0,0 +1,184 @@
++/*** Autogenerated by WIDL 4.4 from windows.graphics.effects.idl - Do not edit ***/
++
++#ifdef _WIN32
++#ifndef __REQUIRED_RPCNDR_H_VERSION__
++#define __REQUIRED_RPCNDR_H_VERSION__ 475
++#endif
++#include <rpc.h>
++#include <rpcndr.h>
++#endif
++
++#ifndef COM_NO_WINDOWS_H
++#include <windows.h>
++#include <ole2.h>
++#endif
++
++#ifndef __windows_graphics_effects_h__
++#define __windows_graphics_effects_h__
++
++/* Forward declarations */
++
++#ifndef ____x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_FWD_DEFINED__
++#define ____x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Graphics {
++ namespace Effects {
++ interface IGraphicsEffect;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++/* Headers for imported files */
++
++#include <inspectable.h>
++#include <windows.foundation.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*****************************************************************************
++ * IGraphicsEffect interface
++ */
++#ifndef ____x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect, 0xcb51c0ce, 0x8fe6, 0x4636, 0xb2,0x02, 0x86,0x1f,0xaa,0x07,0xd8,0xf3);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Graphics {
++ namespace Effects {
++ MIDL_INTERFACE("cb51c0ce-8fe6-4636-b202-861faa07d8f3")
++ IGraphicsEffect : public IInspectable
++ {
++ virtual HRESULT STDMETHODCALLTYPE get_Name(
++ HSTRING *name) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Name(
++ HSTRING name) = 0;
++
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::Graphics::Effects::IGraphicsEffect, 0xcb51c0ce, 0x8fe6, 0x4636, 0xb2,0x02, 0x86,0x1f,0xaa,0x07,0xd8,0xf3)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffectVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This,
++ TrustLevel *trustLevel);
++
++ /*** IGraphicsEffect methods ***/
++ HRESULT (STDMETHODCALLTYPE *get_Name)(
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This,
++ HSTRING *name);
++
++ HRESULT (STDMETHODCALLTYPE *put_Name)(
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This,
++ HSTRING name);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffectVtbl;
++
++interface __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect {
++ CONST_VTBL __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffectVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++/*** IGraphicsEffect methods ***/
++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_QueryInterface(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_AddRef(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_Release(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_GetIids(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_GetTrustLevel(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++/*** IGraphicsEffect methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_get_Name(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This,HSTRING *name) {
++ return This->lpVtbl->get_Name(This,name);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_put_Name(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This,HSTRING name) {
++ return This->lpVtbl->put_Name(This,name);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_INTERFACE_DEFINED__ */
++
++/* Begin additional prototypes for all interfaces */
++
++ULONG __RPC_USER HSTRING_UserSize (ULONG *, ULONG, HSTRING *);
++unsigned char * __RPC_USER HSTRING_UserMarshal (ULONG *, unsigned char *, HSTRING *);
++unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
++void __RPC_USER HSTRING_UserFree (ULONG *, HSTRING *);
++
++/* End additional prototypes */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __windows_graphics_effects_h__ */
+diff --git a/mingw-w64-headers/include/windows.ui.composition.h b/mingw-w64-headers/include/windows.ui.composition.h
+new file mode 100644
+index 00000000..9410a3ce
+--- /dev/null
++++ b/mingw-w64-headers/include/windows.ui.composition.h
+@@ -0,0 +1,3212 @@
++/*** Autogenerated by WIDL 4.4 from windows.ui.composition.idl - Do not edit ***/
++
++#ifdef _WIN32
++#ifndef __REQUIRED_RPCNDR_H_VERSION__
++#define __REQUIRED_RPCNDR_H_VERSION__ 475
++#endif
++#include <rpc.h>
++#include <rpcndr.h>
++#endif
++
++#ifndef COM_NO_WINDOWS_H
++#include <windows.h>
++#include <ole2.h>
++#endif
++
++#ifndef __windows_ui_composition_h__
++#define __windows_ui_composition_h__
++
++/* Forward declarations */
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionBrush __x_ABI_CWindows_CUI_CComposition_CICompositionBrush;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ICompositionBrush;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurface __x_ABI_CWindows_CUI_CComposition_CICompositionSurface;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ICompositionSurface;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ICompositionSurfaceBrush;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionBrush_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionBrush_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionBrush __x_ABI_CWindows_CUI_CComposition_CCompositionBrush;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionBrush;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CISpriteVisual __x_ABI_CWindows_CUI_CComposition_CISpriteVisual;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ISpriteVisual;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CSpriteVisual_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CSpriteVisual_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CSpriteVisual __x_ABI_CWindows_CUI_CComposition_CSpriteVisual;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface SpriteVisual;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionClip_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionClip_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionClip __x_ABI_CWindows_CUI_CComposition_CCompositionClip;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionClip;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CContainerVisual_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CContainerVisual_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CContainerVisual __x_ABI_CWindows_CUI_CComposition_CContainerVisual;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ContainerVisual;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVisual_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CIVisual_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CIVisual __x_ABI_CWindows_CUI_CComposition_CIVisual;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface IVisual;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositor_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositor_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositor __x_ABI_CWindows_CUI_CComposition_CCompositor;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface Compositor;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionPropertySet;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionAnimation;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionObject __x_ABI_CWindows_CUI_CComposition_CICompositionObject;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ICompositionObject;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ColorKeyFrameAnimation;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionColorBrush;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CubicBezierEasingFunction;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositor_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositor_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositor __x_ABI_CWindows_CUI_CComposition_CICompositor;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ICompositor;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ICompositionGraphicsDevice;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++/* Headers for imported files */
++
++#include <inspectable.h>
++#include <windows.foundation.h>
++#include <windows.foundation.numerics.h>
++#include <windows.graphics.directx.h>
++#include <windows.graphics.effects.h>
++#include <windows.ui.h>
++#include <windows.ui.core.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ enum CompositionBitmapInterpolationMode {
++ CompositionBitmapInterpolationMode_NearestNeighbor = 0,
++ CompositionBitmapInterpolationMode_Linear = 1
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++enum __x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode {
++ CompositionBitmapInterpolationMode_NearestNeighbor = 0,
++ CompositionBitmapInterpolationMode_Linear = 1
++};
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++typedef enum CompositionBitmapInterpolationMode CompositionBitmapInterpolationMode;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ enum CompositionStretch {
++ CompositionStretch_None = 0,
++ CompositionStretch_Fill = 1,
++ CompositionStretch_Uniform = 2,
++ CompositionStretch_UniformToFill = 3
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++enum __x_ABI_CWindows_CUI_CComposition_CCompositionStretch {
++ CompositionStretch_None = 0,
++ CompositionStretch_Fill = 1,
++ CompositionStretch_Uniform = 2,
++ CompositionStretch_UniformToFill = 3
++};
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++typedef enum CompositionStretch CompositionStretch;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ enum CompositionBackfaceVisibility {
++ CompositionBackfaceVisibility_Inherit = 0,
++ CompositionBackfaceVisibility_Visible = 1,
++ CompositionBackfaceVisibility_Hidden = 2
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++enum __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility {
++ CompositionBackfaceVisibility_Inherit = 0,
++ CompositionBackfaceVisibility_Visible = 1,
++ CompositionBackfaceVisibility_Hidden = 2
++};
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++typedef enum CompositionBackfaceVisibility CompositionBackfaceVisibility;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ enum CompositionBorderMode {
++ CompositionBorderMode_Inherit = 0,
++ CompositionBorderMode_Soft = 1,
++ CompositionBorderMode_Hard = 2
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++enum __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode {
++ CompositionBorderMode_Inherit = 0,
++ CompositionBorderMode_Soft = 1,
++ CompositionBorderMode_Hard = 2
++};
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++typedef enum CompositionBorderMode CompositionBorderMode;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ enum CompositionCompositeMode {
++ CompositionCompositeMode_Inherit = 0,
++ CompositionCompositeMode_SourceOver = 1,
++ CompositionCompositeMode_DestinationInvert = 2,
++ CompositionCompositeMode_MinBlend = 3
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++enum __x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode {
++ CompositionCompositeMode_Inherit = 0,
++ CompositionCompositeMode_SourceOver = 1,
++ CompositionCompositeMode_DestinationInvert = 2,
++ CompositionCompositeMode_MinBlend = 3
++};
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++typedef enum CompositionCompositeMode CompositionCompositeMode;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ enum CompositionBatchTypes {
++ CompositionBatchTypes_None = 0x0,
++ CompositionBatchTypes_Animation = 0x1,
++ CompositionBatchTypes_Effect = 0x2
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++enum __x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes {
++ CompositionBatchTypes_None = 0x0,
++ CompositionBatchTypes_Animation = 0x1,
++ CompositionBatchTypes_Effect = 0x2
++};
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++typedef enum CompositionBatchTypes CompositionBatchTypes;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++/*****************************************************************************
++ * ICompositionBrush interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionBrush, 0xab0d7608, 0x30c0, 0x40e9, 0xb5,0x68, 0xb6,0x0a,0x6b,0xd1,0xfb,0x46);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("ab0d7608-30c0-40e9-b568-b60a6bd1fb46")
++ ICompositionBrush : public IInspectable
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositionBrush, 0xab0d7608, 0x30c0, 0x40e9, 0xb5,0x68, 0xb6,0x0a,0x6b,0xd1,0xfb,0x46)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionBrushVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This,
++ TrustLevel *trustLevel);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CICompositionBrushVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CICompositionBrush {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionBrushVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * ICompositionSurface interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionSurface, 0x1527540d, 0x42c7, 0x47a6, 0xa4,0x08, 0x66,0x8f,0x79,0xa9,0x0d,0xfb);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("1527540d-42c7-47a6-a408-668f79a90dfb")
++ ICompositionSurface : public IInspectable
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositionSurface, 0x1527540d, 0x42c7, 0x47a6, 0xa4,0x08, 0x66,0x8f,0x79,0xa9,0x0d,0xfb)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This,
++ TrustLevel *trustLevel);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurface {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * ICompositionSurfaceBrush interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush, 0xad016d79, 0x1e4c, 0x4c0d, 0x9c,0x29, 0x83,0x33,0x8c,0x87,0xc1,0x62);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("ad016d79-1e4c-4c0d-9c29-83338c87c162")
++ ICompositionSurfaceBrush : public IInspectable
++ {
++ virtual HRESULT STDMETHODCALLTYPE get_BitmapInterpolationMode(
++ ABI::Windows::UI::Composition::CompositionBitmapInterpolationMode *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_BitmapInterpolationMode(
++ ABI::Windows::UI::Composition::CompositionBitmapInterpolationMode value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_HorizontalAlignmentRatio(
++ FLOAT *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_HorizontalAlignmentRatio(
++ FLOAT value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Stretch(
++ ABI::Windows::UI::Composition::CompositionStretch *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Stretch(
++ ABI::Windows::UI::Composition::CompositionStretch value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Surface(
++ ABI::Windows::UI::Composition::ICompositionSurface **value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Surface(
++ ABI::Windows::UI::Composition::ICompositionSurface *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_VerticalAlignmentRatio(
++ FLOAT *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_VerticalAlignmentRatio(
++ FLOAT value) = 0;
++
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositionSurfaceBrush, 0xad016d79, 0x1e4c, 0x4c0d, 0x9c,0x29, 0x83,0x33,0x8c,0x87,0xc1,0x62)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrushVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ TrustLevel *trustLevel);
++
++ /*** ICompositionSurfaceBrush methods ***/
++ HRESULT (STDMETHODCALLTYPE *get_BitmapInterpolationMode)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_BitmapInterpolationMode)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode value);
++
++ HRESULT (STDMETHODCALLTYPE *get_HorizontalAlignmentRatio)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ FLOAT *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_HorizontalAlignmentRatio)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ FLOAT value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Stretch)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionStretch *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_Stretch)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionStretch value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Surface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface **value);
++
++ HRESULT (STDMETHODCALLTYPE *put_Surface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *value);
++
++ HRESULT (STDMETHODCALLTYPE *get_VerticalAlignmentRatio)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ FLOAT *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_VerticalAlignmentRatio)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ FLOAT value);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrushVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrushVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++/*** ICompositionSurfaceBrush methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_BitmapInterpolationMode(This,value) (This)->lpVtbl->get_BitmapInterpolationMode(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_BitmapInterpolationMode(This,value) (This)->lpVtbl->put_BitmapInterpolationMode(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_HorizontalAlignmentRatio(This,value) (This)->lpVtbl->get_HorizontalAlignmentRatio(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_HorizontalAlignmentRatio(This,value) (This)->lpVtbl->put_HorizontalAlignmentRatio(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Stretch(This,value) (This)->lpVtbl->get_Stretch(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Stretch(This,value) (This)->lpVtbl->put_Stretch(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Surface(This,value) (This)->lpVtbl->get_Surface(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Surface(This,value) (This)->lpVtbl->put_Surface(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_VerticalAlignmentRatio(This,value) (This)->lpVtbl->get_VerticalAlignmentRatio(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_VerticalAlignmentRatio(This,value) (This)->lpVtbl->put_VerticalAlignmentRatio(This,value)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++/*** ICompositionSurfaceBrush methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_BitmapInterpolationMode(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode *value) {
++ return This->lpVtbl->get_BitmapInterpolationMode(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_BitmapInterpolationMode(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode value) {
++ return This->lpVtbl->put_BitmapInterpolationMode(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_HorizontalAlignmentRatio(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,FLOAT *value) {
++ return This->lpVtbl->get_HorizontalAlignmentRatio(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_HorizontalAlignmentRatio(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,FLOAT value) {
++ return This->lpVtbl->put_HorizontalAlignmentRatio(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Stretch(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CCompositionStretch *value) {
++ return This->lpVtbl->get_Stretch(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Stretch(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CCompositionStretch value) {
++ return This->lpVtbl->put_Stretch(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Surface(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CICompositionSurface **value) {
++ return This->lpVtbl->get_Surface(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Surface(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CICompositionSurface *value) {
++ return This->lpVtbl->put_Surface(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_VerticalAlignmentRatio(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,FLOAT *value) {
++ return This->lpVtbl->get_VerticalAlignmentRatio(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_VerticalAlignmentRatio(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,FLOAT value) {
++ return This->lpVtbl->put_VerticalAlignmentRatio(This,value);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * CompositionBrush interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionBrush_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionBrush_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCompositionBrush, 0x08e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3c);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("08e05581-1ad1-4f97-9666-402d76e4233c")
++ CompositionBrush : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::CompositionBrush, 0x08e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3c)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionBrushVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBrush *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBrush *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBrush *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CCompositionBrushVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CCompositionBrush {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCompositionBrushVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionBrush_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCompositionBrush_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCompositionBrush* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CCompositionBrush* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionBrush_Release(__x_ABI_CWindows_CUI_CComposition_CCompositionBrush* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCompositionBrush_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * ISpriteVisual interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CISpriteVisual, 0x08e05581, 0x1ad1, 0x4f97, 0x97,0x57, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("08e05581-1ad1-4f97-9757-402d76e4233b")
++ ISpriteVisual : public IInspectable
++ {
++ virtual HRESULT STDMETHODCALLTYPE get_Brush(
++ ABI::Windows::UI::Composition::CompositionBrush **value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Brush(
++ ABI::Windows::UI::Composition::ICompositionBrush *value) = 0;
++
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ISpriteVisual, 0x08e05581, 0x1ad1, 0x4f97, 0x97,0x57, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CISpriteVisualVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This,
++ TrustLevel *trustLevel);
++
++ /*** ISpriteVisual methods ***/
++ HRESULT (STDMETHODCALLTYPE *get_Brush)(
++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBrush **value);
++
++ HRESULT (STDMETHODCALLTYPE *put_Brush)(
++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *value);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CISpriteVisualVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CISpriteVisual {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CISpriteVisualVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++/*** ISpriteVisual methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_get_Brush(This,value) (This)->lpVtbl->get_Brush(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_put_Brush(This,value) (This)->lpVtbl->put_Brush(This,value)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_AddRef(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_Release(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetIids(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++/*** ISpriteVisual methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_get_Brush(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBrush **value) {
++ return This->lpVtbl->get_Brush(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_put_Brush(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,__x_ABI_CWindows_CUI_CComposition_CICompositionBrush *value) {
++ return This->lpVtbl->put_Brush(This,value);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * SpriteVisual interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CSpriteVisual_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CSpriteVisual_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CSpriteVisual, 0x08e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("08e05581-1ad1-4f97-9666-402d76e4233b")
++ SpriteVisual : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::SpriteVisual, 0x08e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CSpriteVisualVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CSpriteVisual *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CSpriteVisual *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CSpriteVisual *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CSpriteVisualVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CSpriteVisual {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CSpriteVisualVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CSpriteVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CSpriteVisual_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CSpriteVisual_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CSpriteVisual_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CSpriteVisual* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CSpriteVisual_AddRef(__x_ABI_CWindows_CUI_CComposition_CSpriteVisual* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CSpriteVisual_Release(__x_ABI_CWindows_CUI_CComposition_CSpriteVisual* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CSpriteVisual_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * CompositionClip interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionClip_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionClip_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCompositionClip, 0x18e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("18e05581-1ad1-4f97-9666-402d76e4233b")
++ CompositionClip : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::CompositionClip, 0x18e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionClipVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionClip *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionClip *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionClip *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CCompositionClipVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CCompositionClip {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCompositionClipVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionClip_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionClip_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionClip_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCompositionClip_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCompositionClip* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionClip_AddRef(__x_ABI_CWindows_CUI_CComposition_CCompositionClip* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionClip_Release(__x_ABI_CWindows_CUI_CComposition_CCompositionClip* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCompositionClip_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * ContainerVisual interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CContainerVisual_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CContainerVisual_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CContainerVisual, 0x28e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("28e05581-1ad1-4f97-9666-402d76e4233b")
++ ContainerVisual : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ContainerVisual, 0x28e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CContainerVisualVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CContainerVisual *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CContainerVisual *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CContainerVisual *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CContainerVisualVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CContainerVisual {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CContainerVisualVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CContainerVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CContainerVisual_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CContainerVisual_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CContainerVisual_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CContainerVisual* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CContainerVisual_AddRef(__x_ABI_CWindows_CUI_CComposition_CContainerVisual* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CContainerVisual_Release(__x_ABI_CWindows_CUI_CComposition_CContainerVisual* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CContainerVisual_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * IVisual interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVisual_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CIVisual_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CIVisual, 0x117e202d, 0xa859, 0x4c89, 0x87,0x3b, 0xc2,0xaa,0x56,0x67,0x88,0xe3);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("117e202d-a859-4c89-873b-c2aa566788e3")
++ IVisual : public IInspectable
++ {
++ virtual HRESULT STDMETHODCALLTYPE get_AnchorPoint(
++ ABI::Windows::Foundation::Numerics::Vector2 *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_AnchorPoint(
++ ABI::Windows::Foundation::Numerics::Vector2 value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_BackfaceVisibility(
++ ABI::Windows::UI::Composition::CompositionBackfaceVisibility *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_BackfaceVisibility(
++ ABI::Windows::UI::Composition::CompositionBackfaceVisibility value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_BorderMode(
++ ABI::Windows::UI::Composition::CompositionBorderMode *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_BorderMode(
++ ABI::Windows::UI::Composition::CompositionBorderMode value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_CenterPoint(
++ ABI::Windows::Foundation::Numerics::Vector3 *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_CenterPoint(
++ ABI::Windows::Foundation::Numerics::Vector3 value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Clip(
++ ABI::Windows::UI::Composition::CompositionClip **value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Clip(
++ ABI::Windows::UI::Composition::CompositionClip *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_CompositeMode(
++ ABI::Windows::UI::Composition::CompositionCompositeMode *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_CompositeMode(
++ ABI::Windows::UI::Composition::CompositionCompositeMode value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_IsVisible(
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_IsVisible(
++ boolean value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Offset(
++ ABI::Windows::Foundation::Numerics::Vector3 *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Offset(
++ ABI::Windows::Foundation::Numerics::Vector3 value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Opacity(
++ FLOAT *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Opacity(
++ FLOAT value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Orientation(
++ ABI::Windows::Foundation::Numerics::Quaternion *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Orientation(
++ ABI::Windows::Foundation::Numerics::Quaternion value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Parent(
++ ABI::Windows::UI::Composition::ContainerVisual **value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_RotationAngle(
++ FLOAT *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_RotationAngle(
++ FLOAT value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_RotationAngleInDegrees(
++ FLOAT *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_RotationAngleInDegrees(
++ FLOAT value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_RotationAxis(
++ ABI::Windows::Foundation::Numerics::Vector3 *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_RotationAxis(
++ ABI::Windows::Foundation::Numerics::Vector3 value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Scale(
++ ABI::Windows::Foundation::Numerics::Vector3 *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Scale(
++ ABI::Windows::Foundation::Numerics::Vector3 value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Size(
++ ABI::Windows::Foundation::Numerics::Vector2 *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Size(
++ ABI::Windows::Foundation::Numerics::Vector2 value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_TransformMatrix(
++ ABI::Windows::Foundation::Numerics::Matrix4x4 *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_TransformMatrix(
++ ABI::Windows::Foundation::Numerics::Matrix4x4 value) = 0;
++
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::IVisual, 0x117e202d, 0xa859, 0x4c89, 0x87,0x3b, 0xc2,0xaa,0x56,0x67,0x88,0xe3)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CIVisualVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ TrustLevel *trustLevel);
++
++ /*** IVisual methods ***/
++ HRESULT (STDMETHODCALLTYPE *get_AnchorPoint)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_AnchorPoint)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value);
++
++ HRESULT (STDMETHODCALLTYPE *get_BackfaceVisibility)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_BackfaceVisibility)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility value);
++
++ HRESULT (STDMETHODCALLTYPE *get_BorderMode)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_BorderMode)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode value);
++
++ HRESULT (STDMETHODCALLTYPE *get_CenterPoint)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_CenterPoint)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Clip)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionClip **value);
++
++ HRESULT (STDMETHODCALLTYPE *put_Clip)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionClip *value);
++
++ HRESULT (STDMETHODCALLTYPE *get_CompositeMode)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_CompositeMode)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode value);
++
++ HRESULT (STDMETHODCALLTYPE *get_IsVisible)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_IsVisible)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ boolean value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Offset)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_Offset)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Opacity)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ FLOAT *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_Opacity)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ FLOAT value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Orientation)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_Orientation)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Parent)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CContainerVisual **value);
++
++ HRESULT (STDMETHODCALLTYPE *get_RotationAngle)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ FLOAT *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_RotationAngle)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ FLOAT value);
++
++ HRESULT (STDMETHODCALLTYPE *get_RotationAngleInDegrees)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ FLOAT *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_RotationAngleInDegrees)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ FLOAT value);
++
++ HRESULT (STDMETHODCALLTYPE *get_RotationAxis)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_RotationAxis)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Scale)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_Scale)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Size)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_Size)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value);
++
++ HRESULT (STDMETHODCALLTYPE *get_TransformMatrix)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_TransformMatrix)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 value);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CIVisualVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CIVisual {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CIVisualVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++/*** IVisual methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_AnchorPoint(This,value) (This)->lpVtbl->get_AnchorPoint(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_AnchorPoint(This,value) (This)->lpVtbl->put_AnchorPoint(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BackfaceVisibility(This,value) (This)->lpVtbl->get_BackfaceVisibility(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BackfaceVisibility(This,value) (This)->lpVtbl->put_BackfaceVisibility(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BorderMode(This,value) (This)->lpVtbl->get_BorderMode(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BorderMode(This,value) (This)->lpVtbl->put_BorderMode(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CenterPoint(This,value) (This)->lpVtbl->get_CenterPoint(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CenterPoint(This,value) (This)->lpVtbl->put_CenterPoint(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Clip(This,value) (This)->lpVtbl->get_Clip(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Clip(This,value) (This)->lpVtbl->put_Clip(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CompositeMode(This,value) (This)->lpVtbl->get_CompositeMode(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CompositeMode(This,value) (This)->lpVtbl->put_CompositeMode(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_IsVisible(This,value) (This)->lpVtbl->get_IsVisible(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_IsVisible(This,value) (This)->lpVtbl->put_IsVisible(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Offset(This,value) (This)->lpVtbl->get_Offset(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Offset(This,value) (This)->lpVtbl->put_Offset(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Opacity(This,value) (This)->lpVtbl->get_Opacity(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Opacity(This,value) (This)->lpVtbl->put_Opacity(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Orientation(This,value) (This)->lpVtbl->get_Orientation(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Orientation(This,value) (This)->lpVtbl->put_Orientation(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Parent(This,value) (This)->lpVtbl->get_Parent(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAngle(This,value) (This)->lpVtbl->get_RotationAngle(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAngle(This,value) (This)->lpVtbl->put_RotationAngle(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAngleInDegrees(This,value) (This)->lpVtbl->get_RotationAngleInDegrees(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAngleInDegrees(This,value) (This)->lpVtbl->put_RotationAngleInDegrees(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAxis(This,value) (This)->lpVtbl->get_RotationAxis(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAxis(This,value) (This)->lpVtbl->put_RotationAxis(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Scale(This,value) (This)->lpVtbl->get_Scale(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Scale(This,value) (This)->lpVtbl->put_Scale(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Size(This,value) (This)->lpVtbl->put_Size(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_TransformMatrix(This,value) (This)->lpVtbl->get_TransformMatrix(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_TransformMatrix(This,value) (This)->lpVtbl->put_TransformMatrix(This,value)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIVisual_AddRef(__x_ABI_CWindows_CUI_CComposition_CIVisual* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIVisual_Release(__x_ABI_CWindows_CUI_CComposition_CIVisual* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_GetIids(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++/*** IVisual methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_AnchorPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value) {
++ return This->lpVtbl->get_AnchorPoint(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_AnchorPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 value) {
++ return This->lpVtbl->put_AnchorPoint(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BackfaceVisibility(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility *value) {
++ return This->lpVtbl->get_BackfaceVisibility(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BackfaceVisibility(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility value) {
++ return This->lpVtbl->put_BackfaceVisibility(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BorderMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode *value) {
++ return This->lpVtbl->get_BorderMode(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BorderMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode value) {
++ return This->lpVtbl->put_BorderMode(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CenterPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) {
++ return This->lpVtbl->get_CenterPoint(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CenterPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
++ return This->lpVtbl->put_CenterPoint(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Clip(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionClip **value) {
++ return This->lpVtbl->get_Clip(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Clip(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionClip *value) {
++ return This->lpVtbl->put_Clip(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CompositeMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode *value) {
++ return This->lpVtbl->get_CompositeMode(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CompositeMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode value) {
++ return This->lpVtbl->put_CompositeMode(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_IsVisible(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,boolean *value) {
++ return This->lpVtbl->get_IsVisible(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_IsVisible(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,boolean value) {
++ return This->lpVtbl->put_IsVisible(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Offset(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) {
++ return This->lpVtbl->get_Offset(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Offset(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
++ return This->lpVtbl->put_Offset(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Opacity(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT *value) {
++ return This->lpVtbl->get_Opacity(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Opacity(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT value) {
++ return This->lpVtbl->put_Opacity(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Orientation(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CQuaternion *value) {
++ return This->lpVtbl->get_Orientation(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Orientation(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value) {
++ return This->lpVtbl->put_Orientation(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Parent(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CContainerVisual **value) {
++ return This->lpVtbl->get_Parent(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAngle(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT *value) {
++ return This->lpVtbl->get_RotationAngle(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAngle(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT value) {
++ return This->lpVtbl->put_RotationAngle(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAngleInDegrees(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT *value) {
++ return This->lpVtbl->get_RotationAngleInDegrees(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAngleInDegrees(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT value) {
++ return This->lpVtbl->put_RotationAngleInDegrees(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAxis(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) {
++ return This->lpVtbl->get_RotationAxis(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAxis(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
++ return This->lpVtbl->put_RotationAxis(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Scale(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) {
++ return This->lpVtbl->get_Scale(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Scale(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
++ return This->lpVtbl->put_Scale(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Size(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value) {
++ return This->lpVtbl->get_Size(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Size(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 value) {
++ return This->lpVtbl->put_Size(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_TransformMatrix(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 *value) {
++ return This->lpVtbl->get_TransformMatrix(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_TransformMatrix(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 value) {
++ return This->lpVtbl->put_TransformMatrix(This,value);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CIVisual_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * Compositor interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositor_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositor_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCompositor, 0x38e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("38e05581-1ad1-4f97-9666-402d76e4233b")
++ Compositor : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::Compositor, 0x38e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositorVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositor *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositor *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositor *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CCompositorVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CCompositor {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCompositorVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CCompositor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositor_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositor_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCompositor_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCompositor* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositor_AddRef(__x_ABI_CWindows_CUI_CComposition_CCompositor* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositor_Release(__x_ABI_CWindows_CUI_CComposition_CCompositor* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCompositor_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * CompositionPropertySet interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet, 0x38e05582, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("38e05582-1ad1-4f97-9666-402d76e4233b")
++ CompositionPropertySet : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::CompositionPropertySet, 0x38e05582, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySetVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySetVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySetVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_AddRef(__x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_Release(__x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * CompositionAnimation interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCompositionAnimation, 0x38e05582, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("38e05582-1ad2-4f97-9666-402d76e4233b")
++ CompositionAnimation : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::CompositionAnimation, 0x38e05582, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionAnimationVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CCompositionAnimationVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCompositionAnimationVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCompositionAnimation* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CCompositionAnimation* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CCompositionAnimation* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_INTERFACE_DEFINED__ */
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositor_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositor_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositor __x_ABI_CWindows_CUI_CComposition_CICompositor;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ICompositor;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++/*****************************************************************************
++ * ICompositionObject interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionObject, 0xbcb4ad45, 0x7609, 0x4550, 0x93,0x4f, 0x16,0x00,0x2a,0x68,0xfd,0xed);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("bcb4ad45-7609-4550-934f-16002a68fded")
++ ICompositionObject : public IInspectable
++ {
++ virtual HRESULT STDMETHODCALLTYPE get_Compositor(
++ ABI::Windows::UI::Composition::ICompositor **value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Dispatcher(
++ ABI::Windows::UI::Core::CoreDispatcher **value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Properties(
++ ABI::Windows::UI::Composition::CompositionPropertySet **value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE StartAnimation(
++ HSTRING propertyName,
++ ABI::Windows::UI::Composition::CompositionAnimation *animation) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE StopAnimation(
++ HSTRING propertyName) = 0;
++
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositionObject, 0xbcb4ad45, 0x7609, 0x4550, 0x93,0x4f, 0x16,0x00,0x2a,0x68,0xfd,0xed)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionObjectVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
++ TrustLevel *trustLevel);
++
++ /*** ICompositionObject methods ***/
++ HRESULT (STDMETHODCALLTYPE *get_Compositor)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
++ __x_ABI_CWindows_CUI_CComposition_CICompositor **value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Dispatcher)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
++ __x_ABI_CWindows_CUI_CCore_CCoreDispatcher **value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Properties)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet **value);
++
++ HRESULT (STDMETHODCALLTYPE *StartAnimation)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
++ HSTRING propertyName,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation *animation);
++
++ HRESULT (STDMETHODCALLTYPE *StopAnimation)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
++ HSTRING propertyName);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CICompositionObjectVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CICompositionObject {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionObjectVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++/*** ICompositionObject methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Compositor(This,value) (This)->lpVtbl->get_Compositor(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Dispatcher(This,value) (This)->lpVtbl->get_Dispatcher(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Properties(This,value) (This)->lpVtbl->get_Properties(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_StartAnimation(This,propertyName,animation) (This)->lpVtbl->StartAnimation(This,propertyName,animation)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_StopAnimation(This,propertyName) (This)->lpVtbl->StopAnimation(This,propertyName)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionObject_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionObject_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++/*** ICompositionObject methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Compositor(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,__x_ABI_CWindows_CUI_CComposition_CICompositor **value) {
++ return This->lpVtbl->get_Compositor(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Dispatcher(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,__x_ABI_CWindows_CUI_CCore_CCoreDispatcher **value) {
++ return This->lpVtbl->get_Dispatcher(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Properties(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,__x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet **value) {
++ return This->lpVtbl->get_Properties(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_StartAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,HSTRING propertyName,__x_ABI_CWindows_CUI_CComposition_CCompositionAnimation *animation) {
++ return This->lpVtbl->StartAnimation(This,propertyName,animation);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_StopAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,HSTRING propertyName) {
++ return This->lpVtbl->StopAnimation(This,propertyName);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * ColorKeyFrameAnimation interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation, 0x38e05682, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("38e05682-1ad2-4f97-9666-402d76e4233b")
++ ColorKeyFrameAnimation : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ColorKeyFrameAnimation, 0x38e05682, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimationVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimationVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimationVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * CompositionColorBrush interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush, 0x33e05682, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("33e05682-1ad2-4f97-9666-402d76e4233b")
++ CompositionColorBrush : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::CompositionColorBrush, 0x33e05682, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrushVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrushVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrushVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_Release(__x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * CubicBezierEasingFunction interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction, 0x43e05682, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("43e05682-1ad2-4f97-9666-402d76e4233b")
++ CubicBezierEasingFunction : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::CubicBezierEasingFunction, 0x43e05682, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunctionVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunctionVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunctionVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_AddRef(__x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_Release(__x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_INTERFACE_DEFINED__ */
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionEffectFactory;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CExpressionAnimation_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CExpressionAnimation_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CExpressionAnimation __x_ABI_CWindows_CUI_CComposition_CExpressionAnimation;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ExpressionAnimation;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CInsetClip_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CInsetClip_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CInsetClip __x_ABI_CWindows_CUI_CComposition_CInsetClip;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface InsetClip;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction __x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface LinearEasingFunction;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ScalarKeyFrameAnimation;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface QuaternionKeyFrameAnimation;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch __x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionScopedBatch;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush __x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionSurfaceBrush;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface Vector2KeyFrameAnimation;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface Vector3KeyFrameAnimation;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface Vector4KeyFrameAnimation;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionTarget_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionTarget_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionTarget __x_ABI_CWindows_CUI_CComposition_CCompositionTarget;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionTarget;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch __x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionCommitBatch;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface __x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionDrawingSurface;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++/*****************************************************************************
++ * ICompositor interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositor_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositor_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositor, 0xb403ca50, 0x7f8c, 0x4e83, 0x98,0x5f, 0xcc,0x45,0x06,0x00,0x36,0xd8);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("b403ca50-7f8c-4e83-985f-cc45060036d8")
++ ICompositor : public IInspectable
++ {
++ virtual HRESULT STDMETHODCALLTYPE CreateColorKeyFrameAnimation(
++ ABI::Windows::UI::Composition::ColorKeyFrameAnimation **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateColorBrush(
++ ABI::Windows::UI::Composition::CompositionColorBrush **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateColorBrushWithColor(
++ ABI::Windows::UI::Color color,
++ ABI::Windows::UI::Composition::CompositionColorBrush **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateContainerVisual(
++ ABI::Windows::UI::Composition::ContainerVisual **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateCubicBezierEasingFunction(
++ ABI::Windows::Foundation::Numerics::Vector2 controlPoint1,
++ ABI::Windows::Foundation::Numerics::Vector2 controlPoint2,
++ ABI::Windows::UI::Composition::CubicBezierEasingFunction **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateEffectFactory(
++ ABI::Windows::Graphics::Effects::IGraphicsEffect *graphicsEffect,
++ ABI::Windows::UI::Composition::CompositionEffectFactory **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateEffectFactoryWithProperties(
++ ABI::Windows::Graphics::Effects::IGraphicsEffect *graphicsEffect,
++ int *animatableProperties,
++ ABI::Windows::UI::Composition::CompositionEffectFactory **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateExpressionAnimation(
++ ABI::Windows::UI::Composition::ExpressionAnimation **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateExpressionAnimationWithExpression(
++ HSTRING expression,
++ ABI::Windows::UI::Composition::ExpressionAnimation **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateInsetClip(
++ ABI::Windows::UI::Composition::InsetClip **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateInsetClipWithInsets(
++ FLOAT leftInset,
++ FLOAT topInset,
++ FLOAT rightInset,
++ FLOAT bottomInset,
++ ABI::Windows::UI::Composition::InsetClip **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateLinearEasingFunction(
++ ABI::Windows::UI::Composition::LinearEasingFunction **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreatePropertySet(
++ ABI::Windows::UI::Composition::CompositionPropertySet **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateQuaternionKeyFrameAnimation(
++ ABI::Windows::UI::Composition::QuaternionKeyFrameAnimation **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateScalarKeyFrameAnimation(
++ ABI::Windows::UI::Composition::ScalarKeyFrameAnimation **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateScopedBatch(
++ ABI::Windows::UI::Composition::CompositionBatchTypes batchType,
++ ABI::Windows::UI::Composition::CompositionScopedBatch **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateSpriteVisual(
++ ABI::Windows::UI::Composition::SpriteVisual **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateSurfaceBrush(
++ ABI::Windows::UI::Composition::CompositionSurfaceBrush **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateSurfaceBrushWithSurface(
++ ABI::Windows::UI::Composition::ICompositionSurface *surface,
++ ABI::Windows::UI::Composition::ICompositionSurfaceBrush **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateTargetForCurrentView(
++ ABI::Windows::UI::Composition::CompositionTarget **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateVector2KeyFrameAnimation(
++ ABI::Windows::UI::Composition::Vector2KeyFrameAnimation **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateVector3KeyFrameAnimation(
++ ABI::Windows::UI::Composition::Vector3KeyFrameAnimation **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateVector4KeyFrameAnimation(
++ ABI::Windows::UI::Composition::Vector4KeyFrameAnimation **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE GetCommitBatch(
++ ABI::Windows::UI::Composition::CompositionBatchTypes batchType,
++ ABI::Windows::UI::Composition::CompositionCommitBatch **result) = 0;
++
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositor, 0xb403ca50, 0x7f8c, 0x4e83, 0x98,0x5f, 0xcc,0x45,0x06,0x00,0x36,0xd8)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositorVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ TrustLevel *trustLevel);
++
++ /*** ICompositor methods ***/
++ HRESULT (STDMETHODCALLTYPE *CreateColorKeyFrameAnimation)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateColorBrush)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateColorBrushWithColor)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CColor color,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateContainerVisual)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CContainerVisual **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateCubicBezierEasingFunction)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector2 controlPoint1,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector2 controlPoint2,
++ __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateEffectFactory)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *graphicsEffect,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateEffectFactoryWithProperties)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *graphicsEffect,
++ int *animatableProperties,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateExpressionAnimation)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CExpressionAnimation **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateExpressionAnimationWithExpression)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ HSTRING expression,
++ __x_ABI_CWindows_CUI_CComposition_CExpressionAnimation **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateInsetClip)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CInsetClip **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateInsetClipWithInsets)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ FLOAT leftInset,
++ FLOAT topInset,
++ FLOAT rightInset,
++ FLOAT bottomInset,
++ __x_ABI_CWindows_CUI_CComposition_CInsetClip **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateLinearEasingFunction)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreatePropertySet)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateQuaternionKeyFrameAnimation)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateScalarKeyFrameAnimation)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateScopedBatch)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes batchType,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateSpriteVisual)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CSpriteVisual **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateSurfaceBrush)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateSurfaceBrushWithSurface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *surface,
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateTargetForCurrentView)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionTarget **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateVector2KeyFrameAnimation)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateVector3KeyFrameAnimation)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateVector4KeyFrameAnimation)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation **result);
++
++ HRESULT (STDMETHODCALLTYPE *GetCommitBatch)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes batchType,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch **result);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CICompositorVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CICompositor {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositorVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++/*** ICompositor methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorKeyFrameAnimation(This,result) (This)->lpVtbl->CreateColorKeyFrameAnimation(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrush(This,result) (This)->lpVtbl->CreateColorBrush(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrushWithColor(This,color,result) (This)->lpVtbl->CreateColorBrushWithColor(This,color,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateContainerVisual(This,result) (This)->lpVtbl->CreateContainerVisual(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateCubicBezierEasingFunction(This,controlPoint1,controlPoint2,result) (This)->lpVtbl->CreateCubicBezierEasingFunction(This,controlPoint1,controlPoint2,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateEffectFactory(This,graphicsEffect,result) (This)->lpVtbl->CreateEffectFactory(This,graphicsEffect,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateEffectFactoryWithProperties(This,graphicsEffect,animatableProperties,result) (This)->lpVtbl->CreateEffectFactoryWithProperties(This,graphicsEffect,animatableProperties,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateExpressionAnimation(This,result) (This)->lpVtbl->CreateExpressionAnimation(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateExpressionAnimationWithExpression(This,expression,result) (This)->lpVtbl->CreateExpressionAnimationWithExpression(This,expression,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateInsetClip(This,result) (This)->lpVtbl->CreateInsetClip(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateInsetClipWithInsets(This,leftInset,topInset,rightInset,bottomInset,result) (This)->lpVtbl->CreateInsetClipWithInsets(This,leftInset,topInset,rightInset,bottomInset,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateLinearEasingFunction(This,result) (This)->lpVtbl->CreateLinearEasingFunction(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreatePropertySet(This,result) (This)->lpVtbl->CreatePropertySet(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateQuaternionKeyFrameAnimation(This,result) (This)->lpVtbl->CreateQuaternionKeyFrameAnimation(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScalarKeyFrameAnimation(This,result) (This)->lpVtbl->CreateScalarKeyFrameAnimation(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScopedBatch(This,batchType,result) (This)->lpVtbl->CreateScopedBatch(This,batchType,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSpriteVisual(This,result) (This)->lpVtbl->CreateSpriteVisual(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSurfaceBrush(This,result) (This)->lpVtbl->CreateSurfaceBrush(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSurfaceBrushWithSurface(This,surface,result) (This)->lpVtbl->CreateSurfaceBrushWithSurface(This,surface,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateTargetForCurrentView(This,result) (This)->lpVtbl->CreateTargetForCurrentView(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector2KeyFrameAnimation(This,result) (This)->lpVtbl->CreateVector2KeyFrameAnimation(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector3KeyFrameAnimation(This,result) (This)->lpVtbl->CreateVector3KeyFrameAnimation(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector4KeyFrameAnimation(This,result) (This)->lpVtbl->CreateVector4KeyFrameAnimation(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_GetCommitBatch(This,batchType,result) (This)->lpVtbl->GetCommitBatch(This,batchType,result)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositor_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositor* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositor_Release(__x_ABI_CWindows_CUI_CComposition_CICompositor* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++/*** ICompositor methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorKeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation **result) {
++ return This->lpVtbl->CreateColorKeyFrameAnimation(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrush(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush **result) {
++ return This->lpVtbl->CreateColorBrush(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrushWithColor(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CColor color,__x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush **result) {
++ return This->lpVtbl->CreateColorBrushWithColor(This,color,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateContainerVisual(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CContainerVisual **result) {
++ return This->lpVtbl->CreateContainerVisual(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateCubicBezierEasingFunction(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 controlPoint1,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 controlPoint2,__x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction **result) {
++ return This->lpVtbl->CreateCubicBezierEasingFunction(This,controlPoint1,controlPoint2,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateEffectFactory(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *graphicsEffect,__x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory **result) {
++ return This->lpVtbl->CreateEffectFactory(This,graphicsEffect,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateEffectFactoryWithProperties(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *graphicsEffect,int *animatableProperties,__x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory **result) {
++ return This->lpVtbl->CreateEffectFactoryWithProperties(This,graphicsEffect,animatableProperties,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateExpressionAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CExpressionAnimation **result) {
++ return This->lpVtbl->CreateExpressionAnimation(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateExpressionAnimationWithExpression(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,HSTRING expression,__x_ABI_CWindows_CUI_CComposition_CExpressionAnimation **result) {
++ return This->lpVtbl->CreateExpressionAnimationWithExpression(This,expression,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateInsetClip(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CInsetClip **result) {
++ return This->lpVtbl->CreateInsetClip(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateInsetClipWithInsets(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,FLOAT leftInset,FLOAT topInset,FLOAT rightInset,FLOAT bottomInset,__x_ABI_CWindows_CUI_CComposition_CInsetClip **result) {
++ return This->lpVtbl->CreateInsetClipWithInsets(This,leftInset,topInset,rightInset,bottomInset,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateLinearEasingFunction(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction **result) {
++ return This->lpVtbl->CreateLinearEasingFunction(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreatePropertySet(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet **result) {
++ return This->lpVtbl->CreatePropertySet(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateQuaternionKeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation **result) {
++ return This->lpVtbl->CreateQuaternionKeyFrameAnimation(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScalarKeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation **result) {
++ return This->lpVtbl->CreateScalarKeyFrameAnimation(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScopedBatch(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes batchType,__x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch **result) {
++ return This->lpVtbl->CreateScopedBatch(This,batchType,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSpriteVisual(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CSpriteVisual **result) {
++ return This->lpVtbl->CreateSpriteVisual(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSurfaceBrush(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush **result) {
++ return This->lpVtbl->CreateSurfaceBrush(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSurfaceBrushWithSurface(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CICompositionSurface *surface,__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush **result) {
++ return This->lpVtbl->CreateSurfaceBrushWithSurface(This,surface,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateTargetForCurrentView(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionTarget **result) {
++ return This->lpVtbl->CreateTargetForCurrentView(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector2KeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation **result) {
++ return This->lpVtbl->CreateVector2KeyFrameAnimation(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector3KeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation **result) {
++ return This->lpVtbl->CreateVector3KeyFrameAnimation(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector4KeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation **result) {
++ return This->lpVtbl->CreateVector4KeyFrameAnimation(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_GetCommitBatch(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes batchType,__x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch **result) {
++ return This->lpVtbl->GetCommitBatch(This,batchType,result);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CICompositor_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * ICompositionGraphicsDevice interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice, 0xfb22c6e1, 0x80a2, 0x4667, 0x99,0x36, 0xdb,0xea,0xf6,0xee,0xfe,0x95);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("fb22c6e1-80a2-4667-9936-dbeaf6eefe95")
++ ICompositionGraphicsDevice : public IInspectable
++ {
++ virtual HRESULT STDMETHODCALLTYPE CreateDrawingSurface(
++ ABI::Windows::Foundation::Size sizePixels,
++ ABI::Windows::Graphics::DirectX::DirectXPixelFormat pixelFormat,
++ ABI::Windows::Graphics::DirectX::DirectXAlphaMode alphaMode,
++ ABI::Windows::UI::Composition::CompositionDrawingSurface **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE RenderingDeviceReplaced(
++ int *handler,
++ int *token) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE RenderingDeviceReplaced(
++ int token) = 0;
++
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositionGraphicsDevice, 0xfb22c6e1, 0x80a2, 0x4667, 0x99,0x36, 0xdb,0xea,0xf6,0xee,0xfe,0x95)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDeviceVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
++ TrustLevel *trustLevel);
++
++ /*** ICompositionGraphicsDevice methods ***/
++ HRESULT (STDMETHODCALLTYPE *CreateDrawingSurface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
++ __x_ABI_CWindows_CFoundation_CSize sizePixels,
++ __x_ABI_CWindows_CGraphics_CDirectX_CDirectXPixelFormat pixelFormat,
++ __x_ABI_CWindows_CGraphics_CDirectX_CDirectXAlphaMode alphaMode,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface **result);
++
++ HRESULT (STDMETHODCALLTYPE *RenderingDeviceReplaced)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
++ int *handler,
++ int *token);
++
++ HRESULT (STDMETHODCALLTYPE *RenderingDeviceReplaced)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
++ int token);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDeviceVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDeviceVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++/*** ICompositionGraphicsDevice methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_CreateDrawingSurface(This,sizePixels,pixelFormat,alphaMode,result) (This)->lpVtbl->CreateDrawingSurface(This,sizePixels,pixelFormat,alphaMode,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_RenderingDeviceReplaced(This,handler,token) (This)->lpVtbl->RenderingDeviceReplaced(This,handler,token)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_RenderingDeviceReplaced(This,token) (This)->lpVtbl->RenderingDeviceReplaced(This,token)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++/*** ICompositionGraphicsDevice methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_CreateDrawingSurface(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,__x_ABI_CWindows_CFoundation_CSize sizePixels,__x_ABI_CWindows_CGraphics_CDirectX_CDirectXPixelFormat pixelFormat,__x_ABI_CWindows_CGraphics_CDirectX_CDirectXAlphaMode alphaMode,__x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface **result) {
++ return This->lpVtbl->CreateDrawingSurface(This,sizePixels,pixelFormat,alphaMode,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_RenderingDeviceReplaced(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,int *handler,int *token) {
++ return This->lpVtbl->RenderingDeviceReplaced(This,handler,token);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_RenderingDeviceReplaced(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,int token) {
++ return This->lpVtbl->RenderingDeviceReplaced(This,token);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_INTERFACE_DEFINED__ */
++
++extern const __declspec(selectany) WCHAR RuntimeClass_Windows_UI_Composition_SpriteVisual[] = L"Windows.UI.Composition.SpriteVisual";
++/* Begin additional prototypes for all interfaces */
++
++ULONG __RPC_USER HSTRING_UserSize (ULONG *, ULONG, HSTRING *);
++unsigned char * __RPC_USER HSTRING_UserMarshal (ULONG *, unsigned char *, HSTRING *);
++unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
++void __RPC_USER HSTRING_UserFree (ULONG *, HSTRING *);
++
++/* End additional prototypes */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __windows_ui_composition_h__ */
+diff --git a/mingw-w64-headers/include/windows.ui.composition.interop.h b/mingw-w64-headers/include/windows.ui.composition.interop.h
+new file mode 100644
+index 00000000..a82afdf1
+--- /dev/null
++++ b/mingw-w64-headers/include/windows.ui.composition.interop.h
+@@ -0,0 +1,31 @@
++#include <windows.ui.composition.h>
++
++namespace ABI {
++namespace Windows {
++namespace UI {
++namespace Composition {
++
++#undef INTERFACE
++#define INTERFACE ICompositorInterop
++ DECLARE_INTERFACE_IID_(ICompositorInterop, IUnknown, "25297d5c-3ad4-4c9c-b5cf-e36a38512330")
++ {
++ IFACEMETHOD(CreateCompositionSurfaceForHandle)(
++ HANDLE swapChain,
++ ICompositionSurface **result) PURE;
++ IFACEMETHOD(CreateCompositionSurfaceForSwapChain)(
++ IUnknown *swapChain,
++ ICompositionSurface **result) PURE;
++
++ IFACEMETHOD(CreateGraphicsDevice)(
++ IUnknown *renderingDevice,
++ ICompositionGraphicsDevice **result) PURE;
++ };
++}
++}
++}
++}
++
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositorInterop, 0x25297d5c,0x3ad4,0x4c9c,0xb5,0xcf,0xe3,0x6a,0x38,0x51,0x23,0x30)
++#endif
++
+diff --git a/mingw-w64-headers/include/windows.ui.core.h b/mingw-w64-headers/include/windows.ui.core.h
+new file mode 100644
+index 00000000..a3c16ac2
+--- /dev/null
++++ b/mingw-w64-headers/include/windows.ui.core.h
+@@ -0,0 +1,127 @@
++/*** Autogenerated by WIDL 4.4 from windows.ui.core.idl - Do not edit ***/
++
++#ifdef _WIN32
++#ifndef __REQUIRED_RPCNDR_H_VERSION__
++#define __REQUIRED_RPCNDR_H_VERSION__ 475
++#endif
++#include <rpc.h>
++#include <rpcndr.h>
++#endif
++
++#ifndef COM_NO_WINDOWS_H
++#include <windows.h>
++#include <ole2.h>
++#endif
++
++#ifndef __windows_ui_core_h__
++#define __windows_ui_core_h__
++
++/* Forward declarations */
++
++#ifndef ____x_ABI_CWindows_CUI_CCore_CCoreDispatcher_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CCore_CCoreDispatcher_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CCore_CCoreDispatcher __x_ABI_CWindows_CUI_CCore_CCoreDispatcher;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Core {
++ interface CoreDispatcher;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++/* Headers for imported files */
++
++#include <inspectable.h>
++#include <windows.foundation.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*****************************************************************************
++ * CoreDispatcher interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CCore_CCoreDispatcher_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CCore_CCoreDispatcher_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CCore_CCoreDispatcher, 0x3fe05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Core {
++ MIDL_INTERFACE("3fe05581-1ad1-4f97-9666-402d76e4233b")
++ CoreDispatcher : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Core::CoreDispatcher, 0x3fe05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CCore_CCoreDispatcherVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CCore_CCoreDispatcher *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CCore_CCoreDispatcher *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CCore_CCoreDispatcher *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CCore_CCoreDispatcherVtbl;
++
++interface __x_ABI_CWindows_CUI_CCore_CCoreDispatcher {
++ CONST_VTBL __x_ABI_CWindows_CUI_CCore_CCoreDispatcherVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CCore_CCoreDispatcher_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CCore_CCoreDispatcher_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CCore_CCoreDispatcher_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CCore_CCoreDispatcher_QueryInterface(__x_ABI_CWindows_CUI_CCore_CCoreDispatcher* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CCore_CCoreDispatcher_AddRef(__x_ABI_CWindows_CUI_CCore_CCoreDispatcher* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CCore_CCoreDispatcher_Release(__x_ABI_CWindows_CUI_CCore_CCoreDispatcher* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CCore_CCoreDispatcher_INTERFACE_DEFINED__ */
++
++/* Begin additional prototypes for all interfaces */
++
++
++/* End additional prototypes */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __windows_ui_core_h__ */
+diff --git a/mingw-w64-headers/include/windows.ui.h b/mingw-w64-headers/include/windows.ui.h
+new file mode 100644
+index 00000000..2e4abd54
+--- /dev/null
++++ b/mingw-w64-headers/include/windows.ui.h
+@@ -0,0 +1,72 @@
++/*** Autogenerated by WIDL 4.4 from windows.ui.idl - Do not edit ***/
++
++#ifdef _WIN32
++#ifndef __REQUIRED_RPCNDR_H_VERSION__
++#define __REQUIRED_RPCNDR_H_VERSION__ 475
++#endif
++#include <rpc.h>
++#include <rpcndr.h>
++#endif
++
++#ifndef COM_NO_WINDOWS_H
++#include <windows.h>
++#include <ole2.h>
++#endif
++
++#ifndef __windows_ui_h__
++#define __windows_ui_h__
++
++/* Forward declarations */
++
++/* Headers for imported files */
++
++#include <inspectable.h>
++#include <windows.foundation.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ struct Color {
++ BYTE A;
++ BYTE R;
++ BYTE G;
++ BYTE B;
++ };
++ }
++ }
++}
++extern "C" {
++#else
++struct __x_ABI_CWindows_CUI_CColor {
++ BYTE A;
++ BYTE R;
++ BYTE G;
++ BYTE B;
++};
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++typedef struct Color Color;
++ }
++ }
++}
++#endif /* __cplusplus */
++/* Begin additional prototypes for all interfaces */
++
++
++/* End additional prototypes */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __windows_ui_h__ */
diff --git a/taskcluster/scripts/misc/osx-cross-linker b/taskcluster/scripts/misc/osx-cross-linker
new file mode 100755
index 0000000000..f0827b01fa
--- /dev/null
+++ b/taskcluster/scripts/misc/osx-cross-linker
@@ -0,0 +1,7 @@
+exec $MOZ_FETCHES_DIR/clang/bin/clang -v \
+ -fuse-ld=$MOZ_FETCHES_DIR/cctools/bin/x86_64-apple-darwin-ld \
+ -mmacosx-version-min=10.12 \
+ -target $TARGET \
+ -B $MOZ_FETCHES_DIR/cctools/bin \
+ -isysroot $MOZ_FETCHES_DIR/MacOSX10.12.sdk \
+ "$@"
diff --git a/taskcluster/scripts/misc/pack.sh b/taskcluster/scripts/misc/pack.sh
new file mode 100755
index 0000000000..e6db0cb32a
--- /dev/null
+++ b/taskcluster/scripts/misc/pack.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+set -x
+
+[ -z "$1" ] && echo Missing argument && exit 1
+
+dir=$(dirname "$1")
+name=$(basename "$1")
+
+case "$(uname -s)" in
+Darwin)
+ TAR_FLAGS=--no-fflags
+ ;;
+*)
+ TAR_FLAGS=
+ ;;
+esac
+
+(cd "$dir"; find "$name"/* -not -type d -print0 | tar $TAR_FLAGS -cf - --null -T -) | python3 $GECKO_PATH/taskcluster/scripts/misc/zstdpy > "$name.tar.zst"
+
+mkdir -p "$UPLOAD_DIR"
+mv "$name.tar.zst" "$UPLOAD_DIR"
diff --git a/taskcluster/scripts/misc/repack-android-emulator-linux.sh b/taskcluster/scripts/misc/repack-android-emulator-linux.sh
new file mode 100755
index 0000000000..35596d1af1
--- /dev/null
+++ b/taskcluster/scripts/misc/repack-android-emulator-linux.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for fetching and repacking the Android emulator (for
+# Linux), the tools required to produce Android packages.
+
+UPLOAD_DIR=$HOME/project/gecko/android-emulator
+
+mkdir -p $HOME/artifacts $UPLOAD_DIR
+
+# Populate /builds/worker/.mozbuild/android-emulator-linux.
+cd $GECKO_PATH
+./mach python python/mozboot/mozboot/android.py --emulator-only --no-interactive
+
+# Remove extra files we don't need
+rm -rfv /builds/worker/.mozbuild/android-sdk-linux/tools
+mkdir /builds/worker/.mozbuild/android-sdk-linux/system-images
+mkdir /builds/worker/.mozbuild/android-sdk-linux/platforms
+find /builds/worker/.mozbuild/android-sdk-linux/emulator/qemu -type f -not -name "*x86*" -print -delete
+
+tar cv -C /builds/worker/.mozbuild android-sdk-linux | $GECKO_PATH/taskcluster/scripts/misc/zstdpy > $UPLOAD_DIR/android-emulator-linux.tar.zst
+
+ls -al $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/repack-android-ndk-linux.sh b/taskcluster/scripts/misc/repack-android-ndk-linux.sh
new file mode 100755
index 0000000000..6a0fcd02a9
--- /dev/null
+++ b/taskcluster/scripts/misc/repack-android-ndk-linux.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for fetching and repacking the Android NDK (for
+# Linux), the tools required to produce native Android programs.
+
+UPLOAD_DIR=$HOME/project/gecko/android-ndk
+
+mkdir -p $HOME/artifacts $UPLOAD_DIR
+
+# Populate /builds/worker/.mozbuild/android-ndk-$VER.
+cd $GECKO_PATH
+./mach python python/mozboot/mozboot/android.py --ndk-only --no-interactive
+
+# Don't generate a tarball with a versioned NDK directory.
+mv $HOME/.mozbuild/android-ndk-* $HOME/.mozbuild/android-ndk
+tar cv -C /builds/worker/.mozbuild android-ndk | $GECKO_PATH/taskcluster/scripts/misc/zstdpy > $UPLOAD_DIR/android-ndk.tar.zst
+
+ls -al $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/repack-android-sdk-linux.sh b/taskcluster/scripts/misc/repack-android-sdk-linux.sh
new file mode 100755
index 0000000000..08d9973677
--- /dev/null
+++ b/taskcluster/scripts/misc/repack-android-sdk-linux.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for fetching and repacking the Android SDK (for
+# Linux), the tools required to produce Android packages.
+
+UPLOAD_DIR=$HOME/project/gecko/android-sdk
+
+mkdir -p $HOME/artifacts $UPLOAD_DIR
+
+# Populate /builds/worker/.mozbuild/android-sdk-linux.
+cd $GECKO_PATH
+./mach python python/mozboot/mozboot/android.py --artifact-mode --no-interactive
+
+# It's nice to have the build logs include the state of the world upon
+# completion.
+/builds/worker/.mozbuild/android-sdk-linux/tools/bin/sdkmanager --list
+
+tar cv -C /builds/worker/.mozbuild android-sdk-linux | $GECKO_PATH/taskcluster/scripts/misc/zstdpy > $UPLOAD_DIR/android-sdk-linux.tar.zst
+
+ls -al $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/repack-clang-linux-macosx-cross.sh b/taskcluster/scripts/misc/repack-clang-linux-macosx-cross.sh
new file mode 100755
index 0000000000..c06ddd1411
--- /dev/null
+++ b/taskcluster/scripts/misc/repack-clang-linux-macosx-cross.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for building clang for macOS targets on a Linux host,
+# including native macOS Compiler-RT libraries.
+
+cd $MOZ_FETCHES_DIR
+
+# We have a native linux64 toolchain in $MOZ_FETCHES_DIR/clang
+# We have a native aarch64 macos compiler-rt in $MOZ_FETCHES_DIR/aarch64/compiler-rt
+# We have a native x86_64 macos compiler-rt in $MOZ_FETCHES_DIR/x86_64/compiler-rt
+clang_lib=$(echo clang/lib/clang/*/lib)
+mkdir -p $clang_lib/darwin
+find {aarch64,x86_64}/compiler-rt/lib/darwin -type f -printf '%f\n' | sort -u | while read f; do
+ f=compiler-rt/lib/darwin/$f
+ if [ -f aarch64/$f -a -f x86_64/$f ]; then
+ # For compiler-rt files that exist on both ends, merge them
+ $MOZ_FETCHES_DIR/cctools/bin/lipo -create {aarch64,x86_64}/$f -output $clang_lib/darwin/${f##*/}
+ elif [ -f aarch64/$f ]; then
+ # For compiler-rt files that exist on either end, copy the existing one
+ cp aarch64/$f $clang_lib/darwin
+ else
+ cp x86_64/$f $clang_lib/darwin
+ fi
+done
+
+tar -cf - clang | python3 $GECKO_PATH/taskcluster/scripts/misc/zstdpy > clang.tar.zst
+
+mkdir -p $UPLOAD_DIR
+mv clang.tar.zst $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/repack-clang-linux-win-cross.sh b/taskcluster/scripts/misc/repack-clang-linux-win-cross.sh
new file mode 100755
index 0000000000..a6dd88e37a
--- /dev/null
+++ b/taskcluster/scripts/misc/repack-clang-linux-win-cross.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is to repack a linux clang with Windows clang-cl.exe and compiler runtime.
+
+cd $MOZ_FETCHES_DIR
+
+# We already have the Linux clang extracted in $MOZ_FETCHES_DIR/clang by fetch-content
+# We have a non-extracted clang-cl/clang.tar.zst for Windows clang-cl that we need to extract
+# files from.
+
+$GECKO_PATH/taskcluster/scripts/misc/zstdpy -d clang-cl/clang.tar.zst | tar -x --wildcards clang/lib/clang/*/lib/windows clang/bin/clang-cl.exe clang/bin/llvm-symbolizer.exe
+chmod +x clang/bin/clang-cl.exe
+tar -c clang | $GECKO_PATH/taskcluster/scripts/misc/zstdpy > clang.tar.zst
+
+# Put a tarball in the artifacts dir
+mkdir -p $UPLOAD_DIR
+cp clang.tar.zst $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/repack-llvm-symbolizer.sh b/taskcluster/scripts/misc/repack-llvm-symbolizer.sh
new file mode 100755
index 0000000000..cba49db5e8
--- /dev/null
+++ b/taskcluster/scripts/misc/repack-llvm-symbolizer.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is creating an artifact containing llvm-symbolizer.
+
+mkdir llvm-symbolizer
+cp $MOZ_FETCHES_DIR/clang/bin/llvm-symbolizer* llvm-symbolizer/
+
+tar -cf - llvm-symbolizer | python3 $GECKO_PATH/taskcluster/scripts/misc/zstdpy > llvm-symbolizer.tar.zst
+
+mkdir -p $UPLOAD_DIR
+mv llvm-symbolizer.tar.zst $UPLOAD_DIR
diff --git a/taskcluster/scripts/misc/repack-node.sh b/taskcluster/scripts/misc/repack-node.sh
new file mode 100755
index 0000000000..4cb413fd74
--- /dev/null
+++ b/taskcluster/scripts/misc/repack-node.sh
@@ -0,0 +1,74 @@
+#!/bin/bash
+set -x -e -v
+
+# This script is for repacking Node (and NPM) from nodejs.org.
+
+WORKSPACE=$HOME/workspace
+
+case "$1" in
+linux64) ARCH=linux-x64 ;;
+macosx64) ARCH=darwin-x64 ;;
+win64) ARCH=win-x64 ;;
+win32) ARCH=win-x86 ;;
+*)
+ echo "Unknown architecture $1 not recognized in repack-node.sh" >&2
+ exit 1
+ ;;
+esac
+
+case "$ARCH" in
+linux-x64|darwin-x64)
+ SUFFIX=tar.xz
+ UNARCHIVE="tar xaf"
+ REPACK_TAR_COMPRESSION_SWITCH=J
+ REPACK_SUFFIX=tar.xz
+ ;;
+
+win-x64|win-x86)
+ SUFFIX=zip
+ UNARCHIVE=unzip
+ REPACK_TAR_COMPRESSION_SWITCH=j
+ REPACK_SUFFIX=tar.bz2
+ ;;
+esac
+
+# Although we're only using one version at the moment, this infrastructure is
+# useful for when we need to do upgrades and have multiple versions of node
+# live in taskcluster at once.
+case "$2" in
+10) VERSION="10.23.1" ;;
+*)
+ echo "Unknown version $2 not recognized in repack-node.sh" >&2
+ exit 1
+ ;;
+esac
+
+case "$ARCH--$VERSION" in
+ # From https://nodejs.org/dist/v10.23.1/SHASUMS256.txt.asc
+ linux-x64--10.23.1) SHA256SUM=207e5ec77ca655ba6fcde922d6b329acbb09898b0bd793ccfcce6c27a36fdff0 ;;
+ darwin-x64--10.23.1) SHA256SUM=febfdabd98ab5b8f8fdff32ab8c111d834083805bf042ab65c923cc22609c99d ;;
+ win-x64--10.23.1) SHA256SUM=497996aa1037b6f7f492c1d275bb90140269223939525286b4e95babad16f0de ;;
+ win-x86--10.23.1) SHA256SUM=c3be0fd50c218cc52e85377c9e22d7d2110d72de95bdbc9447145b246330f818 ;;
+esac
+
+# From https://nodejs.org/en/download/
+URL=https://nodejs.org/dist/v$VERSION/node-v$VERSION-$ARCH.$SUFFIX
+ARCHIVE=node-v$VERSION-$ARCH.$SUFFIX
+
+mkdir -p "$UPLOAD_DIR"
+
+cd "$WORKSPACE"
+wget --progress=dot:mega $URL
+
+# shasum is available on both Linux and Windows builders, but on
+# Windows, reading from stdin doesn't work as expected.
+echo "$SHA256SUM $ARCHIVE" > node.txt
+shasum --algorithm 256 --check node.txt
+
+$UNARCHIVE $ARCHIVE
+mv node-v$VERSION-$ARCH node
+# npx doesn't have great security characteristics (it downloads and executes
+# stuff directly out of npm at runtime), so let's not risk it getting into
+# anyone's PATH who doesn't already have it there:
+rm -f node/bin/npx node/bin/npx.exe
+tar c${REPACK_TAR_COMPRESSION_SWITCH}f "$UPLOAD_DIR"/node.$REPACK_SUFFIX node
diff --git a/taskcluster/scripts/misc/repack_rust.py b/taskcluster/scripts/misc/repack_rust.py
new file mode 100755
index 0000000000..1e376e4eb4
--- /dev/null
+++ b/taskcluster/scripts/misc/repack_rust.py
@@ -0,0 +1,717 @@
+#!/usr/bin/env python3
+# 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 downloads and repacks official rust language builds
+with the necessary tool and target support for the Firefox
+build environment.
+"""
+
+from __future__ import absolute_import, print_function
+
+import argparse
+import errno
+import glob
+import hashlib
+import os
+import shutil
+import subprocess
+from contextlib import contextmanager
+import tarfile
+import tempfile
+import textwrap
+
+import requests
+import pytoml as toml
+
+import zstandard
+
+
+def log(msg):
+ print("repack: %s" % msg, flush=True)
+
+
+def fetch_file(url):
+ """Download a file from the given url if it's not already present.
+
+ Returns the SHA-2 256-bit hash of the received file."""
+ filename = os.path.basename(url)
+ sha = hashlib.sha256()
+ size = 4096
+ if os.path.exists(filename):
+ with open(filename, "rb") as fd:
+ while True:
+ block = fd.read(size)
+ if not block:
+ return sha.hexdigest()
+ sha.update(block)
+ log("Could not calculate checksum!")
+ return None
+ r = requests.get(url, stream=True)
+ r.raise_for_status()
+ with open(filename, "wb") as fd:
+ for chunk in r.iter_content(size):
+ fd.write(chunk)
+ sha.update(chunk)
+ return sha.hexdigest()
+
+
+def check_call_with_input(cmd, input_data):
+ """Invoke a command, passing the input String over stdin.
+
+ This is like subprocess.check_call, but allows piping
+ input to interactive commands."""
+ p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
+ p.communicate(input_data)
+ if p.wait():
+ raise subprocess.CalledProcessError(p.returncode, cmd)
+
+
+def setup_gpg():
+ """Add the signing key to the current gpg config.
+
+ Import a hard-coded copy of the release signing public key
+ and mark it trusted in the gpg database so subsequent
+ signature checks can succeed or fail cleanly."""
+ keyid = "0x85AB96E6FA1BE5FE"
+ log("Importing signing key %s..." % keyid)
+ key = b"""
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQINBFJEwMkBEADlPACa2K7reD4x5zd8afKx75QYKmxqZwywRbgeICeD4bKiQoJZ
+dUjmn1LgrGaXuBMKXJQhyA34e/1YZel/8et+HPE5XpljBfNYXWbVocE1UMUTnFU9
+CKXa4AhJ33f7we2/QmNRMUifw5adPwGMg4D8cDKXk02NdnqQlmFByv0vSaArR5kn
+gZKnLY6o0zZ9Buyy761Im/ShXqv4ATUgYiFc48z33G4j+BDmn0ryGr1aFdP58tHp
+gjWtLZs0iWeFNRDYDje6ODyu/MjOyuAWb2pYDH47Xu7XedMZzenH2TLM9yt/hyOV
+xReDPhvoGkaO8xqHioJMoPQi1gBjuBeewmFyTSPS4deASukhCFOcTsw/enzJagiS
+ZAq6Imehduke+peAL1z4PuRmzDPO2LPhVS7CDXtuKAYqUV2YakTq8MZUempVhw5n
+LqVaJ5/XiyOcv405PnkT25eIVVVghxAgyz6bOU/UMjGQYlkUxI7YZ9tdreLlFyPR
+OUL30E8q/aCd4PGJV24yJ1uit+yS8xjyUiMKm4J7oMP2XdBN98TUfLGw7SKeAxyU
+92BHlxg7yyPfI4TglsCzoSgEIV6xoGOVRRCYlGzSjUfz0bCMCclhTQRBkegKcjB3
+sMTyG3SPZbjTlCqrFHy13e6hGl37Nhs8/MvXUysq2cluEISn5bivTKEeeQARAQAB
+tERSdXN0IExhbmd1YWdlIChUYWcgYW5kIFJlbGVhc2UgU2lnbmluZyBLZXkpIDxy
+dXN0LWtleUBydXN0LWxhbmcub3JnPokCOAQTAQIAIgUCUkTAyQIbAwYLCQgHAwIG
+FQgCCQoLBBYCAwECHgECF4AACgkQhauW5vob5f5fYQ//b1DWK1NSGx5nZ3zYZeHJ
+9mwGCftIaA2IRghAGrNf4Y8DaPqR+w1OdIegWn8kCoGfPfGAVW5XXJg+Oxk6QIaD
+2hJojBUrq1DALeCZVewzTVw6BN4DGuUexsc53a8DcY2Yk5WE3ll6UKq/YPiWiPNX
+9r8FE2MJwMABB6mWZLqJeg4RCrriBiCG26NZxGE7RTtPHyppoVxWKAFDiWyNdJ+3
+UnjldWrT9xFqjqfXWw9Bhz8/EoaGeSSbMIAQDkQQpp1SWpljpgqvctZlc5fHhsG6
+lmzW5RM4NG8OKvq3UrBihvgzwrIfoEDKpXbk3DXqaSs1o81NH5ftVWWbJp/ywM9Q
+uMC6n0YWiMZMQ1cFBy7tukpMkd+VPbPkiSwBhPkfZIzUAWd74nanN5SKBtcnymgJ
++OJcxfZLiUkXRj0aUT1GLA9/7wnikhJI+RvwRfHBgrssXBKNPOfXGWajtIAmZc2t
+kR1E8zjBVLId7r5M8g52HKk+J+y5fVgJY91nxG0zf782JjtYuz9+knQd55JLFJCO
+hhbv3uRvhvkqgauHagR5X9vCMtcvqDseK7LXrRaOdOUDrK/Zg/abi5d+NIyZfEt/
+ObFsv3idAIe/zpU6xa1nYNe3+Ixlb6mlZm3WCWGxWe+GvNW/kq36jZ/v/8pYMyVO
+p/kJqnf9y4dbufuYBg+RLqC5Ag0EUkTAyQEQANxy2tTSeRspfrpBk9+ju+KZ3zc4
+umaIsEa5DxJ2zIKHywVAR67Um0K1YRG07/F5+tD9TIRkdx2pcmpjmSQzqdk3zqa9
+2Zzeijjz2RNyBY8qYmyE08IncjTsFFB8OnvdXcsAgjCFmI1BKnePxrABL/2k8X18
+aysPb0beWqQVsi5FsSpAHu6k1kaLKc+130x6Hf/YJAjeo+S7HeU5NeOz3zD+h5bA
+Q25qMiVHX3FwH7rFKZtFFog9Ogjzi0TkDKKxoeFKyADfIdteJWFjOlCI9KoIhfXq
+Et9JMnxApGqsJElJtfQjIdhMN4Lnep2WkudHAfwJ/412fe7wiW0rcBMvr/BlBGRY
+vM4sTgN058EwIuY9Qmc8RK4gbBf6GsfGNJjWozJ5XmXElmkQCAvbQFoAfi5TGfVb
+77QQrhrQlSpfIYrvfpvjYoqj618SbU6uBhzh758gLllmMB8LOhxWtq9eyn1rMWyR
+KL1fEkfvvMc78zP+Px6yDMa6UIez8jZXQ87Zou9EriLbzF4QfIYAqR9LUSMnLk6K
+o61tSFmFEDobC3tc1jkSg4zZe/wxskn96KOlmnxgMGO0vJ7ASrynoxEnQE8k3WwA
++/YJDwboIR7zDwTy3Jw3mn1FgnH+c7Rb9h9geOzxKYINBFz5Hd0MKx7kZ1U6WobW
+KiYYxcCmoEeguSPHABEBAAGJAh8EGAECAAkFAlJEwMkCGwwACgkQhauW5vob5f7f
+FA//Ra+itJF4NsEyyhx4xYDOPq4uj0VWVjLdabDvFjQtbBLwIyh2bm8uO3AY4r/r
+rM5WWQ8oIXQ2vvXpAQO9g8iNlFez6OLzbfdSG80AG74pQqVVVyCQxD7FanB/KGge
+tAoOstFxaCAg4nxFlarMctFqOOXCFkylWl504JVIOvgbbbyj6I7qCUmbmqazBSMU
+K8c/Nz+FNu2Uf/lYWOeGogRSBgS0CVBcbmPUpnDHLxZWNXDWQOCxbhA1Uf58hcyu
+036kkiWHh2OGgJqlo2WIraPXx1cGw1Ey+U6exbtrZfE5kM9pZzRG7ZY83CXpYWMp
+kyVXNWmf9JcIWWBrXvJmMi0FDvtgg3Pt1tnoxqdilk6yhieFc8LqBn6CZgFUBk0t
+NSaWk3PsN0N6Ut8VXY6sai7MJ0Gih1gE1xadWj2zfZ9sLGyt2jZ6wK++U881YeXA
+ryaGKJ8sIs182hwQb4qN7eiUHzLtIh8oVBHo8Q4BJSat88E5/gOD6IQIpxc42iRL
+T+oNZw1hdwNyPOT1GMkkn86l3o7klwmQUWCPm6vl1aHp3omo+GHC63PpNFO5RncJ
+Ilo3aBKKmoE5lDSMGE8KFso5awTo9z9QnVPkRsk6qeBYit9xE3x3S+iwjcSg0nie
+aAkc0N00nc9V9jfPvt4z/5A5vjHh+NhFwH5h2vBJVPdsz6m5Ag0EVI9keAEQAL3R
+oVsHncJTmjHfBOV4JJsvCum4DuJDZ/rDdxauGcjMUWZaG338ZehnDqG1Yn/ys7zE
+aKYUmqyT+XP+M2IAQRTyxwlU1RsDlemQfWrESfZQCCmbnFScL0E7cBzy4xvtInQe
+UaFgJZ1BmxbzQrx+eBBdOTDv7RLnNVygRmMzmkDhxO1IGEu1+3ETIg/DxFE7VQY0
+It/Ywz+nHu1o4Hemc/GdKxu9hcYvcRVc/Xhueq/zcIM96l0m+CFbs0HMKCj8dgMe
+Ng6pbbDjNM+cV+5BgpRdIpE2l9W7ImpbLihqcZt47J6oWt/RDRVoKOzRxjhULVyV
+2VP9ESr48HnbvxcpvUAEDCQUhsGpur4EKHFJ9AmQ4zf91gWLrDc6QmlACn9o9ARU
+fOV5aFsZI9ni1MJEInJTP37stz/uDECRie4LTL4O6P4Dkto8ROM2wzZq5CiRNfnT
+PP7ARfxlCkpg+gpLYRlxGUvRn6EeYwDtiMQJUQPfpGHSvThUlgDEsDrpp4SQSmdA
+CB+rvaRqCawWKoXs0In/9wylGorRUupeqGC0I0/rh+f5mayFvORzwy/4KK4QIEV9
+aYTXTvSRl35MevfXU1Cumlaqle6SDkLr3ZnFQgJBqap0Y+Nmmz2HfO/pohsbtHPX
+92SN3dKqaoSBvzNGY5WT3CsqxDtik37kR3f9/DHpABEBAAGJBD4EGAECAAkFAlSP
+ZHgCGwICKQkQhauW5vob5f7BXSAEGQECAAYFAlSPZHgACgkQXLSpNHs7CdwemA/+
+KFoGuFqU0uKT9qblN4ugRyil5itmTRVffl4tm5OoWkW8uDnu7Ue3vzdzy+9NV8X2
+wRG835qjXijWP++AGuxgW6LB9nV5OWiKMCHOWnUjJQ6pNQMAgSN69QzkFXVF/q5f
+bkma9TgSbwjrVMyPzLSRwq7HsT3V02Qfr4cyq39QeILGy/NHW5z6LZnBy3BaVSd0
+lGjCEc3yfH5OaB79na4W86WCV5n4IT7cojFM+LdL6P46RgmEtWSG3/CDjnJl6BLR
+WqatRNBWLIMKMpn+YvOOL9TwuP1xbqWr1vZ66wksm53NIDcWhptpp0KEuzbU0/Dt
+OltBhcX8tOmO36LrSadX9rwckSETCVYklmpAHNxPml011YNDThtBidvsicw1vZwR
+HsXn+txlL6RAIRN+J/Rw3uOiJAqN9Qgedpx2q+E15t8MiTg/FXtB9SysnskFT/BH
+z0USNKJUY0btZBw3eXWzUnZf59D8VW1M/9JwznCHAx0c9wy/gRDiwt9w4RoXryJD
+VAwZg8rwByjldoiThUJhkCYvJ0R3xH3kPnPlGXDW49E9R8C2umRC3cYOL4U9dOQ1
+5hSlYydF5urFGCLIvodtE9q80uhpyt8L/5jj9tbwZWv6JLnfBquZSnCGqFZRfXlb
+Jphk9+CBQWwiZSRLZRzqQ4ffl4xyLuolx01PMaatkQbRaw/+JpgRNlurKQ0PsTrO
+8tztO/tpBBj/huc2DGkSwEWvkfWElS5RLDKdoMVs/j5CLYUJzZVikUJRm7m7b+OA
+P3W1nbDhuID+XV1CSBmGifQwpoPTys21stTIGLgznJrIfE5moFviOLqD/LrcYlsq
+CQg0yleu7SjOs//8dM3mC2FyLaE/dCZ8l2DCLhHw0+ynyRAvSK6aGCmZz6jMjmYF
+MXgiy7zESksMnVFMulIJJhR3eB0wx2GitibjY/ZhQ7tD3i0yy9ILR07dFz4pgkVM
+afxpVR7fmrMZ0t+yENd+9qzyAZs0ksxORoc2ze90SCx2jwEX/3K+m4I0hP2H/w5W
+gqdvuRLiqf+4BGW4zqWkLLlNIe/okt0r82SwHtDN0Ui1asmZTGj6sm8SXtwx+5cE
+38MttWqjDiibQOSthRVcETByRYM8KcjYSUCi4PoBc3NpDONkFbZm6XofR/f5mTcl
+2jDw6fIeVc4Hd1jBGajNzEqtneqqbdAkPQaLsuD2TMkQfTDJfE/IljwjrhDa9Mi+
+odtnMWq8vlwOZZ24/8/BNK5qXuCYL67O7AJB4ZQ6BT+g4z96iRLbupzu/XJyXkQF
+rOY/Ghegvn7fDrnt2KC9MpgeFBXzUp+k5rzUdF8jbCx5apVjA1sWXB9Kh3L+DUwF
+Mve696B5tlHyc1KxjHR6w9GRsh4=
+=5FXw
+-----END PGP PUBLIC KEY BLOCK-----
+"""
+ check_call_with_input(["gpg", "--import"], key)
+ check_call_with_input(
+ ["gpg", "--command-fd", "0", "--edit-key", keyid], b"trust\n5\ny\n"
+ )
+
+
+def verify_sha(filename, sha):
+ """Verify that the checksum file matches the given sha digest."""
+ sha_filename = filename + ".sha256"
+ with open(sha_filename) as f:
+ # Older sha256 files would contain `sha filename`, but more recent
+ # ones only contain `sha`.
+ checksum = f.readline().split()[0]
+ if checksum != sha:
+ raise ValueError("Checksum mismatch in %s" % filename)
+ return True
+ log("No checksum file for %s!" % filename)
+ return False
+
+
+def fetch(url, validate=True):
+ """Download and verify a package url."""
+ base = os.path.basename(url)
+ log("Fetching %s..." % base)
+ if validate:
+ fetch_file(url + ".asc")
+ fetch_file(url + ".sha256")
+ sha = fetch_file(url)
+ if validate:
+ log("Verifying %s..." % base)
+ verify_sha(base, sha)
+ subprocess.check_call(
+ ["gpg", "--keyid-format", "0xlong", "--verify", base + ".asc", base]
+ )
+ return sha
+
+
+def install(filename, target):
+ """Run a package's installer script against the given target directory."""
+ log("Unpacking %s..." % filename)
+ subprocess.check_call(["tar", "xf", filename])
+ basename = filename.split(".tar")[0]
+ log("Installing %s..." % basename)
+ install_cmd = [os.path.join(basename, "install.sh")]
+ install_cmd += ["--prefix=" + os.path.abspath(target)]
+ install_cmd += ["--disable-ldconfig"]
+ subprocess.check_call(install_cmd)
+ log("Cleaning %s..." % basename)
+ shutil.rmtree(basename)
+
+
+def package(manifest, pkg, target):
+ """Pull out the package dict for a particular package and target
+ from the given manifest."""
+ version = manifest["pkg"][pkg]["version"]
+ if target in manifest["pkg"][pkg]["target"]:
+ info = manifest["pkg"][pkg]["target"][target]
+ else:
+ # rust-src is the same for all targets, and has a literal '*' in the
+ # section key/name instead of a target
+ info = manifest["pkg"][pkg]["target"]["*"]
+ if "xz_url" in info:
+ info["url"] = info.pop("xz_url")
+ info["hash"] = info.pop("xz_hash")
+ return (version, info)
+
+
+def fetch_package(manifest, pkg, host):
+ version, info = package(manifest, pkg, host)
+ if not info["available"]:
+ log("%s marked unavailable for %s" % (pkg, host))
+ raise KeyError
+
+ log("%s %s\n %s\n %s" % (pkg, version, info["url"], info["hash"]))
+ sha = fetch(info["url"], info["hash"] is not None)
+ if info["hash"] and sha != info["hash"]:
+ log(
+ "Checksum mismatch: package resource is different from manifest"
+ "\n %s" % sha
+ )
+ raise AssertionError
+ return info
+
+
+def fetch_std(manifest, targets):
+ stds = []
+ for target in targets:
+ stds.append(fetch_package(manifest, "rust-std", target))
+ # not available for i686
+ if target != "i686-unknown-linux-musl":
+ stds.append(fetch_package(manifest, "rust-analysis", target))
+ return stds
+
+
+def fetch_optional(manifest, pkg, host):
+ try:
+ return fetch_package(manifest, pkg, host)
+ except KeyError:
+ # The package is not available, oh well!
+ return None
+
+
+@contextmanager
+def chdir(path):
+ d = os.getcwd()
+ log('cd "%s"' % path)
+ os.chdir(path)
+ try:
+ yield
+ finally:
+ log('cd "%s"' % d)
+ os.chdir(d)
+
+
+def build_tar_package(name, base, directory):
+ name = os.path.realpath(name)
+ log("tarring {} from {}/{}".format(name, base, directory))
+ assert name.endswith(".tar.zst")
+
+ cctx = zstandard.ZstdCompressor()
+ with open(name, "wb") as f, cctx.stream_writer(f) as z:
+ with tarfile.open(mode="w|", fileobj=z) as tf:
+ with chdir(base):
+ tf.add(directory)
+
+
+def fetch_manifest(channel="stable", host=None, targets=()):
+ if channel.startswith("bors-"):
+ assert host
+ rev = channel[len("bors-") :]
+ base_url = "https://s3-us-west-1.amazonaws.com/rust-lang-ci2/rustc-builds"
+ manifest = {
+ "date": "some date",
+ "pkg": {},
+ }
+
+ def target(url):
+ return {
+ "url": url,
+ "hash": None,
+ "available": requests.head(url).status_code == 200,
+ }
+
+ for pkg in ("cargo", "rustc", "rustfmt-preview"):
+ manifest["pkg"][pkg] = {
+ "version": "bors",
+ "target": {
+ host: target(
+ "{}/{}/{}-nightly-{}.tar.xz".format(base_url, rev, pkg, host)
+ ),
+ },
+ }
+ manifest["pkg"]["rust-src"] = {
+ "version": "bors",
+ "target": {
+ "*": target("{}/{}/rust-src-nightly.tar.xz".format(base_url, rev)),
+ },
+ }
+ for pkg in ("rust-std", "rust-analysis"):
+ manifest["pkg"][pkg] = {
+ "version": "bors",
+ "target": {
+ t: target(
+ "{}/{}/{}-nightly-{}.tar.xz".format(base_url, rev, pkg, t)
+ )
+ for t in sorted(set(targets) | set([host]))
+ },
+ }
+ return manifest
+ if "-" in channel:
+ channel, date = channel.split("-", 1)
+ prefix = "/" + date
+ else:
+ prefix = ""
+ url = "https://static.rust-lang.org/dist%s/channel-rust-%s.toml" % (prefix, channel)
+ req = requests.get(url)
+ req.raise_for_status()
+ manifest = toml.loads(req.content)
+ if manifest["manifest-version"] != "2":
+ raise NotImplementedError(
+ "Unrecognized manifest version %s." % manifest["manifest-version"]
+ )
+ return manifest
+
+
+def patch_src(patch, module):
+ log("Patching Rust src... {} with {}".format(module, patch))
+ patch = os.path.realpath(patch)
+ subprocess.check_call(["patch", "-d", module, "-p1", "-i", patch, "--fuzz=0", "-s"])
+
+
+def build_src(install_dir, host, targets, patch):
+ install_dir = os.path.abspath(install_dir)
+ fetches = os.environ["MOZ_FETCHES_DIR"]
+ rust_dir = os.path.join(fetches, "rust")
+ patch_dir = os.path.join(os.environ["GECKO_PATH"], "build", "build-rust")
+
+ # Clear and remake any previous install directory.
+ try:
+ shutil.rmtree(install_dir)
+ except OSError as e:
+ if e.errno != errno.ENOENT:
+ raise
+ os.makedirs(install_dir)
+
+ # Patch the src (see the --patch flag's description for details)
+ if patch:
+ for p in patch:
+ module, colon, file = p.partition(":")
+ if not colon:
+ module, file = "", p
+ patch_file = os.path.join(patch_dir, file)
+ patch_module = os.path.join(rust_dir, module)
+ patch_src(patch_file, patch_module)
+
+ log("Building Rust...")
+
+ # Rust builds are configured primarily through a config.toml file.
+ #
+ # `sysconfdir` is overloaded to be relative instead of absolute.
+ # This is the default of `install.sh`, but for whatever reason
+ # `x.py install` has its own default of `/etc` which we don't want.
+ #
+ # `missing-tools` is set so `rustfmt` is allowed to fail. This means
+ # we can "succeed" at building Rust while failing to build, say, Cargo.
+ # Ideally the build system would have better granularity:
+ # https://github.com/rust-lang/rust/issues/79249
+ base_config = textwrap.dedent(
+ """
+ [build]
+ extended = true
+ tools = ["analysis", "cargo", "rustfmt", "src"]
+
+ [install]
+ prefix = "{prefix}"
+ sysconfdir = "etc"
+
+ [dist]
+ missing-tools = true
+
+ """.format(
+ prefix=install_dir
+ )
+ )
+
+ # Rust requires these to be specified per-target
+ target_config = textwrap.dedent(
+ """
+ [target.{target}]
+ cc = "clang"
+ cxx = "clang++"
+ linker = "clang"
+
+ """
+ )
+
+ final_config = base_config
+ for target in sorted(set(targets) | set([host])):
+ final_config = final_config + target_config.format(target=target)
+
+ with open(os.path.join(rust_dir, "config.toml"), "w") as file:
+ file.write(final_config)
+
+ # Setup the env so compilers and toolchains are visible
+ binutils = os.path.join(fetches, "binutils", "bin")
+ clang = os.path.join(fetches, "clang")
+ clang_bin = os.path.join(clang, "bin")
+ clang_lib = os.path.join(clang, "lib")
+
+ env = os.environ.copy()
+ env.update(
+ {
+ "PATH": os.pathsep.join((binutils, clang_bin, os.environ["PATH"])),
+ "LD_LIBRARY_PATH": clang_lib,
+ }
+ )
+
+ # x.py install does everything we need for us.
+ # If you're running into issues, consider using `-vv` to debug it.
+ command = ["python3", "x.py", "install", "-v", "--host", host]
+ for target in targets:
+ command.extend(["--target", target])
+
+ subprocess.check_call(command, stderr=subprocess.STDOUT, env=env, cwd=rust_dir)
+
+
+def repack(
+ host,
+ targets,
+ channel="stable",
+ cargo_channel=None,
+ compiler_builtins_hack=False,
+ patch=None,
+):
+ install_dir = "rustc"
+ if channel == "dev":
+ build_src(install_dir, host, targets, patch)
+ else:
+ if patch:
+ raise ValueError(
+ 'Patch specified, but channel "%s" is not "dev"!'
+ "\nPatches are only for building from source." % channel
+ )
+ log("Repacking rust for %s supporting %s..." % (host, targets))
+ manifest = fetch_manifest(channel, host, targets)
+ log("Using manifest for rust %s as of %s." % (channel, manifest["date"]))
+ if cargo_channel == channel:
+ cargo_manifest = manifest
+ else:
+ cargo_manifest = fetch_manifest(cargo_channel, host, targets)
+ log(
+ "Using manifest for cargo %s as of %s."
+ % (cargo_channel, cargo_manifest["date"])
+ )
+
+ log("Fetching packages...")
+ rustc = fetch_package(manifest, "rustc", host)
+ cargo = fetch_package(cargo_manifest, "cargo", host)
+ stds = fetch_std(manifest, targets)
+ rustsrc = fetch_package(manifest, "rust-src", host)
+ rustfmt = fetch_optional(manifest, "rustfmt-preview", host)
+
+ log("Installing packages...")
+
+ # Clear any previous install directory.
+ try:
+ shutil.rmtree(install_dir)
+ except OSError as e:
+ if e.errno != errno.ENOENT:
+ raise
+ install(os.path.basename(rustc["url"]), install_dir)
+ install(os.path.basename(cargo["url"]), install_dir)
+ install(os.path.basename(rustsrc["url"]), install_dir)
+ if rustfmt:
+ install(os.path.basename(rustfmt["url"]), install_dir)
+ for std in stds:
+ install(os.path.basename(std["url"]), install_dir)
+ pass
+ # Workaround for https://github.com/rust-lang/rust/issues/74657:
+ # Remove the .llvmbc and .llvmcmd sections (sections for the LLVM bitcode)
+ # from the compiler_builtins rlib.
+ hack_targets = ()
+ if compiler_builtins_hack:
+ hack_targets = (
+ "x86_64-unknown-linux-gnu",
+ "i686-unknown-linux-gnu",
+ "thumbv7neon-linux-androideabi",
+ "aarch64-linux-android",
+ )
+ llvm_bin = os.path.join(os.environ["MOZ_FETCHES_DIR"], "clang", "bin")
+ for t in hack_targets:
+ if t not in targets:
+ continue
+ for lib in glob.glob(
+ os.path.join(
+ install_dir, "lib", "rustlib", t, "lib", "libcompiler_builtins*"
+ )
+ ):
+ log("Postprocessing %s" % lib)
+ with tempfile.TemporaryDirectory() as d:
+ # Extract all the files from the .rlib
+ subprocess.check_call(
+ [os.path.join(llvm_bin, "llvm-ar"), "x", os.path.abspath(lib)],
+ cwd=d,
+ )
+ files = os.listdir(d)
+ for f in files:
+ if not f.endswith(".o"):
+ continue
+ # For each .o file, remove the aforementioned sections.
+ subprocess.check_call(
+ [
+ os.path.join(llvm_bin, "llvm-objcopy"),
+ "-R",
+ ".llvmbc",
+ "-R",
+ ".llvmcmd",
+ f,
+ ],
+ cwd=d,
+ )
+ # Create a new .rlib with the updated object files.
+ subprocess.check_call(
+ [os.path.join(llvm_bin, "llvm-ar"), "crv", os.path.abspath(lib)]
+ + files,
+ cwd=d,
+ )
+ subprocess.check_call(
+ [os.path.join(llvm_bin, "llvm-ranlib"), os.path.abspath(lib)], cwd=d
+ )
+
+ log("Creating archive...")
+ tar_file = install_dir + ".tar.zst"
+ build_tar_package(tar_file, ".", install_dir)
+ shutil.rmtree(install_dir)
+ log("%s is ready." % tar_file)
+
+ upload_dir = os.environ.get("UPLOAD_DIR")
+ if upload_dir:
+ # Create the upload directory if it doesn't exist.
+ try:
+ log("Creating upload directory in %s..." % os.path.abspath(upload_dir))
+ os.makedirs(upload_dir)
+ except OSError as e:
+ if e.errno != errno.EEXIST:
+ raise
+ # Move the tarball to the output directory for upload.
+ log("Moving %s to the upload directory..." % tar_file)
+ shutil.move(tar_file, upload_dir)
+
+
+def repack_cargo(host, channel="nightly"):
+ log("Repacking cargo for %s..." % host)
+ # Cargo doesn't seem to have a .toml manifest.
+ base_url = "https://static.rust-lang.org/cargo-dist/"
+ req = requests.get(os.path.join(base_url, "channel-cargo-" + channel))
+ req.raise_for_status()
+ file = ""
+ for line in req.iter_lines():
+ if line.find(host) != -1:
+ file = line.strip()
+ if not file:
+ log("No manifest entry for %s!" % host)
+ return
+ manifest = {
+ "date": req.headers["Last-Modified"],
+ "pkg": {
+ "cargo": {
+ "version": channel,
+ "target": {
+ host: {
+ "url": os.path.join(base_url, file),
+ "hash": None,
+ "available": True,
+ },
+ },
+ },
+ },
+ }
+ log("Using manifest for cargo %s." % channel)
+ log("Fetching packages...")
+ cargo = fetch_package(manifest, "cargo", host)
+ log("Installing packages...")
+ install_dir = "cargo"
+ shutil.rmtree(install_dir)
+ install(os.path.basename(cargo["url"]), install_dir)
+ tar_basename = "cargo-%s-repack" % host
+ log("Tarring %s..." % tar_basename)
+ tar_file = tar_basename + ".tar.zst"
+ build_tar_package(tar_file, ".", install_dir)
+ shutil.rmtree(install_dir)
+
+
+def expand_platform(name):
+ """Expand a shortcut name to a full Rust platform string."""
+ platforms = {
+ "android": "armv7-linux-androideabi",
+ "android_x86": "i686-linux-android",
+ "android_x86-64": "x86_64-linux-android",
+ "android_aarch64": "aarch64-linux-android",
+ "linux64": "x86_64-unknown-linux-gnu",
+ "linux32": "i686-unknown-linux-gnu",
+ "mac": "x86_64-apple-darwin",
+ "macos": "x86_64-apple-darwin",
+ "mac64": "x86_64-apple-darwin",
+ "mac32": "i686-apple-darwin",
+ "win64": "x86_64-pc-windows-msvc",
+ "win32": "i686-pc-windows-msvc",
+ "mingw32": "i686-pc-windows-gnu",
+ }
+ return platforms.get(name, name)
+
+
+def validate_channel(channel):
+ """Require a specific release version.
+
+ Packaging from meta-channels, like `stable`, `beta`, or `nightly`
+ doesn't give repeatable output. Reject such channels."""
+ channel_prefixes = ("stable", "beta", "nightly")
+ if any([channel.startswith(c) for c in channel_prefixes]):
+ if "-" not in channel:
+ raise ValueError(
+ 'Generic channel "%s" specified!'
+ "\nPlease give a specific release version"
+ ' like "1.24.0" or "beta-2018-02-20".' % channel
+ )
+
+
+def args():
+ """Read command line arguments and return options."""
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ "--channel",
+ help="Release channel to use:"
+ " 1.xx.y, beta-yyyy-mm-dd,"
+ " nightly-yyyy-mm-dd,"
+ " bors-$rev (grab a build from rust's CI),"
+ " or dev (build from source).",
+ required=True,
+ )
+ parser.add_argument(
+ "--patch",
+ nargs="+",
+ help="apply the given patch file to a dev build."
+ " Patch files should be placed in /build/build-rust."
+ " Patches can be prefixed with `module-path:` to specify they"
+ " apply to that git submodule in the Rust source."
+ " e.g. `src/llvm-project:mypatch.diff` patches rust's llvm.",
+ )
+ parser.add_argument(
+ "--cargo-channel",
+ help="Release channel version to use for cargo."
+ " Defaults to the same as --channel.",
+ )
+ parser.add_argument(
+ "--compiler-builtins-hack",
+ action="store_true",
+ help="Enable workaround for " "https://github.com/rust-lang/rust/issues/74657.",
+ )
+ parser.add_argument(
+ "--host",
+ help="Host platform for the toolchain executable:"
+ " e.g. linux64 or aarch64-linux-android."
+ " Defaults to linux64.",
+ )
+ parser.add_argument(
+ "--target",
+ dest="targets",
+ action="append",
+ default=[],
+ help="Additional target platform to support:"
+ " e.g. linux32 or i686-pc-windows-gnu."
+ " can be given more than once.",
+ )
+ args = parser.parse_args()
+ if not args.cargo_channel:
+ args.cargo_channel = args.channel
+ validate_channel(args.channel)
+ validate_channel(args.cargo_channel)
+ if not args.host:
+ args.host = "linux64"
+ args.host = expand_platform(args.host)
+ args.targets = [expand_platform(t) for t in args.targets]
+
+ return args
+
+
+if __name__ == "__main__":
+ args = vars(args())
+ setup_gpg()
+ repack(**args)
diff --git a/taskcluster/scripts/misc/run-profileserver-macos.sh b/taskcluster/scripts/misc/run-profileserver-macos.sh
new file mode 100755
index 0000000000..61873a273a
--- /dev/null
+++ b/taskcluster/scripts/misc/run-profileserver-macos.sh
@@ -0,0 +1,20 @@
+#! /bin/bash -vex
+set -x -e
+
+####
+# Taskcluster friendly wrapper for running the profileserver on macOS
+####
+
+export UPLOAD_PATH=../../artifacts
+mkdir -p $UPLOAD_PATH
+
+export JARLOG_FILE="en-US.log"
+
+export LLVM_PROFDATA=$MOZ_FETCHES_DIR/clang/bin/llvm-profdata
+
+set -v
+
+./mach python python/mozbuild/mozbuild/action/install.py $MOZ_FETCHES_DIR/target.dmg $MOZ_FETCHES_DIR
+./mach python build/pgo/profileserver.py --binary $MOZ_FETCHES_DIR/*.app/Contents/MacOS/firefox
+
+tar -Jcvf $UPLOAD_PATH/profdata.tar.xz merged.profdata en-US.log
diff --git a/taskcluster/scripts/misc/run-profileserver.sh b/taskcluster/scripts/misc/run-profileserver.sh
new file mode 100755
index 0000000000..dd0ad31f05
--- /dev/null
+++ b/taskcluster/scripts/misc/run-profileserver.sh
@@ -0,0 +1,42 @@
+#! /bin/bash -vex
+
+set -x -e
+
+echo "running as" $(id)
+
+: NEED_XVFB ${NEED_XVFB:=false}
+: UPLOAD_PATH ${UPLOAD_PATH:=$HOME/artifacts}
+export UPLOAD_PATH
+
+####
+# Taskcluster friendly wrapper for running the profileserver
+####
+
+PGO_RUNDIR=obj-firefox/dist
+export JARLOG_FILE="en-US.log"
+export LLVM_PROFDATA=$MOZ_FETCHES_DIR/clang/bin/llvm-profdata
+
+set -v
+
+if $NEED_XVFB; then
+ # run XVfb in the background
+ . /builds/worker/scripts/xvfb.sh
+
+ cleanup() {
+ local rv=$?
+ cleanup_xvfb
+ exit $rv
+ }
+ trap cleanup EXIT INT
+
+ start_xvfb '1024x768x24' 2
+fi
+
+# Move our fetched firefox into objdir/dist so the jarlog entries will match
+# the paths when the final PGO stage packages the build.
+mkdir -p $PGO_RUNDIR
+mkdir -p $UPLOAD_PATH
+mv $MOZ_FETCHES_DIR/firefox $PGO_RUNDIR
+./mach python build/pgo/profileserver.py --binary $PGO_RUNDIR/firefox/firefox
+
+tar -acvf $UPLOAD_PATH/profdata.tar.xz merged.profdata en-US.log
diff --git a/taskcluster/scripts/misc/source-test-clang-non-unified.sh b/taskcluster/scripts/misc/source-test-clang-non-unified.sh
new file mode 100755
index 0000000000..20a34abd14
--- /dev/null
+++ b/taskcluster/scripts/misc/source-test-clang-non-unified.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+NON_UNIFIED_CFG=$GECKO_PATH/build/non-unified-compat
+
+cat "$NON_UNIFIED_CFG" | xargs ./mach static-analysis check-syntax
diff --git a/taskcluster/scripts/misc/source-test-clang-setup.sh b/taskcluster/scripts/misc/source-test-clang-setup.sh
new file mode 100755
index 0000000000..a8288e5a36
--- /dev/null
+++ b/taskcluster/scripts/misc/source-test-clang-setup.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+source $HOME/checkouts/gecko/taskcluster/scripts/misc/source-test-common.sh
+
+# Add clang-tidy to PATH
+export PATH=$MOZ_FETCHES_DIR/clang-tidy/bin:$PATH
+
+# Use toolchain clang
+export LD_LIBRARY_PATH=$MOZ_FETCHES_DIR/clang/lib
+
+# Write custom mozconfig
+export MOZCONFIG=$GECKO_PATH/mozconfig
+
+# Add to mozconfig all the appropriate options
+cat <<EOT >> $MOZCONFIG
+# Enable debug mode
+ac_add_options --enable-debug
+# Enable GC zeal, a testing and debugging feature that helps find GC-related bugs in JSAPI applications.
+ac_add_options --enable-gczeal
+# Do not treat warnings as errors
+ac_add_options --disable-warnings-as-errors
+EOT
+
+# Mach lookup clang-tidy in clang-tools
+mkdir -p $MOZBUILD_STATE_PATH/clang-tools
+ln -s $MOZ_FETCHES_DIR/clang-tidy $MOZBUILD_STATE_PATH/clang-tools/clang-tidy
diff --git a/taskcluster/scripts/misc/source-test-common.sh b/taskcluster/scripts/misc/source-test-common.sh
new file mode 100755
index 0000000000..eb2409cf4e
--- /dev/null
+++ b/taskcluster/scripts/misc/source-test-common.sh
@@ -0,0 +1,16 @@
+#! /bin/bash -vex
+
+set -x -e
+
+export MOZBUILD_STATE_PATH=$HOME/workspace
+
+# Add toolchain binaries to PATH to run ./mach configure
+export PATH=$MOZ_FETCHES_DIR/clang/bin:$PATH
+export PATH=$MOZ_FETCHES_DIR/rustc/bin:$PATH
+export PATH=$MOZ_FETCHES_DIR/cbindgen:$PATH
+export PATH=$MOZ_FETCHES_DIR/nasm:$PATH
+export PATH=$MOZ_FETCHES_DIR/node/bin:$PATH
+
+# Use clang as host compiler
+export CC=$MOZ_FETCHES_DIR/clang/bin/clang
+export CXX=$MOZ_FETCHES_DIR/clang/bin/clang++
diff --git a/taskcluster/scripts/misc/source-test-infer-setup.sh b/taskcluster/scripts/misc/source-test-infer-setup.sh
new file mode 100755
index 0000000000..cfbb6abffc
--- /dev/null
+++ b/taskcluster/scripts/misc/source-test-infer-setup.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+source $GECKO_PATH/taskcluster/scripts/misc/source-test-common.sh
+
+# Write custom mozconfig
+MOZCONFIG=$GECKO_PATH/mozconfig
+echo "ac_add_options --enable-application=mobile/android" > $MOZCONFIG
+echo "ac_add_options --target=arm-linux-androideabi" >> $MOZCONFIG
+echo "ac_add_options --with-android-sdk=${MOZ_FETCHES_DIR}/android-sdk-linux" >> $MOZCONFIG
+echo "ac_add_options --with-android-ndk=${MOZ_FETCHES_DIR}/android-ndk" >> $MOZCONFIG
+
+# Write custom grade properties
+export GRADLE_USER_HOME=$HOME/workspace/gradle
+mkdir -p $GRADLE_USER_HOME
+echo "org.gradle.daemon=false" >> ${GRADLE_USER_HOME}/gradle.properties
+
+# Mach lookup infer in infer...
+mkdir -p $MOZBUILD_STATE_PATH/infer/infer
+mv $MOZ_FETCHES_DIR/infer/{bin,lib} $MOZBUILD_STATE_PATH/infer/infer
diff --git a/taskcluster/scripts/misc/tooltool-download.sh b/taskcluster/scripts/misc/tooltool-download.sh
new file mode 100644
index 0000000000..5f971d725a
--- /dev/null
+++ b/taskcluster/scripts/misc/tooltool-download.sh
@@ -0,0 +1,21 @@
+# Fetch a tooltool manifest.
+
+cd $MOZ_FETCHES_DIR
+
+TOOLTOOL_DL_FLAGS=
+
+if [ -n "$UPLOAD_DIR" ]; then
+ TOOLTOOL_DL_FLAGS="${TOOLTOOL_DL_FLAGS=} --artifact-manifest $UPLOAD_DIR/toolchains.json"
+fi
+
+: TOOLTOOL_CACHE ${TOOLTOOL_CACHE:=/builds/worker/tooltool-cache}
+export TOOLTOOL_CACHE
+
+if [ -z "$TOOLTOOL_MANIFEST" ]; then
+ echo This script should not be used when there is no tooltool manifest set
+ exit 1
+fi
+
+${GECKO_PATH}/mach artifact toolchain -v${TOOLTOOL_DL_FLAGS} --tooltool-manifest "${GECKO_PATH}/${TOOLTOOL_MANIFEST}"${TOOLTOOL_CACHE:+ --cache-dir ${TOOLTOOL_CACHE}} --retry 5
+
+cd $OLDPWD
diff --git a/taskcluster/scripts/misc/unify.sh b/taskcluster/scripts/misc/unify.sh
new file mode 100755
index 0000000000..94e30c33c1
--- /dev/null
+++ b/taskcluster/scripts/misc/unify.sh
@@ -0,0 +1,45 @@
+#!/bin/sh
+# 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/.
+
+set -x -e
+
+export LIPO=$MOZ_FETCHES_DIR/cctools/bin/x86_64-apple-darwin-lipo
+export MKFSHFS=$MOZ_FETCHES_DIR/hfsplus-tools/newfs_hfs
+export DMG_TOOL=$MOZ_FETCHES_DIR/dmg/dmg
+export HFS_TOOL=$MOZ_FETCHES_DIR/dmg/hfsplus
+
+for i in x64 aarch64; do
+ $GECKO_PATH/mach python -m mozbuild.action.unpack_dmg $MOZ_FETCHES_DIR/$i/target.dmg $i
+done
+$GECKO_PATH/mach python $GECKO_PATH/toolkit/mozapps/installer/unify.py x64/*.app aarch64/*.app
+$GECKO_PATH/mach python -m mozbuild.action.make_dmg x64 target.dmg
+
+mkdir -p $UPLOAD_DIR
+mv target.dmg $UPLOAD_DIR/
+
+python3 -c '
+import json
+import os
+
+for artifact in json.loads(os.environ["MOZ_FETCHES"]):
+ if artifact.get("extract") and artifact.get("dest", "").startswith("x64"):
+ print(artifact["dest"], os.path.basename(artifact["artifact"]))
+' | while read dir artifact; do
+ if [ "$artifact" = target.crashreporter-symbols.zip ]; then
+ $GECKO_PATH/mach python $GECKO_PATH/python/mozbuild/mozbuild/action/unify_symbols.py $MOZ_FETCHES_DIR/$dir $MOZ_FETCHES_DIR/aarch64${dir#x64}
+ else
+ $GECKO_PATH/mach python $GECKO_PATH/python/mozbuild/mozbuild/action/unify_tests.py $MOZ_FETCHES_DIR/$dir $MOZ_FETCHES_DIR/aarch64${dir#x64}
+ fi
+
+ case $artifact in
+ *.tar.gz)
+ find $MOZ_FETCHES_DIR/$dir -not -type d -printf '%P\0' | tar -C $MOZ_FETCHES_DIR/$dir --owner=0:0 --group=0:0 -zcf $artifact --no-recursion --null -T -
+ ;;
+ *.zip)
+ $GECKO_PATH/mach python $GECKO_PATH/python/mozbuild/mozbuild/action/zip.py -C $MOZ_FETCHES_DIR/$dir $PWD/$artifact '*'
+ ;;
+ esac
+ mv $artifact $UPLOAD_DIR/
+done
diff --git a/taskcluster/scripts/misc/verify-updatebot.py b/taskcluster/scripts/misc/verify-updatebot.py
new file mode 100755
index 0000000000..f55b29150a
--- /dev/null
+++ b/taskcluster/scripts/misc/verify-updatebot.py
@@ -0,0 +1,266 @@
+#!/usr/bin/env python3
+# 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/.
+
+"""
+The purpose of this job is to run on autoland and ensure that any commits
+made by the Updatebot bot account are reproducible. Patches that aren't
+reproducible indicate some sort of error in this script, or represent
+concerns about the integrity of the patch made by Updatebot.
+
+More simply: If this job fails, any patches by Updatebot SHOULD NOT land
+ because they may represent a security indicent.
+"""
+
+from __future__ import absolute_import, print_function
+
+import re
+import os
+import sys
+import requests
+import subprocess
+
+RE_BUG = re.compile("Bug (\d+)")
+RE_COMMITMSG = re.compile("Update (.+) to new version (.+) from")
+
+
+class Revision:
+ def __init__(self, line):
+ self.node = None
+ self.author = None
+ self.desc = None
+ self.bug = None
+
+ line = line.strip()
+ if not line:
+ return
+
+ components = line.split(" | ")
+ self.node, self.author, self.desc = components[0:3]
+ try:
+ self.bug = RE_BUG.search(self.desc).groups(0)[0]
+ except Exception:
+ pass
+
+ def __str__(self):
+ bug_str = " (No Bug)" if not self.bug else " (Bug %s)" % self.bug
+ return self.node + " by " + self.author + bug_str
+
+
+# ================================================================================================
+# Find all commits we are hopefully landing in this push
+
+assert os.environ.get("GECKO_HEAD_REV"), "No revision head in the environment"
+assert os.environ.get("GECKO_HEAD_REPOSITORY"), "No repository in the environment"
+url = "%s/json-pushes?changeset=%s&version=2" % (
+ os.environ.get("GECKO_HEAD_REPOSITORY"),
+ os.environ.get("GECKO_HEAD_REV"),
+)
+response = requests.get(url)
+revisions_json = response.json()
+
+assert len(revisions_json["pushes"]) >= 1, "Did not see a push in the autoland API"
+pushid = list(revisions_json["pushes"].keys())[0]
+rev_ids = revisions_json["pushes"][pushid]["changesets"]
+
+revisions = []
+for rev_id in rev_ids:
+ rev_detail = subprocess.check_output(
+ [
+ "hg",
+ "log",
+ "--template",
+ "{node} | {author} | {desc|firstline}\n",
+ "-r",
+ rev_id,
+ ]
+ )
+ revisions.append(rev_detail.decode("utf-8"))
+
+if not revisions:
+ msg = """
+Don't see any non-public revisions. This indicates that the mercurial
+repositories may not be operating in an expected way, and a script
+that performs security checks may fail to perform them properly.
+
+Sheriffs: This _does not_ mean the changesets involved need to be backed
+out. You can continue with your usual operation. However; if this occurs
+during a mercurial upgrade, or a refactring of how we treat try/autoland
+or the landing process, it means that we need to revisit the operation
+of this script.
+
+For now, we ask that you file a bug blocking 1618282 indicating the task
+failed so we can investigate the circumstances that caused it to fail.
+ """
+ print(msg)
+ sys.exit(-1)
+
+# ================================================================================================
+# Find all the Updatebot Revisions (there might be multiple updatebot
+# landings in a single push some day!)
+i = 1
+all_revisions = []
+updatebot_revisions = []
+print("There are %i revisions to be evaluated." % len(revisions))
+for r in revisions:
+ revision = Revision(r)
+ if not revision.node:
+ continue
+
+ all_revisions.append(revision)
+ print(" ", i, revision)
+ i += 1
+
+ if revision.author == "Updatebot <updatebot@mozilla.com>":
+ updatebot_revisions.append(revision)
+ if not revision.bug:
+ raise Exception(
+ "Could not find a bug for revision %s (Description: %s)"
+ % (revision.node, revision.desc)
+ )
+
+# ================================================================================================
+# Process each Updatebot revision
+overall_failure = False
+for u in updatebot_revisions:
+ try:
+ print("=" * 80)
+ print("Processing the Updatebot revision %s for Bug %s" % (u.node, u.bug))
+
+ try:
+ target_revision = RE_COMMITMSG.search(u.desc).groups(0)[1]
+ except Exception:
+ print("Could not parse the bug description for the revision: %s" % u.desc)
+ overall_failure = True
+ continue
+
+ # Get the moz.yaml file for the updatebot revision
+ files_changed = subprocess.check_output(["hg", "status", "--change", u.node])
+ files_changed = files_changed.decode("utf-8").split("\n")
+
+ moz_yaml_file = None
+ for f in files_changed:
+ if "moz.yaml" in f:
+ if moz_yaml_file:
+ msg = (
+ "Already had a moz.yaml file (%s) and then we found another? (%s)"
+ % (moz_yaml_file, f)
+ )
+ raise Exception(msg)
+ moz_yaml_file = f[2:]
+
+ # Find all the commits associated with this bug.
+ # They should be ordered with the first commit as the first element and so on.
+ all_commits_for_this_update = [r for r in all_revisions if r.bug == u.bug]
+
+ print(
+ " Found %i commits associated with this bug."
+ % len(all_commits_for_this_update)
+ )
+
+ # Grab the updatebot commit and transform it into patch form
+ commitdiff = (
+ subprocess.check_output(["hg", "export", u.node])
+ .decode("utf-8")
+ .split("\n")
+ )
+ start_index = 0
+ for i in range(len(commitdiff)):
+ if "diff --git" in commitdiff[i]:
+ start_index = i
+ break
+ patch_diff = commitdiff[start_index:]
+
+ # Okay, now go through in reverse order and backout all of the commits for this bug
+ all_commits_reversed = all_commits_for_this_update
+ all_commits_reversed.reverse()
+ for c in all_commits_reversed:
+ print(" Backing out", c.node)
+ # hg doesn't support the ability to commit a backout without prompting the
+ # user, but it does support not committing
+ subprocess.check_output(["hg", "backout", c.node, "--no-commit"])
+ subprocess.check_output(
+ [
+ "hg",
+ "--config",
+ "ui.username=Updatebot Verifier <updatebot@mozilla.com>",
+ "commit",
+ "-m",
+ "Backed out changeset %s" % c.node,
+ ]
+ )
+
+ # And now re-do the updatebot commit
+ print(" Vendoring", moz_yaml_file)
+ ret = subprocess.call(
+ ["./mach", "vendor", "--revision", target_revision, moz_yaml_file]
+ )
+ if ret:
+ print(" Vendoring returned code %i, but we're going to continue..." % ret)
+
+ # And now get the diff
+ recreated_diff = (
+ subprocess.check_output(["hg", "diff"]).decode("utf-8").split("\n")
+ )
+
+ # Now compare it, print if needed, and return.
+ this_failure = False
+ if len(recreated_diff) != len(patch_diff):
+ print(
+ " The recreated diff is %i lines long and the original diff is %i lines long."
+ % (len(recreated_diff), len(patch_diff))
+ )
+ this_failure = True
+
+ for i in range(min(len(recreated_diff), len(patch_diff))):
+ if recreated_diff[i] != patch_diff[i]:
+ if not this_failure:
+ print(
+ " Identified a difference between patches, starting on line %i."
+ % i
+ )
+ this_failure = True
+
+ # Cleanup so we can go to the next one
+ subprocess.check_output(["hg", "revert", "."])
+ subprocess.check_output(
+ [
+ "hg",
+ "--config",
+ "extensions.strip=",
+ "strip",
+ "tip~" + str(len(all_commits_for_this_update) - 1),
+ ]
+ )
+
+ # Now process the outcome
+ if not this_failure:
+ print(" This revision was recreated successfully.")
+ continue
+
+ print("Original Diff:")
+ print("-" * 80)
+ for l in patch_diff:
+ print(l)
+ print("-" * 80)
+ print("Recreated Diff:")
+ print("-" * 80)
+ for l in recreated_diff:
+ print(l)
+ print("-" * 80)
+ overall_failure = True
+ except subprocess.CalledProcessError as e:
+ print("Caught an exception when running:", e.cmd)
+ print("Return Code:", e.returncode)
+ print("-------")
+ print("stdout:")
+ print(e.stdout)
+ print("-------")
+ print("stderr:")
+ print(e.stderr)
+ print("----------------------------------------------")
+ overall_failure = True
+
+if overall_failure:
+ sys.exit(1)
diff --git a/taskcluster/scripts/misc/vs-cleanup.sh b/taskcluster/scripts/misc/vs-cleanup.sh
new file mode 100644
index 0000000000..e60287b2fc
--- /dev/null
+++ b/taskcluster/scripts/misc/vs-cleanup.sh
@@ -0,0 +1,13 @@
+case "$(uname -s)" in
+MINGW*)
+ # For some reason, by the time the task finishes, and when run-task
+ # starts its cleanup, there is still a vctip.exe (MSVC telemetry-related
+ # process) running and using a dll that run-task can't then delete.
+ # "For some reason", because the same doesn't happen with other tasks.
+ # In fact, this used to happen with older versions of MSVC for other
+ # tasks, and stopped when upgrading to 15.8.4...
+ taskkill -f -im vctip.exe || true
+ # Same with the mspdbsrv process.
+ taskkill -f -im mspdbsrv.exe || true
+ ;;
+esac
diff --git a/taskcluster/scripts/misc/vs-setup.sh b/taskcluster/scripts/misc/vs-setup.sh
new file mode 100644
index 0000000000..9da6ae9681
--- /dev/null
+++ b/taskcluster/scripts/misc/vs-setup.sh
@@ -0,0 +1,8 @@
+VSDIR=vs2017_15.8.4
+VSPATH="${MOZ_FETCHES_DIR}/${VSDIR}"
+UNIX_VSPATH="$(cd ${MOZ_FETCHES_DIR} && pwd)/${VSDIR}"
+SDK_VERSION=10.0.17134.0
+
+export INCLUDE="${VSPATH}/VC/include;${VSPATH}/VC/atlmfc/include;${VSPATH}/SDK/Include/${SDK_VERSION}/ucrt;${VSPATH}/SDK/Include/${SDK_VERSION}/shared;${VSPATH}/SDK/Include/${SDK_VERSION}/um;${VSPATH}/SDK/Include/${SDK_VERSION}/winrt;${VSPATH}/DIA SDK/include"
+export LIB="${VSPATH}/VC/lib/x64;${VSPATH}/VC/atlmfc/lib/x64;${VSPATH}/SDK/Lib/${SDK_VERSION}/um/x64;${VSPATH}/SDK/Lib/${SDK_VERSION}/ucrt/x64;${VSPATH}/DIA SDK/lib/amd64"
+export PATH="${UNIX_VSPATH}/VC/bin/Hostx64/x64:${UNIX_VSPATH}/VC/bin/Hostx86/x86:${UNIX_VSPATH}/SDK/bin/${SDK_VERSION}/x64:${UNIX_VSPATH}/redist/x64/Microsoft.VC141.CRT:${UNIX_VSPATH}/SDK/Redist/ucrt/DLLs/x64:${UNIX_VSPATH}/DIA SDK/bin/amd64:$PATH"
diff --git a/taskcluster/scripts/misc/vs-setup32.sh b/taskcluster/scripts/misc/vs-setup32.sh
new file mode 100644
index 0000000000..e39bae36d9
--- /dev/null
+++ b/taskcluster/scripts/misc/vs-setup32.sh
@@ -0,0 +1,8 @@
+VSDIR=vs2017_15.8.4
+VSPATH="${MOZ_FETCHES_DIR}/${VSDIR}"
+UNIX_VSPATH="$(cd ${MOZ_FETCHES_DIR} && pwd)/${VSDIR}"
+SDK_VERSION=10.0.17134.0
+
+export INCLUDE="${VSPATH}/VC/include;${VSPATH}/VC/atlmfc/include;${VSPATH}/SDK/Include/${SDK_VERSION}/ucrt;${VSPATH}/SDK/Include/${SDK_VERSION}/shared;${VSPATH}/SDK/Include/${SDK_VERSION}/um;${VSPATH}/SDK/Include/${SDK_VERSION}/winrt;${VSPATH}/DIA SDK/include"
+export LIB="${VSPATH}/VC/lib/x86;${VSPATH}/VC/atlmfc/lib/x86;${VSPATH}/SDK/Lib/${SDK_VERSION}/um/x86;${VSPATH}/SDK/Lib/${SDK_VERSION}/ucrt/x86;${VSPATH}/DIA SDK/lib"
+export PATH="${UNIX_VSPATH}/VC/bin/Hostx64/x86:${UNIX_VSPATH}/VC/bin/Hostx64/x64:${UNIX_VSPATH}/VC/bin/Hostx86/x86:${UNIX_VSPATH}/SDK/bin/${SDK_VERSION}/x86:${UNIX_VSPATH}/VC/redist/x86/Microsoft.VC141.CRT:${UNIX_VSPATH}/SDK/Redist/ucrt/DLLs/x86:${UNIX_VSPATH}/DIA SDK/bin:$PATH"
diff --git a/taskcluster/scripts/misc/wgpu-deps-vendoring.sh b/taskcluster/scripts/misc/wgpu-deps-vendoring.sh
new file mode 100755
index 0000000000..1b814b7e95
--- /dev/null
+++ b/taskcluster/scripts/misc/wgpu-deps-vendoring.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+set -x -e -v
+
+# This scripts uses `cargo-vendor` to download all the dependencies needed
+# to test `wgpu`, and exports those dependencies as a tarball.
+# This avoids having to download these dependencies on every test job
+# that tests `wgpu`.
+
+UPLOAD_DIR=$HOME/artifacts
+
+cd $GECKO_PATH
+export PATH=$PATH:$MOZ_FETCHES_DIR/rustc/bin:$HOME/.cargo/bin
+cd gfx/wgpu/
+mkdir .cargo
+cargo vendor --sync ./Cargo.toml > .cargo/config
+mkdir wgpu-deps
+mv vendor .cargo wgpu-deps/
+mkdir wgpu-deps/cargo-apk
+# Until there's a version of cargo-apk published on crates.io that has
+# https://github.com/rust-windowing/android-rs-glue/pull/223, we need to use
+# an unpublished version.
+cargo install --path $MOZ_FETCHES_DIR/android-rs-glue/cargo-apk --root wgpu-deps/cargo-apk cargo-apk
+tar caf wgpu-deps.tar.bz2 wgpu-deps
+
+mkdir -p $UPLOAD_DIR
+mv wgpu-deps.tar.bz2 $UPLOAD_DIR/
diff --git a/taskcluster/scripts/misc/wr-cargotest-macos-build.sh b/taskcluster/scripts/misc/wr-cargotest-macos-build.sh
new file mode 100755
index 0000000000..23b4ccedec
--- /dev/null
+++ b/taskcluster/scripts/misc/wr-cargotest-macos-build.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+set -x -e -v
+
+source ${GECKO_PATH}/taskcluster/scripts/misc/wr-macos-cross-build-setup.sh
+
+export UPLOAD_DIR="${HOME}/artifacts"
+mkdir -p "${UPLOAD_DIR}"
+
+# Do a cross-build for cargo test run
+pushd "${GECKO_PATH}/gfx/wr"
+CARGOFLAGS="-vv --frozen --target=${TARGET_TRIPLE}" \
+ CARGOTESTFLAGS="--no-run" \
+ ci-scripts/macos-debug-tests.sh
+# Package up the test binaries
+cd "target/${TARGET_TRIPLE}"
+mkdir cargo-test-binaries
+mv debug cargo-test-binaries/
+find cargo-test-binaries/debug/deps -type f -maxdepth 1 -executable -print0 > binaries.lst
+tar cjf cargo-test-binaries.tar.bz2 --null -T binaries.lst
+mv cargo-test-binaries.tar.bz2 "${UPLOAD_DIR}"
+# Clean the build
+cd "${GECKO_PATH}/gfx/wr"
+rm -rf target
+popd
diff --git a/taskcluster/scripts/misc/wr-macos-cross-build-setup.sh b/taskcluster/scripts/misc/wr-macos-cross-build-setup.sh
new file mode 100755
index 0000000000..ab38fb0199
--- /dev/null
+++ b/taskcluster/scripts/misc/wr-macos-cross-build-setup.sh
@@ -0,0 +1,61 @@
+#!/bin/bash
+set -x -e -v
+
+export TARGET_TRIPLE="x86_64-apple-darwin"
+
+source "${GECKO_PATH}/taskcluster/scripts/misc/tooltool-download.sh"
+
+MACOS_SYSROOT="${MOZ_FETCHES_DIR}/MacOSX10.12.sdk"
+CLANGDIR="${MOZ_FETCHES_DIR}/clang"
+
+# Deploy the wrench dependencies
+mv ${MOZ_FETCHES_DIR}/wrench-deps/{vendor,.cargo} "${GECKO_PATH}/gfx/wr/"
+
+# Building wrench with the `headless` feature also builds the osmesa-src crate,
+# which includes building C++ code. We have to do a bunch of shenanigans
+# to make this cross-compile properly.
+
+pushd "${MOZ_FETCHES_DIR}/cctools/bin"
+
+# Add a pkg-config cross-compile wrapper. Without this, the configure script
+# will use pkg-config from the host, which will find host libraries that are
+# not what we want. This script stolen from
+# https://autotools.io/pkgconfig/cross-compiling.html
+cat > ${TARGET_TRIPLE}-pkg-config <<END_PKGCONFIG_WRAPPER
+#!/bin/sh
+export PKG_CONFIG_DIR=
+export PKG_CONFIG_LIBDIR=${MACOS_SYSROOT}/usr/lib/pkgconfig:${MACOS_SYSROOT}/usr/share/pkgconfig
+export PKG_CONFIG_SYSROOT_DIR=${MACOS_SYSROOT}
+exec pkg-config "$@"
+END_PKGCONFIG_WRAPPER
+chmod +x "${TARGET_TRIPLE}-pkg-config"
+popd
+
+export PATH="${MOZ_FETCHES_DIR}/rustc/bin:${MOZ_FETCHES_DIR}/cctools/bin:${MOZ_FETCHES_DIR}/clang/bin:${MOZ_FETCHES_DIR}/llvm-dsymutil/bin:${MOZ_FETCHES_DIR}/wrench-deps/meson:${PATH}"
+
+# The x86_64-darwin11-ld linker from cctools requires libraries provided
+# by clang, so we need to set LD_LIBRARY_PATH for that to work.
+export LD_LIBRARY_PATH="${CLANGDIR}/lib:${LD_LIBRARY_PATH}"
+
+# Tell the configure script where to find zlib, because otherwise it tries
+# to use pkg-config to find it, which fails (no .pc file in the macos SDK).
+export ZLIB_CFLAGS="-I${MACOS_SYSROOT}/usr/include"
+export ZLIB_LIBS="-L${MACOS_SYSROOT}/usr/lib -lz"
+
+# Set up compiler and flags for cross-compile. Careful to only export the
+# target-specific CFLAGS/CXXFLAGS variables, to not break any host builds.
+LDPATH="${MOZ_FETCHES_DIR}/cctools/bin/${TARGET_TRIPLE}-ld"
+export CC="${CLANGDIR}/bin/clang"
+TARGET_CFLAGS="-fuse-ld=${LDPATH} -target ${TARGET_TRIPLE} -mmacosx-version-min=10.7 --rtlib=compiler-rt --sysroot ${MACOS_SYSROOT}"
+export CFLAGS_${TARGET_TRIPLE//-/_}="${TARGET_CFLAGS}"
+export CXX="${CLANGDIR}/bin/clang++"
+TARGET_CXXFLAGS="-fuse-ld=${LDPATH} -target ${TARGET_TRIPLE} -mmacosx-version-min=10.7 --rtlib=compiler-rt --sysroot ${MACOS_SYSROOT} -stdlib=libc++"
+export CXXFLAGS_${TARGET_TRIPLE//-/_}="${TARGET_CXXFLAGS}"
+export AR="${CLANGDIR}/bin/llvm-ar"
+
+# See documentation in cargo-linker for why we need this. TL;DR is that passing
+# the right arguments to the linker when invoked by cargo is nigh impossible
+# without this.
+export MOZ_CARGO_WRAP_LD="${CC}"
+export MOZ_CARGO_WRAP_LDFLAGS="${TARGET_CFLAGS}"
+export CARGO_TARGET_X86_64_APPLE_DARWIN_LINKER="${GECKO_PATH}/build/cargo-linker"
diff --git a/taskcluster/scripts/misc/wrench-android-build.sh b/taskcluster/scripts/misc/wrench-android-build.sh
new file mode 100755
index 0000000000..87dc55eadb
--- /dev/null
+++ b/taskcluster/scripts/misc/wrench-android-build.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+set -x -e -v
+
+MODE=${1?"First argument must be debug|release"}
+
+pushd "${MOZ_FETCHES_DIR}"
+mv wrench-deps/{vendor,.cargo,cargo-apk} ${GECKO_PATH}/gfx/wr
+popd
+
+pushd "${GECKO_PATH}/gfx/wr/wrench"
+# These things come from the toolchain dependencies of the job that invokes
+# this script (webrender-wrench-android-build).
+export PATH="${PATH}:${MOZ_FETCHES_DIR}/rustc/bin"
+export ANDROID_HOME="${MOZ_FETCHES_DIR}/android-sdk-linux"
+export NDK_HOME="${MOZ_FETCHES_DIR}/android-ndk"
+
+# `cargo apk build` fails whilst attempting to sign the output apk,
+# unless the `.android` directory exists.
+# See https://github.com/rust-windowing/android-rs-glue/issues/252
+mkdir /builds/worker/.android
+if [ "$MODE" == "debug" ]; then
+ ../cargo-apk/bin/cargo-apk build --frozen --verbose
+elif [ "$MODE" == "release" ]; then
+ ../cargo-apk/bin/cargo-apk build --frozen --verbose --release
+else
+ echo "Unknown mode '${MODE}'; must be 'debug' or 'release'"
+ exit 1
+fi
+popd
diff --git a/taskcluster/scripts/misc/wrench-deps-vendoring.sh b/taskcluster/scripts/misc/wrench-deps-vendoring.sh
new file mode 100755
index 0000000000..53769b8cff
--- /dev/null
+++ b/taskcluster/scripts/misc/wrench-deps-vendoring.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+set -x -e -v
+
+# This scripts uses `cargo-vendor` to download all the dependencies needed
+# to build `wrench` (a tool used for standalone testing of webrender), and
+# exports those dependencies as a tarball. This avoids having to download
+# these dependencies on every test job that uses `wrench`.
+
+UPLOAD_DIR=$HOME/artifacts
+
+cd $GECKO_PATH
+export PATH=$PATH:$MOZ_FETCHES_DIR/rustc/bin:$HOME/.cargo/bin
+cd gfx/wr/
+mkdir .cargo
+cargo vendor --sync ./Cargo.toml > .cargo/config
+mkdir wrench-deps
+mv vendor .cargo wrench-deps/
+mkdir wrench-deps/cargo-apk
+# Until there's a version of cargo-apk published on crates.io that has
+# https://github.com/rust-windowing/android-rs-glue/pull/223, we need to use
+# an unpublished version.
+cargo install --path $MOZ_FETCHES_DIR/android-rs-glue/cargo-apk --root wrench-deps/cargo-apk cargo-apk
+
+ci-scripts/install-meson.sh
+mv meson wrench-deps/meson
+
+mkdir -p $UPLOAD_DIR
+tar caf $UPLOAD_DIR/wrench-deps.tar.bz2 wrench-deps
diff --git a/taskcluster/scripts/misc/wrench-macos-build.sh b/taskcluster/scripts/misc/wrench-macos-build.sh
new file mode 100755
index 0000000000..43842d4510
--- /dev/null
+++ b/taskcluster/scripts/misc/wrench-macos-build.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+set -x -e -v
+
+source ${GECKO_PATH}/taskcluster/scripts/misc/wr-macos-cross-build-setup.sh
+
+# The osmesa-src build which we do as part of the headless build below
+# doesn't seem to always use CFLAGS/CXXFLAGS where expected. Instead we
+# just squash those flags into CC/CXX and everything works out.
+# Export HOST_CC and HOST_CXX without the squashed flags, so that host
+# builds use them and don't see the target flags.
+export HOST_CC="${CC}"
+export HOST_CXX="${CXX}"
+CFLAGS_VAR="CFLAGS_${TARGET_TRIPLE//-/_}"
+CXXFLAGS_VAR="CXXFLAGS_${TARGET_TRIPLE//-/_}"
+export CC="${CC} ${!CFLAGS_VAR}"
+export ${CFLAGS_VAR}=
+export CXX="${CXX} ${!CXXFLAGS_VAR}"
+export ${CXXFLAGS_VAR}=
+
+export MESON_CROSSFILE=${GECKO_PATH}/gfx/wr/ci-scripts/etc/wr-darwin.meson
+export UPLOAD_DIR="${HOME}/artifacts"
+mkdir -p "${UPLOAD_DIR}"
+
+# Do a cross-build without the `headless` feature
+pushd "${GECKO_PATH}/gfx/wr/wrench"
+cargo build --release -vv --frozen --target=${TARGET_TRIPLE}
+# Package up the resulting wrench binary
+cd "../target/${TARGET_TRIPLE}"
+mkdir -p wrench-macos/bin
+mv release/wrench wrench-macos/bin/
+tar cjf wrench-macos.tar.bz2 wrench-macos
+mv wrench-macos.tar.bz2 "${UPLOAD_DIR}"
+# Clean the build
+cd "${GECKO_PATH}/gfx/wr"
+rm -rf target
+popd
+
+# Do a cross-build with the `headless` feature
+pushd "${GECKO_PATH}/gfx/wr/wrench"
+cargo build --release -vv --frozen --target=${TARGET_TRIPLE} --features headless
+# Package up the wrench binary and some libraries that we will need
+cd "../target/${TARGET_TRIPLE}"
+
+# Copy the native macOS libLLVM as dynamic dependency
+cp "${MOZ_FETCHES_DIR}/clang-mac/clang/lib/libLLVM.dylib" release/build/osmesa-src*/out/mesa/src/gallium/targets/osmesa/
+
+mkdir wrench-macos-headless
+mv release wrench-macos-headless/
+tar cjf wrench-macos-headless.tar.bz2 \
+ wrench-macos-headless/release/wrench \
+ wrench-macos-headless/release/build/osmesa-src*/out/mesa/src/gallium/targets/osmesa \
+ wrench-macos-headless/release/build/osmesa-src*/out/mesa/src/mapi/shared-glapi
+mv wrench-macos-headless.tar.bz2 "${UPLOAD_DIR}"
+
+# Clean the build
+cd "${GECKO_PATH}/gfx/wr"
+rm -rf target
+popd
diff --git a/taskcluster/scripts/misc/wrench-windows-tests.sh b/taskcluster/scripts/misc/wrench-windows-tests.sh
new file mode 100644
index 0000000000..e3d0a84eae
--- /dev/null
+++ b/taskcluster/scripts/misc/wrench-windows-tests.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+set -x -e -v
+
+# This script runs the windows CI scripts for standalone WebRender. The CI
+# scripts build WebRender in various "standalone" (without Gecko)
+# configurations and also run WebRender's reftest suite using the `wrench`
+# tool in the WebRender repository.
+# The builds involved require a number of dependencies to be available,
+# which is all handled below.
+
+cd $GECKO_PATH
+
+# This will download the rustc, MSVC, and wrench-deps artifacts.
+. taskcluster/scripts/misc/tooltool-download.sh
+export PATH=$PATH:$(cd $MOZ_FETCHES_DIR && pwd)/rustc/bin
+
+. taskcluster/scripts/misc/vs-setup.sh
+
+# Move the wrench-deps vendored crates into place
+mv ${MOZ_FETCHES_DIR}/wrench-deps/{vendor,.cargo} gfx/wr
+cd gfx/wr
+
+# This is needed for the WebRender standalone reftests
+powershell.exe 'iex (Get-Content -Raw ci-scripts\set-screenresolution.ps1); Set-ScreenResolution 1920 1080'
+
+# Run the CI scripts
+export CARGOFLAGS='--verbose --frozen'
+cmd.exe /c 'ci-scripts\windows-tests.cmd'
+
+. $GECKO_PATH/taskcluster/scripts/misc/vs-cleanup.sh
diff --git a/taskcluster/scripts/misc/zstdpy b/taskcluster/scripts/misc/zstdpy
new file mode 100755
index 0000000000..7fc27fded6
--- /dev/null
+++ b/taskcluster/scripts/misc/zstdpy
@@ -0,0 +1,79 @@
+#!/usr/bin/env python3
+# 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 compresses and decompresses data using the zstandard compression
+format, as provided by the python-zstandard module.
+
+Data is provided on stdin and output on stdout."""
+
+import sys
+import zstandard
+from argparse import ArgumentParser
+
+
+def main(argv=None):
+ parser = ArgumentParser(description=__doc__)
+ parser.set_defaults(mode="compress")
+ parser.add_argument(
+ "-z",
+ "--compress",
+ dest="mode",
+ action="store_const",
+ const="compress",
+ help="compress the data (this is the default)",
+ )
+ parser.add_argument(
+ "-d",
+ "--decompress",
+ dest="mode",
+ action="store_const",
+ const="decompress",
+ help="decompress the data",
+ )
+ parser.add_argument(
+ "-T",
+ "--threads",
+ dest="threads",
+ default=1,
+ type=int,
+ help="Compress using # working threads. If 0, use number of CPUs on the system. (default 1)",
+ )
+ parser.add_argument(
+ "-l",
+ "--level",
+ dest="level",
+ default=3,
+ type=int,
+ help="Compression level from 1-22 (default 3)",
+ )
+ parser.add_argument(
+ "file",
+ nargs="?",
+ help="File to compress/decompress. Default is stdin.",
+ )
+
+ args = parser.parse_args(argv)
+
+ # The zstd commandline tool uses 0 to specify number of threads equal to
+ # the number of CPUs whereas the python module uses negative numbers to
+ # flag this behavior. Emulate the zstd commandline utility's behavior here
+ if args.threads == 0:
+ args.threads = -1
+
+ if args.file:
+ in_file = open(args.file, "rb")
+ else:
+ in_file = sys.stdin.buffer
+
+ if args.mode == "compress":
+ ctx = zstandard.ZstdCompressor(level=args.level, threads=args.threads)
+ elif args.mode == "decompress":
+ ctx = zstandard.ZstdDecompressor()
+
+ ctx.copy_stream(in_file, sys.stdout.buffer)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/taskcluster/scripts/run-task b/taskcluster/scripts/run-task
new file mode 100755
index 0000000000..ead4e6bb0d
--- /dev/null
+++ b/taskcluster/scripts/run-task
@@ -0,0 +1,966 @@
+#!/usr/bin/python3 -u
+# 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/.
+
+"""Run a task after performing common actions.
+
+This script is meant to be the "driver" for TaskCluster based tasks.
+It receives some common arguments to control the run-time environment.
+
+It performs actions as requested from the arguments. Then it executes
+the requested process and prints its output, prefixing it with the
+current time to improve log usefulness.
+"""
+
+import sys
+
+
+if sys.version_info[0:2] < (3, 5):
+ print('run-task requires Python 3.5+')
+ sys.exit(1)
+
+
+import argparse
+import datetime
+import errno
+import io
+import json
+import os
+import platform
+import random
+import re
+import shutil
+import signal
+import socket
+import stat
+import subprocess
+
+import urllib.error
+import urllib.request
+
+from threading import Thread
+
+FINGERPRINT_URL = 'http://taskcluster/secrets/v1/secret/project/taskcluster/gecko/hgfingerprint'
+FALLBACK_FINGERPRINT = {
+ 'fingerprints':
+ "sha256:FF:E7:8D:93:E9:56:3C:C0:19:FC:00:4C:18:B9:86:E5:08:E5:10:F5:E2"
+ ":EA:48:E8:22:D3:A3:3A:CA:99:C3:4C"}
+
+HGMOINTERNAL_CONFIG_URL = 'http://taskcluster/secrets/v1/secret/project/taskcluster/gecko/hgmointernal'
+
+CACHE_UID_GID_MISMATCH = '''
+There is a UID/GID mismatch on the cache. This likely means:
+
+a) different tasks are running as a different user/group
+b) different Docker images have different UID/GID for the same user/group
+
+Our cache policy is that the UID/GID for ALL tasks must be consistent
+for the lifetime of the cache. This eliminates permissions problems due
+to file/directory user/group ownership.
+
+To make this error go away, ensure that all Docker images are use
+a consistent UID/GID and that all tasks using this cache are running as
+the same user/group.
+'''
+
+
+NON_EMPTY_VOLUME = '''
+error: volume %s is not empty
+
+Our Docker image policy requires volumes to be empty.
+
+The volume was likely populated as part of building the Docker image.
+Change the Dockerfile and anything run from it to not create files in
+any VOLUME.
+
+A lesser possibility is that you stumbled upon a TaskCluster platform bug
+where it fails to use new volumes for tasks.
+'''
+
+
+FETCH_CONTENT_NOT_FOUND = '''
+error: fetch-content script not found
+
+The script at `taskcluster/scripts/misc/fetch-content` could not be
+detected in the current environment.
+
+If this task clones gecko, make sure the GECKO_PATH environment variable
+is set to proper location. Otherwise, the script may need to be mounted
+or added to the task's docker image then added to the PATH.
+'''
+
+# The exit code to use when caches should be purged and the task retried.
+# This is EX_OSFILE (from sysexits.h):
+# Some system file does not exist, cannot be opened, or has some
+# sort of error (e.g., syntax error).
+EXIT_PURGE_CACHE = 72
+
+
+IS_MACOSX = sys.platform == 'darwin'
+IS_POSIX = os.name == 'posix'
+IS_WINDOWS = os.name == 'nt'
+
+
+def print_line(prefix, m):
+ now = datetime.datetime.utcnow().isoformat().encode('utf-8')
+ # slice microseconds to 3 decimals.
+ now = now[:-3] if now[-7:-6] == b'.' else now
+ bytes = b'[%s %sZ] %s' % (prefix, now, m)
+ written = 0
+ while written < len(bytes):
+ written += (sys.stdout.buffer.write(bytes[written:]) or 0)
+ sys.stdout.buffer.flush()
+
+
+def run_and_prefix_output(prefix, args, *, extra_env=None, cwd=None):
+ """Runs a process and prefixes its output with the time.
+
+ Returns the process exit code.
+ """
+ print_line(
+ prefix,
+ b"executing %r%s\n" % (args, b"in %s" % (cwd.encode("utf-8"),) if cwd else b""),
+ )
+
+ env = dict(os.environ)
+ env.update(extra_env or {})
+
+ # Note: TaskCluster's stdin is a TTY. This attribute is lost
+ # when we pass sys.stdin to the invoked process. If we cared
+ # to preserve stdin as a TTY, we could make this work. But until
+ # someone needs it, don't bother.
+
+ # We want stdout to be bytes on Python 3. That means we can't use
+ # universal_newlines=True (because it implies text mode). But
+ # p.stdout.readline() won't work for bytes text streams. So, on Python 3,
+ # we manually install a latin1 stream wrapper. This allows us to readline()
+ # and preserves bytes, without losing any data.
+
+ p = subprocess.Popen(args,
+ # Disable buffering because we want to receive output
+ # as it is generated so timestamps in logs are
+ # accurate.
+ bufsize=0,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ stdin=sys.stdin.fileno(),
+ env=env,
+ cwd=cwd)
+
+ stdout = io.TextIOWrapper(p.stdout, encoding='latin1')
+
+ while True:
+ data = stdout.readline().encode('latin1')
+
+ if data == b'':
+ break
+
+ print_line(prefix, data)
+
+ return p.wait()
+
+
+def get_posix_user_group(user, group):
+ import grp
+ import pwd
+
+ try:
+ user_record = pwd.getpwnam(user)
+ except KeyError:
+ print('could not find user %s; specify a valid user with --user' % user)
+ sys.exit(1)
+
+ try:
+ group_record = grp.getgrnam(group)
+ except KeyError:
+ print('could not find group %s; specify a valid group with --group' %
+ group)
+ sys.exit(1)
+
+ # Most tasks use worker:worker. We require they have a specific numeric ID
+ # because otherwise it is too easy for files written to caches to have
+ # mismatched numeric IDs, which results in permissions errors.
+ if user_record.pw_name == 'worker' and user_record.pw_uid != 1000:
+ print('user `worker` must have uid=1000; got %d' % user_record.pw_uid)
+ sys.exit(1)
+
+ if group_record.gr_name == 'worker' and group_record.gr_gid != 1000:
+ print('group `worker` must have gid=1000; got %d' % group_record.gr_gid)
+ sys.exit(1)
+
+ # Find all groups to which this user is a member.
+ gids = [g.gr_gid for g in grp.getgrall() if group in g.gr_mem]
+
+ return user_record, group_record, gids
+
+
+def write_audit_entry(path, msg):
+ now = datetime.datetime.utcnow().isoformat().encode('utf-8')
+ with open(path, 'ab') as fh:
+ fh.write(b'[%sZ %s] %s\n' % (
+ now, os.environb.get(b'TASK_ID', b'UNKNOWN'), msg))
+
+
+WANTED_DIR_MODE = stat.S_IXUSR | stat.S_IRUSR | stat.S_IWUSR
+
+
+def set_dir_permissions(path, uid, gid):
+ st = os.lstat(path)
+
+ if st.st_uid != uid or st.st_gid != gid:
+ os.chown(path, uid, gid)
+
+ # Also make sure dirs are writable in case we need to delete
+ # them.
+ if st.st_mode & WANTED_DIR_MODE != WANTED_DIR_MODE:
+ os.chmod(path, st.st_mode | WANTED_DIR_MODE)
+
+
+def chown_recursive(path, user, group, uid, gid):
+ print_line(b'chown',
+ b'recursively changing ownership of %s to %s:%s\n' %
+ (path.encode('utf-8'), user.encode('utf-8'), group.encode(
+ 'utf-8')))
+
+ set_dir_permissions(path, uid, gid)
+
+ for root, dirs, files in os.walk(path):
+ for d in dirs:
+ set_dir_permissions(os.path.join(root, d), uid, gid)
+
+ for f in files:
+ # File may be a symlink that points to nowhere. In which case
+ # os.chown() would fail because it attempts to follow the
+ # symlink. We only care about directory entries, not what
+ # they point to. So setting the owner of the symlink should
+ # be sufficient.
+ os.lchown(os.path.join(root, f), uid, gid)
+
+
+def configure_cache_posix(cache, user, group,
+ untrusted_caches, running_as_root):
+ """Configure a cache path on POSIX platforms.
+
+ For each cache, we write out a special file denoting attributes and
+ capabilities of run-task and the task being executed. These attributes
+ are used by subsequent run-task invocations to validate that use of
+ the cache is acceptable.
+
+ We /could/ blow away the cache data on requirements mismatch.
+ While this would be convenient, this could result in "competing" tasks
+ effectively undoing the other's work. This would slow down task
+ execution in aggregate. Without monitoring for this, people may not notice
+ the problem and tasks would be slower than they could be. We follow the
+ principle of "fail fast" to ensure optimal task execution.
+
+ We also write an audit log of who used the caches. This log is printed
+ during failures to help aid debugging.
+ """
+
+ our_requirements = {
+ # Include a version string that we can bump whenever to trigger
+ # fresh caches. The actual value is not relevant and doesn't need
+ # to follow any explicit order. Since taskgraph bakes this file's
+ # hash into cache names, any change to this file/version is sufficient
+ # to force the use of a new cache.
+ b'version=1',
+ # Include the UID and GID the task will run as to ensure that tasks
+ # with different UID and GID don't share the same cache.
+ b'uid=%d' % user.pw_uid,
+ b'gid=%d' % group.gr_gid,
+ }
+
+ requires_path = os.path.join(cache, '.cacherequires')
+ audit_path = os.path.join(cache, '.cachelog')
+
+ # The cache is empty. Configure it.
+ if not os.listdir(cache):
+ print_line(b'cache', b'cache %s is empty; writing requirements: '
+ b'%s\n' % (
+ cache.encode('utf-8'), b' '.join(sorted(our_requirements))))
+
+ # We write a requirements file so future invocations know what the
+ # requirements are.
+ with open(requires_path, 'wb') as fh:
+ fh.write(b'\n'.join(sorted(our_requirements)))
+
+ # And make it read-only as a precaution against deletion.
+ os.chmod(requires_path, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)
+
+ write_audit_entry(audit_path,
+ b'created; requirements: %s' %
+ b', '.join(sorted(our_requirements)))
+
+ set_dir_permissions(cache, user.pw_uid, group.gr_gid)
+ return
+
+ # The cache has content and we have a requirements file. Validate
+ # requirements alignment.
+ if os.path.exists(requires_path):
+ with open(requires_path, 'rb') as fh:
+ wanted_requirements = set(fh.read().splitlines())
+
+ print_line(b'cache', b'cache %s exists; requirements: %s\n' % (
+ cache.encode('utf-8'), b' '.join(sorted(wanted_requirements))))
+
+ missing = wanted_requirements - our_requirements
+
+ # Allow requirements mismatch for uid/gid if and only if caches
+ # are untrusted. This allows cache behavior on Try to be
+ # reasonable. Otherwise, random tasks could "poison" cache
+ # usability by introducing uid/gid mismatches. For untrusted
+ # environments like Try, this is a perfectly reasonable thing to
+ # allow.
+ if missing and untrusted_caches and running_as_root and \
+ all(s.startswith((b'uid=', b'gid=')) for s in missing):
+ print_line(b'cache',
+ b'cache %s uid/gid mismatch; this is acceptable '
+ b'because caches for this task are untrusted; '
+ b'changing ownership to facilitate cache use\n' %
+ cache.encode('utf-8'))
+ chown_recursive(cache, user.pw_name, group.gr_name, user.pw_uid,
+ group.gr_gid)
+
+ # And write out the updated reality.
+ with open(requires_path, 'wb') as fh:
+ fh.write(b'\n'.join(sorted(our_requirements)))
+
+ write_audit_entry(audit_path,
+ b'chown; requirements: %s' %
+ b', '.join(sorted(our_requirements)))
+
+ elif missing:
+ print('error: requirements for populated cache %s differ from '
+ 'this task' % cache)
+ print('cache requirements: %s' % ' '.join(sorted(
+ s.decode('utf-8') for s in wanted_requirements)))
+ print('our requirements: %s' % ' '.join(sorted(
+ s.decode('utf-8') for s in our_requirements)))
+ if any(s.startswith((b'uid=', b'gid=')) for s in missing):
+ print(CACHE_UID_GID_MISMATCH)
+
+ write_audit_entry(audit_path,
+ b'requirements mismatch; wanted: %s' %
+ b', '.join(sorted(our_requirements)))
+
+ print('')
+ print('audit log:')
+ with open(audit_path, 'r') as fh:
+ print(fh.read())
+
+ return True
+ else:
+ write_audit_entry(audit_path, b'used')
+
+ # We don't need to adjust permissions here because the cache is
+ # associated with a uid/gid and the first task should have set
+ # a proper owner/group.
+
+ return
+
+ # The cache has content and no requirements file. This shouldn't
+ # happen because run-task should be the first thing that touches a
+ # cache.
+ print('error: cache %s is not empty and is missing a '
+ '.cacherequires file; the cache names for this task are '
+ 'likely mis-configured or TASKCLUSTER_CACHES is not set '
+ 'properly' % cache)
+
+ write_audit_entry(audit_path, b'missing .cacherequires')
+ return True
+
+
+def configure_volume_posix(volume, user, group, running_as_root):
+ # The only time we should see files in the volume is if the Docker
+ # image build put files there.
+ #
+ # For the sake of simplicity, our policy is that volumes should be
+ # empty. This also has the advantage that an empty volume looks
+ # a lot like an empty cache. Tasks can rely on caches being
+ # swapped in and out on any volume without any noticeable change
+ # of behavior.
+ volume_files = os.listdir(volume)
+ if volume_files:
+ print(NON_EMPTY_VOLUME % volume)
+ print('entries in root directory: %s' %
+ ' '.join(sorted(volume_files)))
+ sys.exit(1)
+
+ # The volume is almost certainly owned by root:root. Chown it so it
+ # is writable.
+
+ if running_as_root:
+ print_line(b'volume', b'changing ownership of volume %s '
+ b'to %d:%d\n' % (volume.encode('utf-8'),
+ user.pw_uid,
+ group.gr_gid))
+ set_dir_permissions(volume, user.pw_uid, group.gr_gid)
+
+
+def vcs_checkout(source_repo, dest, store_path,
+ base_repo=None, revision=None, branch=None,
+ fetch_hgfingerprint=False, sparse_profile=None):
+ # Specify method to checkout a revision. This defaults to revisions as
+ # SHA-1 strings, but also supports symbolic revisions like `tip` via the
+ # branch flag.
+ if revision:
+ revision_flag = '--revision'
+ revision_value = revision
+ elif branch:
+ revision_flag = '--branch'
+ revision_value = branch
+ else:
+ print('revision is not specified for checkout')
+ sys.exit(1)
+
+ if IS_MACOSX or IS_POSIX:
+ hg_bin = 'hg'
+ elif IS_WINDOWS:
+ # This is where OCC installs it in the AMIs.
+ hg_bin = r'C:\Program Files\Mercurial\hg.exe'
+ if not os.path.exists(hg_bin):
+ print('could not find Mercurial executable: %s' % hg_bin)
+ sys.exit(1)
+
+ store_path = os.path.abspath(store_path)
+ args = [
+ hg_bin,
+ 'robustcheckout',
+ '--sharebase', store_path,
+ '--purge',
+ ]
+
+ # Obtain certificate fingerprints. Without this, the checkout will use the fingerprint
+ # on the system, which is managed some other way (such as puppet)
+ if fetch_hgfingerprint:
+ try:
+ print_line(b'vcs', b'fetching hg.mozilla.org fingerprint from %s\n' %
+ FINGERPRINT_URL.encode('utf-8'))
+ res = urllib.request.urlopen(FINGERPRINT_URL, timeout=10)
+ secret = res.read()
+ try:
+ secret = json.loads(secret.decode('utf-8'))
+ except ValueError:
+ print_line(b'vcs', b'invalid JSON in hg fingerprint secret')
+ sys.exit(1)
+ except (urllib.error.URLError, socket.timeout):
+ print_line(b'vcs', b'Unable to retrieve current hg.mozilla.org fingerprint'
+ b'using the secret service, using fallback instead.')
+ # XXX This fingerprint will not be accurate if running on an old
+ # revision after the server fingerprint has changed.
+ secret = {'secret': FALLBACK_FINGERPRINT}
+
+ hgmo_fingerprint = secret['secret']['fingerprints']
+ args.extend([
+ '--config', 'hostsecurity.hg.mozilla.org:fingerprints=%s' % hgmo_fingerprint,
+ ])
+
+ if base_repo:
+ args.extend(['--upstream', base_repo])
+ if sparse_profile:
+ args.extend(['--sparseprofile', sparse_profile])
+
+ dest = os.path.abspath(dest)
+ args.extend([
+ revision_flag, revision_value,
+ source_repo, dest,
+ ])
+
+ res = run_and_prefix_output(b'vcs', args,
+ extra_env={'PYTHONUNBUFFERED': '1'})
+ if res:
+ sys.exit(res)
+
+ # Update the current revision hash and ensure that it is well formed.
+ revision = subprocess.check_output(
+ [hg_bin, 'log',
+ '--rev', '.',
+ '--template', '{node}'],
+ cwd=dest,
+ # Triggers text mode on Python 3.
+ universal_newlines=True)
+
+ assert re.match('^[a-f0-9]{40}$', revision)
+
+ msg = ("TinderboxPrint:<a href={source_repo}/rev/{revision} "
+ "title='Built from {repo_name} revision {revision}'>"
+ "{revision}</a>\n".format(revision=revision,
+ source_repo=source_repo,
+ repo_name=source_repo.split('/')[-1]))
+
+ print_line(b'vcs', msg.encode('utf-8'))
+
+ return revision
+
+
+def fetch_artifacts():
+ print_line(b'fetches', b'fetching artifacts\n')
+
+ fetch_content = shutil.which('fetch-content')
+ if not fetch_content and os.environ.get('GECKO_PATH'):
+ fetch_content = os.path.join(os.environ['GECKO_PATH'], 'taskcluster',
+ 'scripts', 'misc', 'fetch-content')
+
+ if not fetch_content or not os.path.isfile(fetch_content):
+ fetch_content = os.path.join(os.path.dirname(__file__),
+ 'fetch-content')
+
+ if not os.path.isfile(fetch_content):
+ print(FETCH_CONTENT_NOT_FOUND)
+ sys.exit(1)
+
+ cmd = [sys.executable, '-u', fetch_content, 'task-artifacts']
+ res = run_and_prefix_output(b'fetches', cmd)
+ if res:
+ sys.exit(res)
+
+ print_line(b'fetches', b'finished fetching artifacts\n')
+
+
+def add_vcs_arguments(parser, project, name):
+ """Adds arguments to ArgumentParser to control VCS options for a project."""
+
+ parser.add_argument('--%s-checkout' % project,
+ help='Directory where %s checkout should be created' %
+ name)
+ parser.add_argument('--%s-sparse-profile' % project,
+ help='Path to sparse profile for %s checkout' % name)
+
+
+def resolve_checkout_url(base_repo, head_repo):
+ """Resolve the Mercurial URL to perform a checkout against, either the
+ public hg.mozilla.org service or a CI-only regional mirror.
+
+ The config will be of the form:
+ {
+ "aws/us-west-2": { # key built from `TASKCLUSTER_WORKER_LOCATION` variable
+ "rate": 0.5,
+ "domain": "us-west-2.hgmointernal.net"
+ },
+ "google/us-central1": {...}
+ }
+ """
+ worker_location = os.getenv('TASKCLUSTER_WORKER_LOCATION')
+ if not worker_location:
+ print_line(b'vcs', b'TASKCLUSTER_WORKER_LOCATION environment variable not set; '
+ b'using public hg.mozilla.org service\n')
+ return base_repo, head_repo
+
+ try:
+ worker_location = json.loads(worker_location)
+ except json.JSONDecodeError:
+ print_line(b'vcs', b'Could not decode TASKCLUSTER_WORKER_LOCATION environment variable '
+ b'as JSON. Content: %s\n' % worker_location.encode('utf-8'))
+ print_line(b'vcs', b'using public hg.mozilla.org service\n')
+ return base_repo, head_repo
+
+ if 'cloud' not in worker_location or 'region' not in worker_location:
+ print_line(b'vcs', b'TASKCLUSTER_WORKER_LOCATION missing required keys; '
+ b'using public hg.mozilla.org service\n')
+ return base_repo, head_repo
+
+ config_key = '%(cloud)s/%(region)s' % worker_location
+
+ try:
+ print_line(b'vcs', b'fetching hgmointernal config from %s\n' %
+ HGMOINTERNAL_CONFIG_URL.encode('utf-8'))
+
+ # Get the hgmointernal config Taskcluster secret
+ res = urllib.request.urlopen(HGMOINTERNAL_CONFIG_URL, timeout=10)
+ hgmointernal_config = json.loads(res.read().decode('utf-8'))['secret']
+
+ # Use public hg service if region not yet supported
+ if config_key not in hgmointernal_config:
+ print_line(b'vcs', b'region %s not yet supported; using public '
+ b'hg.mozilla.org service\n' % config_key.encode('utf-8'))
+
+ return base_repo, head_repo
+
+ # Only send a percentage of traffic to the internal mirror
+ rate = float(hgmointernal_config[config_key]['rate'])
+
+ if random.random() > rate:
+ print_line(b'vcs', b'hgmointernal rate miss; using '
+ b'public hg.mozilla.org service\n')
+ return base_repo, head_repo
+
+ print_line(b'vcs', b'hgmointernal rate hit; cloning from '
+ b'private hgweb mirror\n')
+
+ mirror_domain = hgmointernal_config[config_key]['domain']
+
+ if base_repo and base_repo.startswith('https://hg.mozilla.org'):
+ base_repo = base_repo.replace('hg.mozilla.org', mirror_domain, 1)
+
+ if head_repo and head_repo.startswith('https://hg.mozilla.org'):
+ head_repo = head_repo.replace('hg.mozilla.org', mirror_domain, 1)
+
+ return base_repo, head_repo
+
+ except (KeyError, ValueError):
+ print_line(b'vcs', b'invalid JSON in hgmointernal config; '
+ b'falling back to public hg.mozilla.org service\n')
+
+ except (urllib.error.URLError, socket.timeout):
+ print_line(b'vcs', b'Unable to retrieve hgmointernal config using '
+ b'the secret service; falling back to public hg.mozilla.org '
+ b'service\n')
+
+ return base_repo, head_repo
+
+
+def collect_vcs_options(args, project):
+ checkout = getattr(args, '%s_checkout' % project)
+ sparse_profile = getattr(args, '%s_sparse_profile' % project)
+
+ env_prefix = project.upper()
+
+ base_repo = os.environ.get('%s_BASE_REPOSITORY' % env_prefix)
+ head_repo = os.environ.get('%s_HEAD_REPOSITORY' % env_prefix)
+ revision = os.environ.get('%s_HEAD_REV' % env_prefix)
+ branch = os.environ.get('%s_HEAD_REF' % env_prefix)
+
+ store_path = os.environ.get('HG_STORE_PATH')
+
+ # Expand ~ in some paths.
+ if checkout:
+ checkout = os.path.expanduser(checkout)
+ if store_path:
+ store_path = os.path.expanduser(store_path)
+
+ # Some callers set the base repository to mozilla-central for historical
+ # reasons. Switch to mozilla-unified because robustcheckout works best
+ # with it.
+ if base_repo == 'https://hg.mozilla.org/mozilla-central':
+ base_repo = 'https://hg.mozilla.org/mozilla-unified'
+
+ # No need to check the hgmointernal config if we aren't performing
+ # a checkout.
+ if checkout:
+ base_repo, head_repo = resolve_checkout_url(base_repo, head_repo)
+
+ return {
+ 'store-path': store_path,
+ 'project': project,
+ 'env-prefix': env_prefix,
+ 'checkout': checkout,
+ 'sparse-profile': sparse_profile,
+ 'base-repo': base_repo,
+ 'head-repo': head_repo,
+ 'revision': revision,
+ 'branch': branch,
+ }
+
+
+def vcs_checkout_from_args(args, project):
+ options = collect_vcs_options(args, project)
+
+ if not options['checkout']:
+ if options['branch'] and not options['revision']:
+ print('task should be defined in terms of non-symbolic revision')
+ sys.exit(1)
+ return
+
+ os.environ['%s_HEAD_REV' % options['env-prefix']] = vcs_checkout(
+ options['head-repo'],
+ options['checkout'],
+ options['store-path'],
+ base_repo=options['base-repo'],
+ revision=options['revision'],
+ fetch_hgfingerprint=args.fetch_hgfingerprint,
+ branch=options['branch'],
+ sparse_profile=options['sparse-profile'])
+
+
+def maybe_run_resource_monitoring():
+ """Run the resource monitor if available.
+
+ Discussion in https://github.com/taskcluster/taskcluster-rfcs/pull/160
+ and https://bugzil.la/1648051
+ """
+ if 'MOZ_FETCHES' not in os.environ:
+ return
+ if 'RESOURCE_MONITOR_OUTPUT' not in os.environ:
+ return
+
+ prefix = b'resource_monitor'
+
+ executable = '{}/resource-monitor/resource-monitor{}'.format(
+ os.environ.get('MOZ_FETCHES_DIR'), '.exe' if IS_WINDOWS else '')
+
+ if not os.path.exists(executable) or not os.access(executable, os.X_OK):
+ print_line(prefix, b"%s not executable\n" % executable.encode('utf-8'))
+ return
+ args = [
+ executable,
+ '-process',
+ str(os.getpid()),
+ '-output',
+ os.environ["RESOURCE_MONITOR_OUTPUT"],
+ ]
+ print_line(prefix, b"Resource monitor starting: %s\n" % str(args).encode('utf-8'))
+ # Avoid environment variables the payload doesn't need.
+ del os.environ['RESOURCE_MONITOR_OUTPUT']
+
+ # Without CREATE_NEW_PROCESS_GROUP Windows signals will attempt to kill run-task, too.
+ process = subprocess.Popen(args,
+ bufsize=0,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ creationflags=subprocess.CREATE_NEW_PROCESS_GROUP if IS_WINDOWS else 0,
+ cwd=os.getcwd())
+
+ def capture_output():
+ fh = io.TextIOWrapper(process.stdout, encoding='latin1')
+ while True:
+ data = fh.readline().encode('latin1')
+ if data == b'':
+ break
+ print_line(prefix, data)
+
+ monitor_process = Thread(target=capture_output)
+ monitor_process.start()
+ return process
+
+
+def main(args):
+ print_line(b'setup', b'run-task started in %s\n' % os.getcwd().encode('utf-8'))
+ running_as_root = IS_POSIX and os.getuid() == 0
+
+ # Set a reasonable limit to the number of open files.
+ # Running under docker inherits the system defaults, which are not subject
+ # to the "standard" limits set by pam_limits.so, and while they work well
+ # for servers that may receive a lot of connections, they cause performance
+ # problems for things that close file descriptors before forking (for good
+ # reasons), like python's `subprocess.Popen(..., close_fds=True)` (and while
+ # the default was close_fds=False in python2, that changed in python3).
+ # In some cases, Firefox does the same thing when spawning subprocesses.
+ # Processes spawned by this one will inherit the limit set here.
+ try:
+ import resource
+ # Keep the hard limit the same, though, allowing processes to change their
+ # soft limit if they need to (Firefox does, for instance).
+ (soft, hard) = resource.getrlimit(resource.RLIMIT_NOFILE)
+ limit = os.environ.get('MOZ_LIMIT_NOFILE')
+ if limit:
+ limit = int(limit)
+ else:
+ # If no explicit limit is given, use 1024 if it's less than the current
+ # soft limit. For instance, the default on macOS is 256, so we'd pick
+ # that rather than 1024.
+ limit = min(soft, 1024)
+ # Now apply the limit, if it's different from the original one.
+ if limit != soft:
+ resource.setrlimit(resource.RLIMIT_NOFILE, (limit, hard))
+ except ImportError:
+ # The resource module is UNIX only.
+ pass
+
+ # Arguments up to '--' are ours. After are for the main task
+ # to be executed.
+ try:
+ i = args.index('--')
+ our_args = args[0:i]
+ task_args = args[i + 1:]
+ except ValueError:
+ our_args = args
+ task_args = []
+
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--user', default='worker', help='user to run as')
+ parser.add_argument('--group', default='worker', help='group to run as')
+ parser.add_argument('--task-cwd', help='directory to run the provided command in')
+
+ add_vcs_arguments(parser, 'gecko', 'Firefox')
+ add_vcs_arguments(parser, 'comm', 'Comm')
+
+ parser.add_argument('--fetch-hgfingerprint', action='store_true',
+ help='Fetch the latest hgfingerprint from the secrets store, '
+ 'using the taskclsuerProxy')
+
+ args = parser.parse_args(our_args)
+
+ uid = gid = gids = None
+ if IS_POSIX and running_as_root:
+ user, group, gids = get_posix_user_group(args.user, args.group)
+ uid = user.pw_uid
+ gid = group.gr_gid
+
+ if running_as_root and os.path.exists("/dev/kvm"):
+ # Ensure kvm permissions for worker, required for Android x86
+ st = os.stat("/dev/kvm")
+ os.chmod("/dev/kvm", st.st_mode | 0o666)
+
+ # Validate caches.
+ #
+ # Taskgraph should pass in a list of paths that are caches via an
+ # environment variable (which we don't want to pass down to child
+ # processes).
+
+ if 'TASKCLUSTER_CACHES' in os.environ:
+ caches = os.environ['TASKCLUSTER_CACHES'].split(';')
+ del os.environ['TASKCLUSTER_CACHES']
+ else:
+ caches = []
+
+ if 'TASKCLUSTER_UNTRUSTED_CACHES' in os.environ:
+ untrusted_caches = True
+ del os.environ['TASKCLUSTER_UNTRUSTED_CACHES']
+ else:
+ untrusted_caches = False
+
+ for cache in caches:
+ if not os.path.isdir(cache):
+ print('error: cache %s is not a directory; this should never '
+ 'happen' % cache)
+ return 1
+
+ purge = configure_cache_posix(cache, user, group, untrusted_caches,
+ running_as_root)
+
+ if purge:
+ return EXIT_PURGE_CACHE
+
+ if 'TASKCLUSTER_VOLUMES' in os.environ:
+ volumes = os.environ['TASKCLUSTER_VOLUMES'].split(';')
+ del os.environ['TASKCLUSTER_VOLUMES']
+ else:
+ volumes = []
+
+ if volumes and not IS_POSIX:
+ print('assertion failed: volumes not expected on Windows')
+ return 1
+
+ # Sanitize volumes.
+ for volume in volumes:
+ # If a volume is a cache, it was dealt with above.
+ if volume in caches:
+ print_line(b'volume', b'volume %s is a cache\n' %
+ volume.encode('utf-8'))
+ continue
+
+ configure_volume_posix(volume, user, group, running_as_root)
+
+ all_caches_and_volumes = set(map(os.path.normpath, caches))
+ all_caches_and_volumes |= set(map(os.path.normpath, volumes))
+
+ def path_in_cache_or_volume(path):
+ path = os.path.normpath(path)
+
+ while path:
+ if path in all_caches_and_volumes:
+ return True
+
+ path, child = os.path.split(path)
+ if not child:
+ break
+
+ return False
+
+ def prepare_checkout_dir(checkout):
+ if not checkout:
+ return
+
+ # The checkout path becomes the working directory. Since there are
+ # special cache files in the cache's root directory and working
+ # directory purging could blow them away, disallow this scenario.
+ if os.path.exists(os.path.join(checkout, '.cacherequires')):
+ print('error: cannot perform vcs checkout into cache root: %s' %
+ checkout)
+ sys.exit(1)
+
+ # TODO given the performance implications, consider making this a fatal
+ # error.
+ if not path_in_cache_or_volume(checkout):
+ print_line(b'vcs', b'WARNING: vcs checkout path (%s) not in cache '
+ b'or volume; performance will likely suffer\n' %
+ checkout.encode('utf-8'))
+
+ # Ensure the directory for the source checkout exists.
+ try:
+ os.makedirs(os.path.dirname(checkout))
+ except OSError as e:
+ if e.errno != errno.EEXIST:
+ raise
+
+ # And that it is owned by the appropriate user/group.
+ if running_as_root:
+ os.chown(os.path.dirname(checkout), uid, gid)
+
+ def prepare_hg_store_path():
+ # And ensure the shared store path exists and has proper permissions.
+ if 'HG_STORE_PATH' not in os.environ:
+ print('error: HG_STORE_PATH environment variable not set')
+ sys.exit(1)
+
+ store_path = os.environ['HG_STORE_PATH']
+
+ if not path_in_cache_or_volume(store_path):
+ print_line(b'vcs', b'WARNING: HG_STORE_PATH (%s) not in cache or '
+ b'volume; performance will likely suffer\n' %
+ store_path.encode('utf-8'))
+
+ try:
+ os.makedirs(store_path)
+ except OSError as e:
+ if e.errno != errno.EEXIST:
+ raise
+
+ if running_as_root:
+ os.chown(store_path, uid, gid)
+
+ prepare_checkout_dir(args.gecko_checkout)
+ if args.gecko_checkout or args.comm_checkout:
+ prepare_hg_store_path()
+
+ if IS_POSIX and running_as_root:
+ # Drop permissions to requested user.
+ # This code is modeled after what `sudo` was observed to do in a Docker
+ # container. We do not bother calling setrlimit() because containers have
+ # their own limits.
+ print_line(b'setup', b'running as %s:%s\n' % (
+ args.user.encode('utf-8'), args.group.encode('utf-8')))
+
+ os.setgroups(gids)
+ os.umask(0o22)
+ os.setresgid(gid, gid, gid)
+ os.setresuid(uid, uid, uid)
+
+ vcs_checkout_from_args(args, 'gecko')
+ vcs_checkout_from_args(args, 'comm')
+
+ resource_process = None
+
+ try:
+ for k in ('GECKO_PATH', 'MOZ_FETCHES_DIR', 'UPLOAD_DIR'):
+ if k in os.environ:
+ # Normalize paths to use forward slashes. Some shell scripts
+ # tolerate that better on Windows.
+ os.environ[k] = os.path.abspath(os.environ[k]).replace(os.sep, '/')
+ print_line(b'setup', b'%s is %s\n' % (
+ k.encode('utf-8'),
+ os.environ[k].encode('utf-8')))
+
+ if 'MOZ_FETCHES' in os.environ:
+ fetch_artifacts()
+
+ resource_process = maybe_run_resource_monitoring()
+
+ return run_and_prefix_output(b'task', task_args, cwd=args.task_cwd)
+ finally:
+ if resource_process:
+ print_line(b'resource_monitor', b'terminating\n')
+ if IS_WINDOWS:
+ # .terminate() on Windows is not a graceful shutdown, due to
+ # differences in signals. CTRL_BREAK_EVENT will work provided
+ # the subprocess is in a different process group, so this script
+ # isn't also killed.
+ os.kill(resource_process.pid, signal.CTRL_BREAK_EVENT)
+ else:
+ resource_process.terminate()
+ resource_process.wait()
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv[1:]))
diff --git a/taskcluster/scripts/tester/run-wizard b/taskcluster/scripts/tester/run-wizard
new file mode 100755
index 0000000000..9892737352
--- /dev/null
+++ b/taskcluster/scripts/tester/run-wizard
@@ -0,0 +1,178 @@
+#!/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/.
+
+from __future__ import print_function, unicode_literals
+
+import datetime
+import os
+import subprocess
+import sys
+import time
+from distutils.spawn import find_executable
+from textwrap import wrap
+
+here = os.path.dirname(os.path.abspath(__file__))
+MOZHARNESS_WORKDIR = os.path.expanduser(os.path.join('~', 'workspace', 'build'))
+
+MACH_SETUP_FINISHED = """
+Mozharness has finished downloading the build and tests to:
+{}
+
+A limited mach environment has also been set up and added to the $PATH, but
+it may be missing the command you need. To see a list of commands, run:
+ $ mach help
+""".lstrip().format(MOZHARNESS_WORKDIR)
+
+MACH_SETUP_FAILED = """
+Could not set up mach environment, no mach binary detected.
+""".lstrip()
+
+
+def call(cmd, **kwargs):
+ print(" ".join(cmd))
+ return subprocess.call(cmd, **kwargs)
+
+
+def wait_for_run_mozharness(timeout=60):
+ starttime = datetime.datetime.now()
+ while datetime.datetime.now() - starttime < datetime.timedelta(seconds=timeout):
+ if os.path.isfile(os.path.join(here, 'run-mozharness')):
+ break
+ time.sleep(0.2)
+ else:
+ print("Timed out after %d seconds waiting for the 'run-mozharness' binary" % timeout)
+ return 1
+
+
+def setup_mach_environment():
+ mach_src = os.path.join(MOZHARNESS_WORKDIR, 'tests', 'mach')
+ if not os.path.isfile(mach_src):
+ return 1
+
+ mach_dest = os.path.expanduser(os.path.join('~', 'bin', 'mach'))
+ if os.path.exists(mach_dest):
+ os.remove(mach_dest)
+ os.symlink(mach_src, mach_dest)
+ return 0
+
+
+def run_mozharness(*args):
+ wait_for_run_mozharness()
+ try:
+ return call(['run-mozharness'] + list(args))
+ finally:
+ setup_mach_environment()
+
+
+def setup():
+ """Run the mozharness script without the 'run-tests' action.
+
+ This will do all the necessary setup steps like creating a virtualenv and
+ downloading the tests and firefox binary. But it stops before running the
+ tests.
+ """
+ status = run_mozharness('--no-run-tests')
+
+ if find_executable('mach'):
+ print(MACH_SETUP_FINISHED)
+ else:
+ print(MACH_SETUP_FAILED)
+
+ return status
+
+
+def clone():
+ """Clone the correct gecko repository and update to the proper revision."""
+ base_repo = os.environ['GECKO_HEAD_REPOSITORY']
+ dest = os.path.expanduser(os.path.join('~', 'gecko'))
+
+ # Specify method to checkout a revision. This defaults to revisions as
+ # SHA-1 strings, but also supports symbolic revisions like `tip` via the
+ # branch flag.
+ if os.environ.get('GECKO_HEAD_REV'):
+ revision_flag = b'--revision'
+ revision = os.environ['GECKO_HEAD_REV']
+ elif os.environ.get('GECKO_HEAD_REF'):
+ revision_flag = b'--branch'
+ revision = os.environ['GECKO_HEAD_REF']
+ else:
+ print('revision is not specified for checkout')
+ return 1
+
+ # TODO Bug 1301382 - pin hg.mozilla.org fingerprint.
+ call([
+ b'/usr/bin/hg', b'robustcheckout',
+ b'--sharebase', os.environ['HG_STORE_PATH'],
+ b'--purge',
+ b'--upstream', b'https://hg.mozilla.org/mozilla-unified',
+ revision_flag, revision,
+ base_repo, dest
+ ])
+ print("Finished cloning to {} at revision {}.".format(dest, revision))
+
+
+def exit():
+ pass
+
+
+OPTIONS = [
+ ('Resume task', run_mozharness,
+ "Resume the original task without modification. This can be useful for "
+ "passively monitoring it from another shell."),
+ ('Setup task', setup,
+ "Setup the task (download the application and tests) but don't run the "
+ "tests just yet. The tests can be run with a custom configuration later. "
+ "This will provide a mach environment (experimental)."),
+ ('Clone gecko', clone,
+ "Perform a clone of gecko using the task's repo and update it to the "
+ "task's revision."),
+ ('Exit', exit, "Exit this wizard and return to the shell.")
+]
+
+
+def _fmt_options():
+ max_line_len = 60
+ max_name_len = max(len(o[0]) for o in OPTIONS)
+
+ # TODO Pad will be off if there are more than 9 options.
+ pad = ' ' * (max_name_len+6)
+
+ msg = []
+ for i, (name, _, desc) in enumerate(OPTIONS):
+ desc = wrap(desc, width=max_line_len)
+ desc = [desc[0]] + [pad + l for l in desc[1:]]
+
+ optstr = '{}) {} - {}\n'.format(
+ i+1, name.ljust(max_name_len), '\n'.join(desc))
+ msg.append(optstr)
+ msg.append("Select one of the above options: ")
+ return '\n'.join(msg)
+
+
+def wizard():
+ print("This wizard can help you get started with some common debugging "
+ "workflows.\nWhat would you like to do?\n")
+ print(_fmt_options(), end="")
+ choice = None
+ while True:
+ choice = raw_input().decode('utf8')
+ try:
+ choice = int(choice)-1
+ if 0 <= choice < len(OPTIONS):
+ break
+ except ValueError:
+ pass
+
+ print("Must provide an integer from 1-{}:".format(len(OPTIONS)))
+
+ func = OPTIONS[choice][1]
+ ret = func()
+
+ print("Use the 'run-wizard' command to start this wizard again.")
+ return ret
+
+
+if __name__ == '__main__':
+ sys.exit(wizard())
diff --git a/taskcluster/scripts/tester/test-linux.sh b/taskcluster/scripts/tester/test-linux.sh
new file mode 100755
index 0000000000..2367c0a390
--- /dev/null
+++ b/taskcluster/scripts/tester/test-linux.sh
@@ -0,0 +1,286 @@
+#! /bin/bash -xe
+
+set -x -e
+
+echo "running as" $(id)
+
+# Detect distribution
+. /etc/os-release
+if [ "${ID}" == "ubuntu" ]; then
+ DISTRIBUTION="Ubuntu"
+elif [ "${ID}" == "debian" ]; then
+ DISTRIBUTION="Debian"
+else
+ DISTRIBUTION="Unknown"
+fi
+
+# Detect release version if supported
+FILE="/etc/lsb-release"
+if [ -e $FILE ] ; then
+ . /etc/lsb-release
+ RELEASE="${DISTRIB_RELEASE}"
+else
+ RELEASE="unknown"
+fi
+
+####
+# Taskcluster friendly wrapper for performing fx desktop tests via mozharness.
+####
+
+# Inputs, with defaults
+
+: GECKO_PATH ${GECKO_PATH}
+: MOZHARNESS_PATH ${MOZHARNESS_PATH}
+: MOZHARNESS_URL ${MOZHARNESS_URL}
+: MOZHARNESS_SCRIPT ${MOZHARNESS_SCRIPT}
+: MOZHARNESS_CONFIG ${MOZHARNESS_CONFIG}
+: MOZHARNESS_OPTIONS ${MOZHARNESS_OPTIONS}
+: NEED_XVFB ${NEED_XVFB:=true}
+: NEED_WINDOW_MANAGER ${NEED_WINDOW_MANAGER:=false}
+: NEED_PULSEAUDIO ${NEED_PULSEAUDIO:=false}
+: NEED_COMPIZ ${NEED_COPMPIZ:=false}
+: START_VNC ${START_VNC:=false}
+: TASKCLUSTER_INTERACTIVE ${TASKCLUSTER_INTERACTIVE:=false}
+: mozharness args "${@}"
+: WORKING_DIR ${WORKING_DIR:=$(pwd)}
+: WORKSPACE ${WORKSPACE:=${WORKING_DIR%/}/workspace}
+
+set -v
+mkdir -p "$WORKSPACE"
+cd "$WORKSPACE"
+
+fail() {
+ echo # make sure error message is on a new line
+ echo "[test-linux.sh:error]" "${@}"
+ exit 1
+}
+
+# start pulseaudio
+maybe_start_pulse() {
+ if $NEED_PULSEAUDIO; then
+ # call pulseaudio for Ubuntu only
+ if [ $DISTRIBUTION == "Ubuntu" ]; then
+ pulseaudio --daemonize --log-level=4 --log-time=1 --log-target=stderr --start --fail -vvvvv --exit-idle-time=-1 --cleanup-shm --dump-conf
+ fi
+ fi
+}
+
+# test required parameters are supplied
+if [ -z "${MOZHARNESS_PATH}" -a -z "${MOZHARNESS_URL}" ]; then
+ fail "MOZHARNESS_PATH or MOZHARNESS_URL must be defined";
+fi
+
+if [[ -z ${MOZHARNESS_SCRIPT} ]]; then fail "MOZHARNESS_SCRIPT is not set"; fi
+if [[ -z ${MOZHARNESS_CONFIG} ]]; then fail "MOZHARNESS_CONFIG is not set"; fi
+
+if [ $MOZ_ENABLE_WAYLAND ]; then
+ NEED_XVFB=true
+ NEED_WINDOW_MANAGER=true
+fi
+
+# make sure artifact directories exist
+mkdir -p "$WORKSPACE/logs"
+mkdir -p "$WORKING_DIR/artifacts/public"
+mkdir -p "$WORKSPACE/build/blobber_upload_dir"
+
+cleanup_mutter() {
+ local mutter_pids=`ps aux | grep 'mutter --wayland' | grep -v grep | awk '{print $2}'`
+ if [ "$mutter_pids" != "" ]; then
+ echo "Killing the following Mutter processes: $mutter_pids"
+ sudo kill $mutter_pids
+ else
+ echo "No Mutter processes to kill"
+ fi
+}
+
+cleanup() {
+ local rv=$?
+ if [[ -s $HOME/.xsession-errors ]]; then
+ # To share X issues
+ cp "$HOME/.xsession-errors" "$WORKING_DIR/artifacts/public/xsession-errors.log"
+ fi
+ if [ $MOZ_ENABLE_WAYLAND ]; then
+ cleanup_mutter
+ fi
+ if $NEED_XVFB; then
+ cleanup_xvfb
+ fi
+ exit $rv
+}
+trap cleanup EXIT INT
+
+# Download mozharness with exponential backoff
+# curl already applies exponential backoff, but not for all
+# failed cases, apparently, as we keep getting failed downloads
+# with 404 code.
+download_mozharness() {
+ local max_attempts=10
+ local timeout=1
+ local attempt=0
+
+ echo "Downloading mozharness"
+
+ while [[ $attempt < $max_attempts ]]; do
+ if curl --fail -o mozharness.zip --retry 10 -L $MOZHARNESS_URL; then
+ rm -rf mozharness
+ if unzip -q mozharness.zip -d mozharness; then
+ return 0
+ fi
+ echo "error unzipping mozharness.zip" >&2
+ else
+ echo "failed to download mozharness zip" >&2
+ fi
+ echo "Download failed, retrying in $timeout seconds..." >&2
+ sleep $timeout
+ timeout=$((timeout*2))
+ attempt=$((attempt+1))
+ done
+
+ fail "Failed to download and unzip mozharness"
+}
+
+# Download mozharness if we're told to.
+if [ ${MOZHARNESS_URL} ]; then
+ download_mozharness
+ rm mozharness.zip
+
+ if ! [ -d mozharness ]; then
+ fail "mozharness zip did not contain mozharness/"
+ fi
+
+ MOZHARNESS_PATH=`pwd`/mozharness
+fi
+
+# run XVfb in the background, if necessary
+if $NEED_XVFB; then
+ # note that this file is not available when run under native-worker
+ . $HOME/scripts/xvfb.sh
+ start_xvfb '1600x1200x24' 0
+fi
+
+if $START_VNC; then
+ x11vnc > "$WORKING_DIR/artifacts/public/x11vnc.log" 2>&1 &
+fi
+
+if $NEED_WINDOW_MANAGER; then
+ # This is read by xsession to select the window manager
+ . /etc/lsb-release
+ if [ $DISTRIBUTION == "Ubuntu" ] && [ $RELEASE == "16.04" ]; then
+ echo DESKTOP_SESSION=ubuntu > $HOME/.xsessionrc
+ elif [ $DISTRIBUTION == "Ubuntu" ] && [ $RELEASE == "18.04" ]; then
+ echo export DESKTOP_SESSION=gnome > $HOME/.xsessionrc
+ echo export XDG_CURRENT_DESKTOP=GNOME > $HOME/.xsessionrc
+ if [ $MOZ_ENABLE_WAYLAND ]; then
+ echo export XDG_SESSION_TYPE=wayland >> $HOME/.xsessionrc
+ else
+ echo export XDG_SESSION_TYPE=x11 >> $HOME/.xsessionrc
+ fi
+ else
+ :
+ fi
+
+ # DISPLAY has already been set above
+ # XXX: it would be ideal to add a semaphore logic to make sure that the
+ # window manager is ready
+ /etc/X11/Xsession 2>&1 &
+
+ # Turn off the screen saver and screen locking
+ gsettings set org.gnome.desktop.screensaver idle-activation-enabled false
+ gsettings set org.gnome.desktop.screensaver lock-enabled false
+ gsettings set org.gnome.desktop.screensaver lock-delay 3600
+
+ # Disable the screen saver
+ xset s off s reset
+
+ # This starts the gnome-keyring-daemon with an unlocked login keyring. libsecret uses this to
+ # store secrets. Firefox uses libsecret to store a key that protects sensitive information like
+ # credit card numbers.
+ if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
+ # if not found, launch a new one
+ eval `dbus-launch --sh-syntax`
+ fi
+ eval `echo '' | /usr/bin/gnome-keyring-daemon -r -d --unlock --components=secrets`
+
+ # Run mutter as nested wayland compositor to provide Wayland environment
+ # on top of XVfb.
+ if [ $MOZ_ENABLE_WAYLAND ]; then
+ env | grep "DISPLAY"
+ export XDG_RUNTIME_DIR=$WORKING_DIR
+ mutter --display=:0 --wayland --nested &
+ export WAYLAND_DISPLAY=wayland-0
+ retry_count=0
+ max_retries=5
+ until [ $retry_count -gt $max_retries ]; do
+ if [ -S "$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY" ]; then
+ retry_count=$(($max_retries + 1))
+ else
+ retry_count=$(($retry_count + 1))
+ echo "Waiting for Mutter, retry: $retry_count"
+ sleep 2
+ fi
+ done
+ fi
+fi
+
+if [[ $NEED_COMPIZ == true ]] && [[ $RELEASE == 16.04 ]]; then
+ compiz 2>&1 &
+elif [[ $NEED_COMPIZ == true ]] && [[ $RELEASE == 18.04 ]]; then
+ compiz --replace 2>&1 &
+fi
+
+# Bug 1607713 - set cursor position to 0,0 to avoid odd libx11 interaction
+if [ $NEED_WINDOW_MANAGER ] && [ $DISPLAY == ':0' ]; then
+ xwit -root -warp 0 0
+fi
+
+maybe_start_pulse
+
+# For telemetry purposes, the build process wants information about the
+# source it is running
+export MOZ_SOURCE_REPO="${GECKO_HEAD_REPOSITORY}"
+export MOZ_SOURCE_CHANGESET="${GECKO_HEAD_REV}"
+
+# support multiple, space delimited, config files
+config_cmds=""
+for cfg in $MOZHARNESS_CONFIG; do
+ config_cmds="${config_cmds} --config-file ${MOZHARNESS_PATH}/configs/${cfg}"
+done
+
+if [ -n "$MOZHARNESS_OPTIONS" ]; then
+ options=""
+ for option in $MOZHARNESS_OPTIONS; do
+ options="$options --$option"
+ done
+fi
+
+# Use |mach python| if a source checkout exists so in-tree packages are
+# available.
+[[ -x "${GECKO_PATH}/mach" ]] && python="${PYTHON:-python2.7} ${GECKO_PATH}/mach python" || python="${PYTHON:-python2.7}"
+
+# Save the computed mozharness command to a binary which is useful for
+# interactive mode.
+mozharness_bin="$HOME/bin/run-mozharness"
+mkdir -p $(dirname $mozharness_bin)
+
+echo -e "#!/usr/bin/env bash
+# Some mozharness scripts assume base_work_dir is in
+# the current working directory, see bug 1279237
+cd "$WORKSPACE"
+cmd=\"${python} ${MOZHARNESS_PATH}/scripts/${MOZHARNESS_SCRIPT} ${config_cmds} ${options} ${@} \${@}\"
+echo \"Running: \${cmd}\"
+exec \${cmd}" > ${mozharness_bin}
+chmod +x ${mozharness_bin}
+
+# In interactive mode, the user will be prompted with options for what to do.
+if ! $TASKCLUSTER_INTERACTIVE; then
+ # run the given mozharness script and configs, but pass the rest of the
+ # arguments in from our own invocation
+ ${mozharness_bin};
+fi
+
+# Run a custom mach command (this is typically used by action tasks to run
+# harnesses in a particular way)
+if [ "$CUSTOM_MACH_COMMAND" ]; then
+ eval "'$WORKSPACE/build/tests/mach' ${CUSTOM_MACH_COMMAND} ${@}"
+ exit $?
+fi