diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index ecbb02f..c35bb42 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -4,7 +4,6 @@ updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
- # Check for updates on Sunday, 8PM UTC
- interval: "weekly"
- day: "sunday"
- time: "20:00"
+ # Check for updates on the first Sunday of every month, 8PM UTC
+ interval: "cron"
+ cronjob: "0 20 * * sun#1"
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index e5c53b3..c963249 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -52,7 +52,7 @@ jobs:
XZ_VERSION: ${{ steps.extract.outputs.XZ_VERSION }}
steps:
- - uses: actions/checkout@v4.1.7
+ - uses: actions/checkout@v6
- name: Extract config variables
id: extract
@@ -78,28 +78,27 @@ jobs:
echo "XZ_VERSION=${XZ_VERSION}" | tee -a ${GITHUB_OUTPUT}
build:
- runs-on: macOS-latest
+ runs-on: macOS-15
needs: [ config ]
strategy:
fail-fast: false
matrix:
- target: ['macOS', 'iOS', 'tvOS', 'watchOS']
- include:
- - briefcase-run-args:
- - run-tests: false
-
- - target: macOS
- run-tests: true
-
- - target: iOS
- briefcase-run-args: ' -d "iPhone SE (3rd generation)"'
- run-tests: true
+ platform: ['macOS', 'iOS', 'tvOS', 'watchOS']
steps:
- - uses: actions/checkout@v4.1.7
+ - uses: actions/checkout@v6
+
+ - name: Set up Xcode
+ # GitHub recommends explicitly selecting the desired Xcode version:
+ # https://github.com/actions/runner-images/issues/12541#issuecomment-3083850140
+ # This became a necessity as a result of
+ # https://github.com/actions/runner-images/issues/12541 and
+ # https://github.com/actions/runner-images/issues/12751.
+ run: |
+ sudo xcode-select --switch /Applications/Xcode_16.4.app
- name: Set up Python
- uses: actions/setup-python@v5.4.0
+ uses: actions/setup-python@v6.1.0
with:
# Appending -dev ensures that we can always build the dev release.
# It's a no-op for versions that have been published.
@@ -108,31 +107,193 @@ jobs:
# It's an edge case, but when a new alpha is released, we need to use it ASAP.
check-latest: true
- - name: Build ${{ matrix.target }}
+ - name: Build ${{ matrix.platform }}
run: |
- # Do the build for the requested target.
- make ${{ matrix.target }} BUILD_NUMBER=${{ needs.config.outputs.BUILD_NUMBER }}
+ # Do the build for the requested platform.
+ make ${{ matrix.platform }} BUILD_NUMBER=${{ needs.config.outputs.BUILD_NUMBER }}
- name: Upload build artefacts
- uses: actions/upload-artifact@v4.6.1
+ uses: actions/upload-artifact@v6.0.0
+ with:
+ name: Python-${{ needs.config.outputs.PYTHON_VER }}-${{ matrix.platform }}-support.${{ needs.config.outputs.BUILD_NUMBER }}.tar.gz
+ path: dist/Python-${{ needs.config.outputs.PYTHON_VER }}-${{ matrix.platform }}-support.${{ needs.config.outputs.BUILD_NUMBER }}.tar.gz
+
+ briefcase-testbed:
+ name: Briefcase testbed (${{ matrix.platform }})
+ runs-on: macOS-15
+ needs: [ config, build ]
+ strategy:
+ fail-fast: false
+ matrix:
+ platform: ["macOS", "iOS"]
+ include:
+ - briefcase-run-args:
+
+ - platform: iOS
+ briefcase-run-args: ' -d "iPhone 16e::iOS 18.5"'
+
+ steps:
+ - uses: actions/checkout@v6
+
+ - name: Set up Xcode
+ # GitHub recommends explicitly selecting the desired Xcode version:
+ # https://github.com/actions/runner-images/issues/12541#issuecomment-3083850140
+ # This became a necessity as a result of
+ # https://github.com/actions/runner-images/issues/12541 and
+ # https://github.com/actions/runner-images/issues/12751.
+ run: |
+ sudo xcode-select --switch /Applications/Xcode_16.4.app
+
+ - name: Get build artifact
+ uses: actions/download-artifact@v7.0.0
with:
- name: Python-${{ needs.config.outputs.PYTHON_VER }}-${{ matrix.target }}-support.${{ needs.config.outputs.BUILD_NUMBER }}.tar.gz
- path: dist/Python-${{ needs.config.outputs.PYTHON_VER }}-${{ matrix.target }}-support.${{ needs.config.outputs.BUILD_NUMBER }}.tar.gz
+ pattern: Python-${{ needs.config.outputs.PYTHON_VER }}-${{ matrix.platform }}-support.${{ needs.config.outputs.BUILD_NUMBER }}.tar.gz
+ path: dist
+ merge-multiple: true
- - uses: actions/checkout@v4.1.7
- if: matrix.run-tests
+ - name: Set up Python
+ uses: actions/setup-python@v6.1.0
+ with:
+ # Appending -dev ensures that we can always build the dev release.
+ # It's a no-op for versions that have been published.
+ python-version: ${{ needs.config.outputs.PYTHON_VER }}-dev
+ # Ensure that we *always* use the latest build, not a cached version.
+ # It's an edge case, but when a new alpha is released, we need to use it ASAP.
+ check-latest: true
+
+ - uses: actions/checkout@v6
with:
repository: beeware/Python-support-testbed
path: Python-support-testbed
- name: Install dependencies
- if: matrix.run-tests
run: |
# Use the development version of Briefcase
python -m pip install git+https://github.com/beeware/briefcase.git
- name: Run support testbed check
- if: matrix.run-tests
- timeout-minutes: 10
+ timeout-minutes: 15
working-directory: Python-support-testbed
- run: briefcase run ${{ matrix.target }} Xcode --test ${{ matrix.briefcase-run-args }} -C support_package=\'../dist/Python-${{ needs.config.outputs.PYTHON_VER }}-${{ matrix.target }}-support.${{ needs.config.outputs.BUILD_NUMBER }}.tar.gz\'
+ run: briefcase run ${{ matrix.platform }} Xcode --test ${{ matrix.briefcase-run-args }} -C support_package=\'../dist/Python-${{ needs.config.outputs.PYTHON_VER }}-${{ matrix.platform }}-support.${{ needs.config.outputs.BUILD_NUMBER }}.tar.gz\'
+
+ cpython-testbed:
+ name: CPython testbed (${{ matrix.platform }})
+ runs-on: macOS-15
+ needs: [ config, build ]
+ strategy:
+ fail-fast: false
+ matrix:
+ platform: ["iOS", "tvOS"]
+ include:
+ - platform: "iOS"
+ testbed-args: '--simulator "iPhone 16e,arch=arm64,OS=18.5"'
+
+ steps:
+ - uses: actions/checkout@v6
+
+ - name: Get build artifact
+ uses: actions/download-artifact@v7.0.0
+ with:
+ pattern: Python-${{ needs.config.outputs.PYTHON_VER }}-${{ matrix.platform }}-support.${{ needs.config.outputs.BUILD_NUMBER }}.tar.gz
+ path: dist
+ merge-multiple: true
+
+ - name: Set up Xcode
+ # GitHub recommends explicitly selecting the desired Xcode version:
+ # https://github.com/actions/runner-images/issues/12541#issuecomment-3083850140
+ # This became a necessity as a result of
+ # https://github.com/actions/runner-images/issues/12541 and
+ # https://github.com/actions/runner-images/issues/12751.
+ run: |
+ sudo xcode-select --switch /Applications/Xcode_16.4.app
+
+ - name: Set up Python
+ uses: actions/setup-python@v6.1.0
+ with:
+ # Appending -dev ensures that we can always build the dev release.
+ # It's a no-op for versions that have been published.
+ python-version: ${{ needs.config.outputs.PYTHON_VER }}-dev
+ # Ensure that we *always* use the latest build, not a cached version.
+ # It's an edge case, but when a new alpha is released, we need to use it ASAP.
+ check-latest: true
+
+ - name: Unpack support package
+ run: |
+ mkdir -p support/${{ needs.config.outputs.PYTHON_VER }}/${{ matrix.platform }}
+ cd support/${{ needs.config.outputs.PYTHON_VER }}/${{ matrix.platform }}
+ tar zxvf ../../../dist/Python-${{ needs.config.outputs.PYTHON_VER }}-${{ matrix.platform }}-support.${{ needs.config.outputs.BUILD_NUMBER }}.tar.gz
+
+ - name: Run CPython testbed
+ timeout-minutes: 15
+ working-directory: support/${{ needs.config.outputs.PYTHON_VER }}/${{ matrix.platform }}
+ run: |
+ # Run a representative subset of CPython core tests:
+ # - test_builtin as a test of core language tools
+ # - test_grammar as a test of core language features
+ # - test_os as a test of system library calls
+ # - test_bz2 as a simple test of third party libraries
+ # - test_ctypes as a test of FFI
+ python -m testbed run --verbose ${{ matrix.testbed-args }} -- test -W --timeout=-1 test_builtin test_grammar test_os test_bz2 test_ctypes
+
+ crossenv-test:
+ name: Cross-platform env test (${{ matrix.multiarch }})
+ runs-on: macOS-latest
+ needs: [ config, build ]
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - platform: iOS
+ slice: ios-arm64_x86_64-simulator
+ multiarch: arm64-iphonesimulator
+ - platform: iOS
+ slice: ios-arm64_x86_64-simulator
+ multiarch: x86_64-iphonesimulator
+ - platform: iOS
+ slice: ios-arm64
+ multiarch: arm64-iphoneos
+
+ steps:
+ - uses: actions/checkout@v6
+
+ - name: Get build artifact
+ uses: actions/download-artifact@v7.0.0
+ with:
+ pattern: Python-${{ needs.config.outputs.PYTHON_VER }}-${{ matrix.platform }}-support.${{ needs.config.outputs.BUILD_NUMBER }}.tar.gz
+ path: dist
+ merge-multiple: true
+
+ - name: Set up Python
+ uses: actions/setup-python@v6.1.0
+ with:
+ # Appending -dev ensures that we can always build the dev release.
+ # It's a no-op for versions that have been published.
+ python-version: ${{ needs.config.outputs.PYTHON_VER }}-dev
+ # Ensure that we *always* use the latest build, not a cached version.
+ # It's an edge case, but when a new alpha is released, we need to use it ASAP.
+ check-latest: true
+
+ - name: Unpack support package
+ run: |
+ mkdir -p support/${{ needs.config.outputs.PYTHON_VER }}/${{ matrix.platform }}
+ cd support/${{ needs.config.outputs.PYTHON_VER }}/${{ matrix.platform }}
+ tar zxvf ../../../dist/Python-${{ needs.config.outputs.PYTHON_VER }}-${{ matrix.platform }}-support.${{ needs.config.outputs.BUILD_NUMBER }}.tar.gz
+
+ - name: Run cross-platform environment test
+ env:
+ PYTHON_CROSS_PLATFORM: ${{ matrix.platform }}
+ PYTHON_CROSS_SLICE: ${{ matrix.slice }}
+ PYTHON_CROSS_MULTIARCH: ${{ matrix.multiarch }}
+ run: |
+ # Create and activate a native virtual environment
+ python${{ needs.config.outputs.PYTHON_VER }} -m venv cross-venv
+ source cross-venv/bin/activate
+
+ # Install pytest
+ python -m pip install pytest
+
+ # Convert venv into cross-venv
+ python support/${{ needs.config.outputs.PYTHON_VER }}/${{ matrix.platform }}/Python.xcframework/${{ matrix.slice }}/platform-config/${{ matrix.multiarch }}/make_cross_venv.py cross-venv
+
+ # Run the test suite
+ python -m pytest tests
diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml
index 5d2ce75..8ba1300 100644
--- a/.github/workflows/publish.yaml
+++ b/.github/workflows/publish.yaml
@@ -8,10 +8,10 @@ jobs:
publish:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- name: Set up Python environment
- uses: actions/setup-python@v5.4.0
+ uses: actions/setup-python@v6.1.0
with:
python-version: "3.X"
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index 0f9beb0..9437313 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -40,14 +40,14 @@ jobs:
needs: [ config, ci ]
steps:
- name: Get build artifacts
- uses: actions/download-artifact@v4.1.9
+ uses: actions/download-artifact@v7.0.0
with:
pattern: Python-*
path: dist
merge-multiple: true
- name: Create Release
- uses: ncipollo/release-action@v1.16.0
+ uses: ncipollo/release-action@v1.20.0
with:
name: ${{ needs.ci.outputs.PYTHON_VER }}-${{ needs.config.outputs.BUILD_NUMBER }}
tag: ${{ needs.ci.outputs.PYTHON_VER }}-${{ needs.config.outputs.BUILD_NUMBER }}
diff --git a/Makefile b/Makefile
index 955207d..b0b655c 100644
--- a/Makefile
+++ b/Makefile
@@ -18,7 +18,7 @@ BUILD_NUMBER=custom
# of a release cycle, as official binaries won't be published.
# PYTHON_MICRO_VERSION is the full version number, without any alpha/beta/rc suffix. (e.g., 3.10.0)
# PYTHON_VER is the major/minor version (e.g., 3.10)
-PYTHON_VERSION=3.10.16
+PYTHON_VERSION=3.10.19
PYTHON_PKG_VERSION=3.10.11
PYTHON_MICRO_VERSION=$(shell echo $(PYTHON_VERSION) | grep -Eo "\d+\.\d+\.\d+")
PYTHON_PKG_MICRO_VERSION=$(shell echo $(PYTHON_PKG_VERSION) | grep -Eo "\d+\.\d+\.\d+")
@@ -26,10 +26,10 @@ PYTHON_VER=$(basename $(PYTHON_VERSION))
# The binary releases of dependencies, published at:
# https://github.com/beeware/cpython-apple-source-deps/releases
-BZIP2_VERSION=1.0.8-1
-LIBFFI_VERSION=3.4.7-1
-OPENSSL_VERSION=3.0.16-1
-XZ_VERSION=5.6.4-1
+BZIP2_VERSION=1.0.8-2
+LIBFFI_VERSION=3.4.7-2
+OPENSSL_VERSION=3.0.18-1
+XZ_VERSION=5.6.4-2
# Supported OS
OS_LIST=macOS iOS tvOS watchOS
@@ -38,18 +38,26 @@ CURL_FLAGS=--disable --fail --location --create-dirs --progress-bar
# macOS targets
TARGETS-macOS=macosx.x86_64 macosx.arm64
+TRIPLE_OS-macOS=macos
+PLATFORM_NAME-macOS=macOS
VERSION_MIN-macOS=11.0
# iOS targets
TARGETS-iOS=iphonesimulator.x86_64 iphonesimulator.arm64 iphoneos.arm64
+TRIPLE_OS-iOS=ios
+PLATFORM_NAME-iOS=iOS
VERSION_MIN-iOS=13.0
# tvOS targets
TARGETS-tvOS=appletvsimulator.x86_64 appletvsimulator.arm64 appletvos.arm64
+TRIPLE_OS-tvOS=tvos
+PLATFORM_NAME-tvOS=tvOS
VERSION_MIN-tvOS=12.0
# watchOS targets
TARGETS-watchOS=watchsimulator.x86_64 watchsimulator.arm64 watchos.arm64_32
+TRIPLE_OS-watchOS=watchos
+PLATFORM_NAME-watchOS=watchOS
VERSION_MIN-watchOS=4.0
# The architecture of the machine doing the build
@@ -79,13 +87,13 @@ update-patch:
# comparing between the current state of the 3.X branch against the v3.X.Y
# tag associated with the release being built. This allows you to
# maintain a branch that contains custom patches against the default Python.
- # The patch archived in this respository is based on github.com/freakboy3742/cpython
+ # The patch archived in this repository is based on github.com/freakboy3742/cpython
# Requires patchutils (installable via `brew install patchutils`); this
# also means we need to re-introduce homebrew to the path for the filterdiff
# call
if [ -z "$(PYTHON_REPO_DIR)" ]; then echo "\n\nPYTHON_REPO_DIR must be set to the root of your Python github checkout\n\n"; fi
cd $(PYTHON_REPO_DIR) && \
- git diff -D v$(PYTHON_VERSION) $(PYTHON_VER)-patched \
+ git diff --no-renames -D v$(PYTHON_VERSION) $(PYTHON_VER)-patched \
| PATH="/usr/local/bin:/opt/homebrew/bin:$(PATH)" filterdiff \
-X $(PROJECT_DIR)/patch/Python/diff.exclude -p 1 --clean \
> $(PROJECT_DIR)/patch/Python/Python.patch
@@ -127,10 +135,10 @@ ARCH-$(target)=$$(subst .,,$$(suffix $(target)))
ifneq ($(os),macOS)
ifeq ($$(findstring simulator,$$(SDK-$(target))),)
-TARGET_TRIPLE-$(target)=$$(ARCH-$(target))-apple-$$(OS_LOWER-$(target))$$(VERSION_MIN-$(os))
+TARGET_TRIPLE-$(target)=$$(ARCH-$(target))-apple-$$(TRIPLE_OS-$(os))$$(VERSION_MIN-$(os))
IS_SIMULATOR-$(target)=False
else
-TARGET_TRIPLE-$(target)=$$(ARCH-$(target))-apple-$$(OS_LOWER-$(target))$$(VERSION_MIN-$(os))-simulator
+TARGET_TRIPLE-$(target)=$$(ARCH-$(target))-apple-$$(TRIPLE_OS-$(os))$$(VERSION_MIN-$(os))-simulator
IS_SIMULATOR-$(target)=True
endif
endif
@@ -256,7 +264,7 @@ $$(PYTHON_SRCDIR-$(target))/configure: \
# Apply target Python patches
cd $$(PYTHON_SRCDIR-$(target)) && patch -p1 < $(PROJECT_DIR)/patch/Python/Python.patch
# Make sure the binary scripts are executable
- chmod 755 $$(PYTHON_SRCDIR-$(target))/$(os)/Resources/bin/*
+ chmod 755 $$(PYTHON_SRCDIR-$(target))/Apple/$(os)/Resources/bin/*
# Touch the configure script to ensure that Make identifies it as up to date.
touch $$(PYTHON_SRCDIR-$(target))/configure
@@ -264,7 +272,7 @@ $$(PYTHON_SRCDIR-$(target))/Makefile: \
$$(PYTHON_SRCDIR-$(target))/configure
# Configure target Python
cd $$(PYTHON_SRCDIR-$(target)) && \
- PATH="$(PROJECT_DIR)/$$(PYTHON_SRCDIR-$(target))/$(os)/Resources/bin:$(PATH)" \
+ PATH="$(PROJECT_DIR)/$$(PYTHON_SRCDIR-$(target))/Apple/$(os)/Resources/bin:$(PATH)" \
./configure \
CFLAGS="-I$$(XZ_INSTALL-$(target))/include -I$$(BZIP2_INSTALL-$(target))/include" \
LDFLAGS="-L$$(XZ_INSTALL-$(target))/lib -L$$(BZIP2_INSTALL-$(target))/lib" \
@@ -281,14 +289,14 @@ $$(PYTHON_SRCDIR-$(target))/Makefile: \
$$(PYTHON_SRCDIR-$(target))/python.exe: $$(PYTHON_SRCDIR-$(target))/Makefile
@echo ">>> Build Python for $(target)"
cd $$(PYTHON_SRCDIR-$(target)) && \
- PATH="$(PROJECT_DIR)/$$(PYTHON_SRCDIR-$(target))/$(os)/Resources/bin:$(PATH)" \
+ PATH="$(PROJECT_DIR)/$$(PYTHON_SRCDIR-$(target))/Apple/$(os)/Resources/bin:$(PATH)" \
make all \
2>&1 | tee -a ../python-$(PYTHON_VERSION).build.log
$$(PYTHON_LIB-$(target)): $$(PYTHON_SRCDIR-$(target))/python.exe
@echo ">>> Install Python for $(target)"
cd $$(PYTHON_SRCDIR-$(target)) && \
- PATH="$(PROJECT_DIR)/$$(PYTHON_SRCDIR-$(target))/$(os)/Resources/bin:$(PATH)" \
+ PATH="$(PROJECT_DIR)/$$(PYTHON_SRCDIR-$(target))/Apple/$(os)/Resources/bin:$(PATH)" \
make install \
2>&1 | tee -a ../python-$(PYTHON_VERSION).install.log
@@ -297,7 +305,7 @@ $$(PYTHON_LIB-$(target)): $$(PYTHON_SRCDIR-$(target))/python.exe
$$(PYTHON_PLATFORM_SITECUSTOMIZE-$(target)):
- @echo ">>> Create cross-plaform config for $(target)"
+ @echo ">>> Create cross-platform config for $(target)"
mkdir -p $$(PYTHON_PLATFORM_CONFIG-$(target))
# Create the cross-platform site definition
echo "import _cross_$$(ARCH-$(target))_$$(SDK-$(target)); import _cross_venv;" \
@@ -369,15 +377,13 @@ define build-sdk
sdk=$1
os=$2
-OS_LOWER-$(sdk)=$(shell echo $(os) | tr '[:upper:]' '[:lower:]')
-
SDK_TARGETS-$(sdk)=$$(filter $(sdk).%,$$(TARGETS-$(os)))
SDK_ARCHES-$(sdk)=$$(sort $$(subst .,,$$(suffix $$(SDK_TARGETS-$(sdk)))))
ifeq ($$(findstring simulator,$(sdk)),)
-SDK_SLICE-$(sdk)=$$(OS_LOWER-$(sdk))-$$(shell echo $$(SDK_ARCHES-$(sdk)) | sed "s/ /_/g")
+SDK_SLICE-$(sdk)=$$(TRIPLE_OS-$(os))-$$(shell echo $$(SDK_ARCHES-$(sdk)) | sed "s/ /_/g")
else
-SDK_SLICE-$(sdk)=$$(OS_LOWER-$(sdk))-$$(shell echo $$(SDK_ARCHES-$(sdk)) | sed "s/ /_/g")-simulator
+SDK_SLICE-$(sdk)=$$(TRIPLE_OS-$(os))-$$(shell echo $$(SDK_ARCHES-$(sdk)) | sed "s/ /_/g")-simulator
endif
# Expand the build-target macro for target on this OS
@@ -398,7 +404,6 @@ PYTHON_INSTALL_VERSION-$(sdk)=$$(PYTHON_FRAMEWORK-$(sdk))/Versions/$(PYTHON_VER)
PYTHON_LIB-$(sdk)=$$(PYTHON_INSTALL_VERSION-$(sdk))/Python
PYTHON_INCLUDE-$(sdk)=$$(PYTHON_INSTALL_VERSION-$(sdk))/include/python$(PYTHON_VER)
PYTHON_MODULEMAP-$(sdk)=$$(PYTHON_INCLUDE-$(sdk))/module.modulemap
-PYTHON_STDLIB-$(sdk)=$$(PYTHON_INSTALL_VERSION-$(sdk))/lib/python$(PYTHON_VER)
else
# Non-macOS builds need to be merged on a per-SDK basis. The merge covers:
@@ -413,7 +418,6 @@ PYTHON_FRAMEWORK-$(sdk)=$$(PYTHON_INSTALL-$(sdk))/Python.framework
PYTHON_LIB-$(sdk)=$$(PYTHON_FRAMEWORK-$(sdk))/Python
PYTHON_BIN-$(sdk)=$$(PYTHON_INSTALL-$(sdk))/bin
PYTHON_INCLUDE-$(sdk)=$$(PYTHON_FRAMEWORK-$(sdk))/Headers
-PYTHON_STDLIB-$(sdk)=$$(PYTHON_INSTALL-$(sdk))/lib/python$(PYTHON_VER)
PYTHON_PLATFORM_CONFIG-$(sdk)=$$(PYTHON_INSTALL-$(sdk))/platform-config
$$(PYTHON_LIB-$(sdk)): $$(foreach target,$$(SDK_TARGETS-$(sdk)),$$(PYTHON_LIB-$$(target)))
@@ -456,34 +460,31 @@ $$(PYTHON_INCLUDE-$(sdk))/pyconfig.h: $$(PYTHON_LIB-$(sdk))
$$(foreach target,$$(SDK_TARGETS-$(sdk)),cp $$(PYTHON_INCLUDE-$$(target))/pyconfig.h $$(PYTHON_INCLUDE-$(sdk))/pyconfig-$$(ARCH-$$(target)).h; )
# Copy the cross-target header from the source folder of the first target in the $(sdk) SDK
- cp $$(PYTHON_SRCDIR-$$(firstword $$(SDK_TARGETS-$(sdk))))/$(os)/Resources/pyconfig.h $$(PYTHON_INCLUDE-$(sdk))/pyconfig.h
+ cp $$(PYTHON_SRCDIR-$$(firstword $$(SDK_TARGETS-$(sdk))))/Apple/$(os)/Resources/pyconfig.h $$(PYTHON_INCLUDE-$(sdk))/pyconfig.h
-$$(PYTHON_STDLIB-$(sdk))/LICENSE.TXT: $$(PYTHON_LIB-$(sdk)) $$(PYTHON_FRAMEWORK-$(sdk))/Info.plist $$(PYTHON_INCLUDE-$(sdk))/pyconfig.h $$(foreach target,$$(SDK_TARGETS-$(sdk)),$$(PYTHON_PLATFORM_SITECUSTOMIZE-$$(target)))
+$$(PYTHON_PLATFORM_CONFIG-$(sdk))/sitecustomize.py: $$(PYTHON_LIB-$(sdk)) $$(PYTHON_FRAMEWORK-$(sdk))/Info.plist $$(PYTHON_INCLUDE-$(sdk))/pyconfig.h $$(foreach target,$$(SDK_TARGETS-$(sdk)),$$(PYTHON_PLATFORM_SITECUSTOMIZE-$$(target)))
@echo ">>> Build Python stdlib for the $(sdk) SDK"
- mkdir -p $$(PYTHON_STDLIB-$(sdk))/lib-dynload
- # Copy stdlib from the first target associated with the $(sdk) SDK
- cp -r $$(PYTHON_STDLIB-$$(firstword $$(SDK_TARGETS-$(sdk))))/ $$(PYTHON_STDLIB-$(sdk))
+ mkdir -p $$(PYTHON_INSTALL-$(sdk))/lib
- # Delete the single-SDK parts of the standard library
- rm -rf \
- $$(PYTHON_STDLIB-$(sdk))/_sysconfigdata__*.py \
- $$(PYTHON_STDLIB-$(sdk))/config-* \
- $$(PYTHON_STDLIB-$(sdk))/lib-dynload/*
+ # Create arch-specific stdlib directories
+ $$(foreach target,$$(SDK_TARGETS-$(sdk)),mkdir -p $$(PYTHON_INSTALL-$(sdk))/lib-$$(ARCH-$$(target))/python$(PYTHON_VER); )
+ $$(foreach target,$$(SDK_TARGETS-$(sdk)),cp $$(PYTHON_STDLIB-$$(target))/_sysconfigdata_* $$(PYTHON_INSTALL-$(sdk))/lib-$$(ARCH-$$(target))/python$(PYTHON_VER)/; )
+ $$(foreach target,$$(SDK_TARGETS-$(sdk)),cp -r $$(PYTHON_STDLIB-$$(target))/lib-dynload $$(PYTHON_INSTALL-$(sdk))/lib-$$(ARCH-$$(target))/python$(PYTHON_VER)/; )
- # Copy the individual _sysconfigdata modules into names that include the architecture
- $$(foreach target,$$(SDK_TARGETS-$(sdk)),cp $$(PYTHON_STDLIB-$$(target))/_sysconfigdata_* $$(PYTHON_STDLIB-$(sdk))/; )
+ # Copy in known-required xcprivacy files.
+ # Libraries linking OpenSSL must provide a privacy manifest. The one in this repository
+ # has been sourced from https://github.com/openssl/openssl/blob/openssl-3.0/os-dep/Apple/PrivacyInfo.xcprivacy
+ $$(foreach target,$$(SDK_TARGETS-$(sdk)),cp $(PROJECT_DIR)/patch/Python/OpenSSL.xcprivacy $$(PYTHON_STDLIB-$$(target))/lib-dynload/_hashlib.xcprivacy; )
+ $$(foreach target,$$(SDK_TARGETS-$(sdk)),cp $(PROJECT_DIR)/patch/Python/OpenSSL.xcprivacy $$(PYTHON_STDLIB-$$(target))/lib-dynload/_ssl.xcprivacy; )
# Copy the platform site folders for each architecture
mkdir -p $$(PYTHON_PLATFORM_CONFIG-$(sdk))
$$(foreach target,$$(SDK_TARGETS-$(sdk)),cp -r $$(PYTHON_PLATFORM_CONFIG-$$(target)) $$(PYTHON_PLATFORM_CONFIG-$(sdk)); )
- # Merge the binary modules from each target in the $(sdk) SDK into a single binary
- $$(foreach module,$$(wildcard $$(PYTHON_STDLIB-$$(firstword $$(SDK_TARGETS-$(sdk))))/lib-dynload/*),lipo -create -output $$(PYTHON_STDLIB-$(sdk))/lib-dynload/$$(notdir $$(module)) $$(foreach target,$$(SDK_TARGETS-$(sdk)),$$(PYTHON_STDLIB-$$(target))/lib-dynload/$$(notdir $$(module))); )
-
endif
-$(sdk): $$(PYTHON_STDLIB-$(sdk))/LICENSE.TXT
+$(sdk): $$(PYTHON_PLATFORM_CONFIG-$(sdk))/sitecustomize.py
###########################################################################
# SDK: Debug
@@ -500,8 +501,7 @@ vars-$(sdk):
@echo "PYTHON_LIB-$(sdk): $$(PYTHON_LIB-$(sdk))"
@echo "PYTHON_BIN-$(sdk): $$(PYTHON_BIN-$(sdk))"
@echo "PYTHON_INCLUDE-$(sdk): $$(PYTHON_INCLUDE-$(sdk))"
- @echo "PYTHON_STDLIB-$(sdk): $$(PYTHON_STDLIB-$(sdk))"
-
+ @echo "PYTHON_PLATFORM_CONFIG-$(sdk): $$(PYTHON_PLATFORM_CONFIG-$(sdk))"
@echo
endef # build-sdk
@@ -606,22 +606,40 @@ dist/Python-$(PYTHON_VER)-macOS-support.$(BUILD_NUMBER).tar.gz: \
else
$$(PYTHON_XCFRAMEWORK-$(os))/Info.plist: \
- $$(foreach sdk,$$(SDKS-$(os)),$$(PYTHON_STDLIB-$$(sdk))/LICENSE.TXT)
+ $$(foreach sdk,$$(SDKS-$(os)),$$(PYTHON_PLATFORM_CONFIG-$$(sdk))/sitecustomize.py)
@echo ">>> Create Python.XCFramework on $(os)"
mkdir -p $$(dir $$(PYTHON_XCFRAMEWORK-$(os)))
xcodebuild -create-xcframework \
-output $$(PYTHON_XCFRAMEWORK-$(os)) $$(foreach sdk,$$(SDKS-$(os)),-framework $$(PYTHON_FRAMEWORK-$$(sdk))) \
2>&1 | tee -a support/$(PYTHON_VER)/python-$(os).xcframework.log
+ @echo ">>> Install build tools for $(os)"
+ mkdir $$(PYTHON_XCFRAMEWORK-$(os))/build
+ cp $$(PYTHON_SRCDIR-$$(firstword $$(SDK_TARGETS-$$(firstword $$(SDKS-$(os))))))/Apple/testbed/Python.xcframework/build/utils.sh $$(PYTHON_XCFRAMEWORK-$(os))/build
+ cp $$(PYTHON_SRCDIR-$$(firstword $$(SDK_TARGETS-$$(firstword $$(SDKS-$(os))))))/Apple/testbed/Python.xcframework/build/$$(PLATFORM_NAME-$(os))-dylib-Info-template.plist $$(PYTHON_XCFRAMEWORK-$(os))/build
+
+ @echo ">>> Install stdlib for $(os)"
+ mkdir -p $$(PYTHON_XCFRAMEWORK-$(os))/lib
+ cp -r $$(PYTHON_STDLIB-$$(firstword $$(SDK_TARGETS-$$(firstword $$(SDKS-$(os))))))/ $$(PYTHON_XCFRAMEWORK-$(os))/lib/python$(PYTHON_VER)
+
+ # Delete the single-SDK parts of the standard library
+ rm -rf \
+ $$(PYTHON_XCFRAMEWORK-$(os))/lib/python$(PYTHON_VER)/_sysconfigdata__*.py \
+ $$(PYTHON_XCFRAMEWORK-$(os))/lib/python$(PYTHON_VER)/config-* \
+ $$(PYTHON_XCFRAMEWORK-$(os))/lib/python$(PYTHON_VER)/lib-dynload
+
@echo ">>> Install PYTHONHOME for $(os)"
$$(foreach sdk,$$(SDKS-$(os)),cp -r $$(PYTHON_INSTALL-$$(sdk))/include $$(PYTHON_XCFRAMEWORK-$(os))/$$(SDK_SLICE-$$(sdk)); )
$$(foreach sdk,$$(SDKS-$(os)),cp -r $$(PYTHON_INSTALL-$$(sdk))/bin $$(PYTHON_XCFRAMEWORK-$(os))/$$(SDK_SLICE-$$(sdk)); )
- $$(foreach sdk,$$(SDKS-$(os)),cp -r $$(PYTHON_INSTALL-$$(sdk))/lib $$(PYTHON_XCFRAMEWORK-$(os))/$$(SDK_SLICE-$$(sdk)); )
+ $$(foreach sdk,$$(SDKS-$(os)),cp -r $$(PYTHON_INSTALL-$$(sdk))/lib* $$(PYTHON_XCFRAMEWORK-$(os))/$$(SDK_SLICE-$$(sdk)); )
$$(foreach sdk,$$(SDKS-$(os)),cp -r $$(PYTHON_INSTALL-$$(sdk))/platform-config $$(PYTHON_XCFRAMEWORK-$(os))/$$(SDK_SLICE-$$(sdk)); )
-ifeq ($(os),iOS)
+ # Create symlink for dylib
+ $$(foreach sdk,$$(SDKS-$(os)),ln -si ../Python.framework/Python $$(PYTHON_XCFRAMEWORK-$(os))/$$(SDK_SLICE-$$(sdk))/lib/libpython$(PYTHON_VER).dylib; )
+
+ifeq ($(filter $(os),iOS tvOS),$(os))
@echo ">>> Clone testbed project for $(os)"
- $(HOST_PYTHON) $$(PYTHON_SRCDIR-$$(firstword $$(SDK_TARGETS-$$(firstword $$(SDKS-$(os))))))/iOS/testbed clone --framework $$(PYTHON_XCFRAMEWORK-$(os)) support/$(PYTHON_VER)/$(os)/testbed
+ $(HOST_PYTHON) $$(PYTHON_SRCDIR-$$(firstword $$(SDK_TARGETS-$$(firstword $$(SDKS-$(os))))))/Apple/testbed clone --platform $(os) --framework $$(PYTHON_XCFRAMEWORK-$(os)) support/$(PYTHON_VER)/$(os)/testbed
endif
@echo ">>> Create VERSIONS file for $(os)"
diff --git a/patch/Python/OpenSSL.xcprivacy b/patch/Python/OpenSSL.xcprivacy
new file mode 100644
index 0000000..95780a0
--- /dev/null
+++ b/patch/Python/OpenSSL.xcprivacy
@@ -0,0 +1,23 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryFileTimestamp
+ NSPrivacyAccessedAPITypeReasons
+
+ C617.1
+
+
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyTracking
+
+
+
diff --git a/patch/Python/Python.patch b/patch/Python/Python.patch
index 820af1d..770d78f 100644
--- a/patch/Python/Python.patch
+++ b/patch/Python/Python.patch
@@ -1,17799 +1,20303 @@
-diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst
-index 21c19903464..61baa722359 100644
---- a/Doc/library/importlib.rst
-+++ b/Doc/library/importlib.rst
-@@ -1466,6 +1466,69 @@
- Boolean indicating whether or not the module's "origin"
- attribute refers to a loadable location.
-
-+.. class:: AppleFrameworkLoader(name, path)
+--- /dev/null
++++ b/.ruff.toml
+@@ -0,0 +1,12 @@
++# Default settings for Ruff in CPython
+
-+ A specialization of :class:`importlib.machinery.ExtensionFileLoader` that
-+ is able to load extension modules in Framework format.
++# PYTHON_FOR_REGEN
++target-version = "py310"
+
-+ For compatibility with the iOS App Store, *all* binary modules in an iOS app
-+ must be dynamic libraries, contained in a framework with appropriate
-+ metadata, stored in the ``Frameworks`` folder of the packaged app. There can
-+ be only a single binary per framework, and there can be no executable binary
-+ material outside the Frameworks folder.
++# PEP 8
++line-length = 79
+
-+ To accomodate this requirement, when running on iOS, extension module
-+ binaries are *not* packaged as ``.so`` files on ``sys.path``, but as
-+ individual standalone frameworks. To discover those frameworks, this loader
-+ is be registered against the ``.fwork`` file extension, with a ``.fwork``
-+ file acting as a placeholder in the original location of the binary on
-+ ``sys.path``. The ``.fwork`` file contains the path of the actual binary in
-+ the ``Frameworks`` folder, relative to the app bundle. To allow for
-+ resolving a framework-packaged binary back to the original location, the
-+ framework is expected to contain a ``.origin`` file that contains the
-+ location of the ``.fwork`` file, relative to the app bundle.
++# Enable automatic fixes by default.
++# To override this, use ``fix = false`` in a subdirectory's config file
++# or ``--no-fix`` on the command line.
++fix = true
+--- /dev/null
++++ b/Apple/.ruff.toml
+@@ -0,0 +1,22 @@
++extend = "../.ruff.toml" # Inherit the project-wide settings
++
++[format]
++preview = true
++docstring-code-format = true
++
++[lint]
++select = [
++ "C4", # flake8-comprehensions
++ "E", # pycodestyle
++ "F", # pyflakes
++ "I", # isort
++ # "ISC", # flake8-implicit-str-concat
++ "LOG", # flake8-logging
++ "PGH", # pygrep-hooks
++ "PT", # flake8-pytest-style
++ "PYI", # flake8-pyi
++ "RUF100", # Ban unused `# noqa` comments
++ # "UP", # pyupgrade
++ "W", # pycodestyle
++ "YTT", # flake8-2020
++]
+--- /dev/null
++++ b/Apple/__main__.py
+@@ -0,0 +1,1108 @@
++#!/usr/bin/env python3
++##########################################################################
++# Apple XCframework build script
++#
++# This script simplifies the process of configuring, compiling and packaging an
++# XCframework for an Apple platform.
++#
++# At present, it supports iOS, tvOS, visionOS and watchOS, but it has been
++# constructed so that it could be used on any Apple platform.
++#
++# The simplest entry point is:
++#
++# $ python Apple ci iOS
++#
++# (replace iOS with tvOS, visionOS or watchOS as required.)
++#
++# which will:
++# * Clean any pre-existing build artefacts
++# * Configure and make a Python that can be used for the build
++# * Configure and make a Python for each supported iOS/tvOS/watchOS/visionOS
++# architecture and ABI
++# * Combine the outputs of the builds from the previous step into a single
++# XCframework, merging binaries into a "fat" binary if necessary
++# * Clone a copy of the testbed, configured to use the XCframework
++# * Construct a tarball containing the release artefacts
++# * Run the test suite using the generated XCframework.
++#
++# This is the complete sequence that would be needed in CI to build and test
++# a candidate release artefact.
++#
++# Each individual step can be invoked individually - there are commands to
++# clean, configure-build, make-build, configure-host, make-host, package, and
++# test.
++#
++# There is also a build command that can be used to combine the configure and
++# make steps for the build Python, an individual host, all hosts, or all
++# builds.
++##########################################################################
++from __future__ import annotations
+
-+ For example, consider the case of an import ``from foo.bar import _whiz``,
-+ where ``_whiz`` is implemented with the binary module
-+ ``sources/foo/bar/_whiz.abi3.so``, with ``sources`` being the location
-+ registered on ``sys.path``, relative to the application bundle. This module
-+ *must* be distributed as
-+ ``Frameworks/foo.bar._whiz.framework/foo.bar._whiz`` (creating the framework
-+ name from the full import path of the module), with an ``Info.plist`` file
-+ in the ``.framework`` directory identifying the binary as a framework. The
-+ ``foo.bar._whiz`` module would be represented in the original location with
-+ a ``sources/foo/bar/_whiz.abi3.fwork`` marker file, containing the path
-+ ``Frameworks/foo.bar._whiz/foo.bar._whiz``. The framework would also contain
-+ ``Frameworks/foo.bar._whiz.framework/foo.bar._whiz.origin``, containing the
-+ path to the ``.fwork`` file.
++import argparse
++import os
++import platform
++import re
++import shlex
++import shutil
++import signal
++import subprocess
++import sys
++import sysconfig
++import time
++from collections.abc import Callable, Sequence
++from contextlib import contextmanager
++from datetime import datetime, timezone
++from os.path import basename, relpath
++from pathlib import Path
++from subprocess import CalledProcessError
+
-+ When a module is loaded with this loader, the ``__file__`` for the module
-+ will report as the location of the ``.fwork`` file. This allows code to use
-+ the ``__file__`` of a module as an anchor for file system traveral.
-+ However, the spec origin will reference the location of the *actual* binary
-+ in the ``.framework`` folder.
++EnvironmentT = dict[str, str]
++ArgsT = Sequence[str | Path]
+
-+ The Xcode project building the app is responsible for converting any ``.so``
-+ files from wherever they exist in the ``PYTHONPATH`` into frameworks in the
-+ ``Frameworks`` folder (including stripping extensions from the module file,
-+ the addition of framework metadata, and signing the resulting framework),
-+ and creating the ``.fwork`` and ``.origin`` files. This will usually be done
-+ with a build step in the Xcode project; see the iOS documentation for
-+ details on how to construct this build step.
++SCRIPT_NAME = Path(__file__).name
++PYTHON_DIR = Path(__file__).resolve().parent.parent
+
-+ .. versionadded:: 3.13
++CROSS_BUILD_DIR = PYTHON_DIR / "cross-build"
+
-+ .. availability:: iOS.
++HOSTS: dict[str, dict[str, dict[str, str]]] = {
++ # Structure of this data:
++ # * Platform identifier
++ # * an XCframework slice that must exist for that platform
++ # * a host triple: the multiarch spec for that host
++ "iOS": {
++ "ios-arm64": {
++ "arm64-apple-ios": "arm64-iphoneos",
++ },
++ "ios-arm64_x86_64-simulator": {
++ "arm64-apple-ios-simulator": "arm64-iphonesimulator",
++ "x86_64-apple-ios-simulator": "x86_64-iphonesimulator",
++ },
++ },
++ "tvOS": {
++ "tvos-arm64": {
++ "arm64-apple-tvos": "arm64-appletvos",
++ },
++ "tvos-arm64_x86_64-simulator": {
++ "arm64-apple-tvos-simulator": "arm64-appletvsimulator",
++ "x86_64-apple-tvos-simulator": "x86_64-appletvsimulator",
++ },
++ },
++ "visionOS": {
++ "xros-arm64": {
++ "arm64-apple-xros": "arm64-xros",
++ },
++ "xros-arm64-simulator": {
++ "arm64-apple-xros-simulator": "arm64-xrsimulator",
++ },
++ },
++ "watchOS": {
++ "watchos-arm64_32": {
++ "arm64_32-apple-watchos": "arm64_32-watchos",
++ },
++ "watchos-arm64_x86_64-simulator": {
++ "arm64-apple-watchos-simulator": "arm64-watchsimulator",
++ "x86_64-apple-watchos-simulator": "x86_64-watchsimulator",
++ },
++ },
++}
+
-+ .. attribute:: name
+
-+ Name of the module the loader supports.
++def subdir(name: str, create: bool = False) -> Path:
++ """Ensure that a cross-build directory for the given name exists."""
++ path = CROSS_BUILD_DIR / name
++ if not path.exists():
++ if not create:
++ sys.exit(
++ f"{path} does not exist. Create it by running the appropriate "
++ f"`configure` subcommand of {SCRIPT_NAME}."
++ )
++ else:
++ path.mkdir(parents=True)
++ return path
+
-+ .. attribute:: path
+
-+ Path to the ``.fwork`` file for the extension module.
++def run(
++ command: ArgsT,
++ *,
++ host: str | None = None,
++ env: EnvironmentT | None = None,
++ log: bool | None = True,
++ **kwargs,
++) -> subprocess.CompletedProcess:
++ """Run a command in an Apple development environment.
+
++ Optionally logs the executed command to the console.
++ """
++ kwargs.setdefault("check", True)
++ if env is None:
++ env = os.environ.copy()
+
- :mod:`importlib.util` -- Utility code for importers
- ---------------------------------------------------
-
-diff --git a/Doc/library/os.rst b/Doc/library/os.rst
-index 8405fb1917e..79db1891a1a 100644
---- a/Doc/library/os.rst
-+++ b/Doc/library/os.rst
-@@ -710,6 +710,11 @@
- :func:`socket.gethostname` or even
- ``socket.gethostbyaddr(socket.gethostname())``.
-
-+ On macOS, iOS and Android, this returns the *kernel* name and version (i.e.,
-+ ``'Darwin'`` on macOS and iOS; ``'Linux'`` on Android). :func:`platform.uname()`
-+ can be used to get the user-facing operating system name and version on iOS and
-+ Android.
++ if host:
++ host_env = apple_env(host)
++ print_env(host_env)
++ env.update(host_env)
+
- .. availability:: recent flavors of Unix.
-
- .. versionchanged:: 3.3
-diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst
-index dc2d871b47d..57dc421bb6c 100644
---- a/Doc/library/platform.rst
-+++ b/Doc/library/platform.rst
-@@ -148,6 +148,9 @@
- Returns the system/OS name, such as ``'Linux'``, ``'Darwin'``, ``'Java'``,
- ``'Windows'``. An empty string is returned if the value cannot be determined.
-
-+ On iOS and Android, this returns the user-facing OS name (i.e, ``'iOS``,
-+ ``'iPadOS'`` or ``'Android'``). To obtain the kernel name (``'Darwin'`` or
-+ ``'Linux'``), use :func:`os.uname()`.
-
- .. function:: system_alias(system, release, version)
-
-@@ -161,6 +164,8 @@
- Returns the system's release version, e.g. ``'#3 on degas'``. An empty string is
- returned if the value cannot be determined.
-
-+ On iOS and Android, this is the user-facing OS version. To obtain the
-+ Darwin or Linux kernel version, use :func:`os.uname()`.
-
- .. function:: uname()
-
-@@ -230,7 +235,6 @@
- macOS Platform
- --------------
-
--
- .. function:: mac_ver(release='', versioninfo=('','',''), machine='')
-
- Get macOS version information and return it as tuple ``(release, versioninfo,
-@@ -240,6 +244,24 @@
- Entries which cannot be determined are set to ``''``. All tuple entries are
- strings.
-
-+iOS Platform
-+------------
++ if log:
++ print(">", join_command(command))
++ return subprocess.run(command, env=env, **kwargs)
+
-+.. function:: ios_ver(system='', release='', model='', is_simulator=False)
+
-+ Get iOS version information and return it as a
-+ :func:`~collections.namedtuple` with the following attributes:
++def join_command(args: str | Path | ArgsT) -> str:
++ """Format a command so it can be copied into a shell.
+
-+ * ``system`` is the OS name; either ``'iOS'`` or ``'iPadOS'``.
-+ * ``release`` is the iOS version number as a string (e.g., ``'17.2'``).
-+ * ``model`` is the device model identifier; this will be a string like
-+ ``'iPhone13,2'`` for a physical device, or ``'iPhone'`` on a simulator.
-+ * ``is_simulator`` is a boolean describing if the app is running on a
-+ simulator or a physical device.
++ Similar to `shlex.join`, but also accepts arguments which are Paths, or a
++ single string/Path outside of a list.
++ """
++ if isinstance(args, (str, Path)):
++ return str(args)
++ else:
++ return shlex.join(map(str, args))
++
++
++def print_env(env: EnvironmentT) -> None:
++ """Format the environment so it can be pasted into a shell."""
++ for key, value in sorted(env.items()):
++ print(f"export {key}={shlex.quote(value)}")
++
++
++def platform_for_host(host):
++ """Determine the platform for a given host triple."""
++ for plat, slices in HOSTS.items():
++ for _, candidates in slices.items():
++ for candidate in candidates:
++ if candidate == host:
++ return plat
++ raise KeyError(host)
++
++
++def apple_env(host: str) -> EnvironmentT:
++ """Construct an Apple development environment for the given host."""
++ env = {
++ "PATH": ":".join([
++ str(PYTHON_DIR / f"Apple/{platform_for_host(host)}/Resources/bin"),
++ str(subdir(host) / "prefix"),
++ "/usr/bin",
++ "/bin",
++ "/usr/sbin",
++ "/sbin",
++ "/Library/Apple/usr/bin",
++ ]),
++ }
+
-+ Entries which cannot be determined are set to the defaults given as
-+ parameters.
++ return env
+
-
- Unix Platforms
- --------------
-diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst
-index 1e85602951c..8f5af980dee 100644
---- a/Doc/library/urllib.parse.rst
-+++ b/Doc/library/urllib.parse.rst
-@@ -27,6 +27,14 @@
- ``shttp``, ``sip``, ``sips``, ``snews``, ``svn``, ``svn+ssh``, ``telnet``,
- ``wais``, ``ws``, ``wss``.
-
-+.. impl-detail::
+
-+ The inclusion of the ``itms-services`` URL scheme can prevent an app from
-+ passing Apple's App Store review process for the macOS and iOS App Stores.
-+ Handling for the ``itms-services`` scheme is always removed on iOS; on
-+ macOS, it *may* be removed if CPython has been built with the
-+ :option:`--with-app-store-compliance` option.
++def delete_path(name: str) -> None:
++ """Delete the named cross-build directory, if it exists."""
++ path = CROSS_BUILD_DIR / name
++ if path.exists():
++ print(f"Deleting {path} ...")
++ shutil.rmtree(path)
+
- The :mod:`urllib.parse` module defines functions that fall into two broad
- categories: URL parsing and URL quoting. These are covered in detail in
- the following sections.
-diff --git a/Doc/library/webbrowser.rst b/Doc/library/webbrowser.rst
-index c0990882e58..e5cc007d2b8 100644
---- a/Doc/library/webbrowser.rst
-+++ b/Doc/library/webbrowser.rst
-@@ -33,6 +33,13 @@
- browsers are not available on Unix, the controlling process will launch a new
- browser and wait.
-
-+On iOS, the :envvar:`BROWSER` environment variable, as well as any arguments
-+controlling autoraise, browser preference, and new tab/window creation will be
-+ignored. Web pages will *always* be opened in the user's preferred browser, in
-+a new tab, with the browser being brought to the foreground. The use of the
-+:mod:`webbrowser` module on iOS requires the :mod:`ctypes` module. If
-+:mod:`ctypes` isn't available, calls to :func:`.open` will fail.
+
- The script :program:`webbrowser` can be used as a command-line interface for the
- module. It accepts a URL as the argument. It accepts the following optional
- parameters: ``-n`` opens the URL in a new browser window, if possible;
-@@ -155,6 +162,8 @@
- +------------------------+-----------------------------------------+-------+
- | ``'chromium-browser'`` | :class:`Chromium('chromium-browser')` | |
- +------------------------+-----------------------------------------+-------+
-+| ``'iosbrowser'`` | ``IOSBrowser`` | \(4) |
-++------------------------+-----------------------------------------+-------+
-
- Notes:
-
-@@ -169,11 +178,18 @@
- Only on Windows platforms.
-
- (3)
-- Only on macOS platform.
-+ Only on macOS.
++def all_host_triples(platform: str) -> list[str]:
++ """Return all host triples for the given platform.
+
-+(4)
-+ Only on iOS.
++ The host triples are the platform definitions used as input to configure
++ (e.g., "arm64-apple-ios-simulator").
++ """
++ triples = []
++ for slice_name, slice_parts in HOSTS[platform].items():
++ triples.extend(list(slice_parts))
++ return triples
++
++
++def clean(context: argparse.Namespace, target: str = "all") -> None:
++ """The implementation of the "clean" command."""
++ # If we're explicitly targeting the build, there's no platform or
++ # distribution artefacts. If we're cleaning tests, we keep all built
++ # artefacts. Otherwise, the built artefacts must be dirty, so we remove
++ # them.
++ if target not in {"build", "test"}:
++ paths = ["dist", context.platform] + list(HOSTS[context.platform])
++ else:
++ paths = []
++
++ if target in {"all", "build"}:
++ paths.append("build")
++
++ if target in {"all", "hosts"}:
++ paths.extend(all_host_triples(context.platform))
++ elif target not in {"build", "test", "package"}:
++ paths.append(target)
++
++ if target in {"all", "hosts", "test"}:
++ paths.extend([
++ path.name
++ for path in CROSS_BUILD_DIR.glob(f"{context.platform}-testbed.*")
++ ])
++
++ for path in paths:
++ delete_path(path)
++
++
++def build_python_path() -> Path:
++ """The path to the build Python binary."""
++ build_dir = subdir("build")
++ binary = build_dir / "python"
++ if not binary.is_file():
++ binary = binary.with_suffix(".exe")
++ if not binary.is_file():
++ raise FileNotFoundError(
++ f"Unable to find `python(.exe)` in {build_dir}"
++ )
+
-
- .. versionadded:: 3.3
- Support for Chrome/Chromium has been added.
-
-+.. versionchanged:: 3.13
-+ Support for iOS has been added.
++ return binary
+
- Here are some simple examples::
-
- url = 'https://docs.python.org/'
-diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst
-index ab33e0a06f5..6fe63e9ce2d 100644
---- a/Doc/using/configure.rst
-+++ b/Doc/using/configure.rst
-@@ -506,6 +506,75 @@
- Specify the name for the python framework on macOS only valid when
- :option:`--enable-framework` is set (default: ``Python``).
-
-+.. option:: --with-app-store-compliance
-+.. option:: --with-app-store-compliance=PATCH-FILE
+
-+ The Python standard library contains strings that are known to trigger
-+ automated inspection tool errors when submitted for distribution by
-+ the macOS and iOS App Stores. If enabled, this option will apply the list of
-+ patches that are known to correct app store compliance. A custom patch
-+ file can also be specified. This option is disabled by default.
++@contextmanager
++def group(text: str):
++ """A context manager that outputs a log marker around a section of a build.
+
-+ .. versionadded:: 3.13
++ If running in a GitHub Actions environment, the GitHub syntax for
++ collapsible log sections is used.
++ """
++ if "GITHUB_ACTIONS" in os.environ:
++ print(f"::group::{text}")
++ else:
++ print(f"===== {text} " + "=" * (70 - len(text)))
+
-+iOS Options
-+-----------
++ yield
+
-+See :source:`iOS/README.rst`.
++ if "GITHUB_ACTIONS" in os.environ:
++ print("::endgroup::")
++ else:
++ print()
+
-+.. option:: --enable-framework=INSTALLDIR
+
-+ Create a Python.framework. Unlike macOS, the *INSTALLDIR* argument
-+ specifying the installation path is mandatory.
++@contextmanager
++def cwd(subdir: Path):
++ """A context manager that sets the current working directory."""
++ orig = os.getcwd()
++ os.chdir(subdir)
++ yield
++ os.chdir(orig)
+
-+.. option:: --with-framework-name=FRAMEWORK
+
-+ Specify the name for the framework (default: ``Python``).
++def configure_build_python(context: argparse.Namespace) -> None:
++ """The implementation of the "configure-build" command."""
++ if context.clean:
++ clean(context, "build")
+
++ with (
++ group("Configuring build Python"),
++ cwd(subdir("build", create=True)),
++ ):
++ command = [relpath(PYTHON_DIR / "configure")]
++ if context.args:
++ command.extend(context.args)
++ run(command)
+
-+Cross Compiling Options
-+-----------------------
+
-+Cross compiling, also known as cross building, can be used to build Python
-+for another CPU architecture or platform. Cross compiling requires a Python
-+interpreter for the build platform. The version of the build Python must match
-+the version of the cross compiled host Python.
++def make_build_python(context: argparse.Namespace) -> None:
++ """The implementation of the "make-build" command."""
++ with (
++ group("Compiling build Python"),
++ cwd(subdir("build")),
++ ):
++ run(["make", "-j", str(os.cpu_count())])
+
-+.. option:: --build=BUILD
+
-+ configure for building on BUILD, usually guessed by :program:`config.guess`.
++def apple_target(host: str) -> str:
++ """Return the Apple platform identifier for a given host triple."""
++ for _, platform_slices in HOSTS.items():
++ for slice_name, slice_parts in platform_slices.items():
++ for host_triple, multiarch in slice_parts.items():
++ if host == host_triple:
++ return ".".join(multiarch.split("-")[::-1])
+
-+.. option:: --host=HOST
++ raise KeyError(host)
+
-+ cross-compile to build programs to run on HOST (target platform)
+
-+.. option:: --with-build-python=path/to/python
++def apple_multiarch(host: str) -> str:
++ """Return the multiarch descriptor for a given host triple."""
++ for _, platform_slices in HOSTS.items():
++ for slice_name, slice_parts in platform_slices.items():
++ for host_triple, multiarch in slice_parts.items():
++ if host == host_triple:
++ return multiarch
+
-+ path to build ``python`` binary for cross compiling
++ raise KeyError(host)
+
-+ .. versionadded:: 3.11
+
-+.. option:: CONFIG_SITE=file
++def unpack_deps(
++ platform: str,
++ host: str,
++ prefix_dir: Path,
++ cache_dir: Path,
++) -> None:
++ """Unpack binary dependencies into a provided directory.
+
-+ An environment variable that points to a file with configure overrides.
++ Downloads binaries if they aren't already present. Downloads will be stored
++ in provided cache directory.
+
-+ Example *config.site* file:
++ On non-macOS platforms, as a safety mechanism, any dynamic libraries will
++ be purged from the unpacked dependencies.
++ """
++ # To create new builds of these dependencies, usually all that's necessary
++ # is to push a tag to the cpython-apple-source-deps repository, and GitHub
++ # Actions will do the rest.
++ #
++ # If you're a member of the Python core team, and you'd like to be able to
++ # push these tags yourself, please contact Malcolm Smith or Russell
++ # Keith-Magee.
++ deps_url = "https://github.com/beeware/cpython-apple-source-deps/releases/download"
++ for name_ver in [
++ "BZip2-1.0.8-2",
++ "libFFI-3.4.7-2",
++ "OpenSSL-3.0.18-1",
++ "XZ-5.6.4-2",
++ "mpdecimal-4.0.0-2",
++ "zstd-1.5.7-1",
++ ]:
++ filename = f"{name_ver.lower()}-{apple_target(host)}.tar.gz"
++ archive_path = download(
++ f"{deps_url}/{name_ver}/{filename}",
++ target_dir=cache_dir,
++ )
++ shutil.unpack_archive(archive_path, prefix_dir)
+
-+ .. code-block:: ini
++ # Dynamic libraries will be preferentially linked over static;
++ # On iOS, ensure that no dylibs are available in the prefix folder.
++ if platform == "iOS":
++ for dylib in prefix_dir.glob("**/*.dylib"):
++ dylib.unlink()
+
-+ # config.site-aarch64
-+ ac_cv_buggy_getaddrinfo=no
-+ ac_cv_file__dev_ptmx=yes
-+ ac_cv_file__dev_ptc=no
+
++def download(url: str, target_dir: Path) -> Path:
++ """Download the specified URL into the given directory.
+
-+Cross compiling example::
++ :return: The path to the downloaded archive.
++ """
++ target_path = Path(target_dir).resolve()
++ target_path.mkdir(exist_ok=True, parents=True)
++
++ out_path = target_path / basename(url)
++ if not Path(out_path).is_file():
++ run([
++ "curl",
++ "-Lf",
++ "--retry",
++ "5",
++ "--retry-all-errors",
++ "-o",
++ out_path,
++ url,
++ ])
++ else:
++ print(f"Using cached version of {basename(url)}")
++ return out_path
+
-+ CONFIG_SITE=config.site-aarch64 ../configure \
-+ --build=x86_64-pc-linux-gnu \
-+ --host=aarch64-unknown-linux-gnu \
-+ --with-build-python=../x86_64/python
+
-
- Python Build System
- ===================
-diff --git a/Doc/using/mac.rst b/Doc/using/mac.rst
-index 9ae0270eaee..2bb14d88dc9 100644
---- a/Doc/using/mac.rst
-+++ b/Doc/using/mac.rst
-@@ -164,6 +164,28 @@
- at https://pypi.org/project/py2app/.
-
-
-+App Store Compliance
-+--------------------
++def configure_host_python(
++ context: argparse.Namespace,
++ host: str | None = None,
++) -> None:
++ """The implementation of the "configure-host" command."""
++ if host is None:
++ host = context.host
+
-+Apps submitted for distribution through the macOS App Store must pass Apple's
-+app review process. This process includes a set of automated validation rules
-+that inspect the submitted application bundle for problematic code.
++ if context.clean:
++ clean(context, host)
+
-+The Python standard library contains some code that is known to violate these
-+automated rules. While these violations appear to be false positives, Apple's
-+review rules cannot be challenged. Therefore, it is necessary to modify the
-+Python standard library for an app to pass App Store review.
++ host_dir = subdir(host, create=True)
++ prefix_dir = host_dir / "prefix"
+
-+The Python source tree contains
-+:source:`a patch file ` that will remove
-+all code that is known to cause issues with the App Store review process. This
-+patch is applied automatically when CPython is configured with the
-+:option:`--with-app-store-compliance` option.
++ with group(f"Downloading dependencies ({host})"):
++ if not prefix_dir.exists():
++ prefix_dir.mkdir()
++ unpack_deps(context.platform, host, prefix_dir, context.cache_dir)
++ else:
++ print("Dependencies already installed")
+
-+This patch is not normally required to use CPython on a Mac; nor is it required
-+if you are distributing an app *outside* the macOS App Store. It is *only*
-+required if you are using the macOS App Store as a distribution channel.
++ with (
++ group(f"Configuring host Python ({host})"),
++ cwd(host_dir),
++ ):
++ command = [
++ # Basic cross-compiling configuration
++ relpath(PYTHON_DIR / "configure"),
++ f"--host={host}",
++ f"--build={sysconfig.get_config_var('BUILD_GNU_TYPE')}",
++ "--enable-framework",
++ "PYTHON_FOR_REGEN=../build/python.exe",
++ # Dependent libraries.
++ f"--with-openssl={prefix_dir}",
++ f"CFLAGS=-I{prefix_dir}/include",
++ f"LDFLAGS=-L{prefix_dir}/lib",
++ f"LIBFFI_INCLUDEDIR={prefix_dir}/include",
++ f"LIBFFI_LIBDIR={prefix_dir}/lib",
++ "LIBFFI_LIB=ffi",
++ ]
+
- Other Resources
- ===============
-
---- /dev/null
-+++ b/Lib/_apple_support.py
-@@ -0,0 +1,66 @@
-+import io
-+import sys
++ if context.args:
++ command.extend(context.args)
++ run(command, host=host)
+
+
-+def init_streams(log_write, stdout_level, stderr_level):
-+ # Redirect stdout and stderr to the Apple system log. This method is
-+ # invoked by init_apple_streams() (initconfig.c) if config->use_system_logger
-+ # is enabled.
-+ sys.stdout = SystemLog(log_write, stdout_level, errors=sys.stderr.errors)
-+ sys.stderr = SystemLog(log_write, stderr_level, errors=sys.stderr.errors)
++def make_host_python(
++ context: argparse.Namespace,
++ host: str | None = None,
++) -> None:
++ """The implementation of the "make-host" command."""
++ if host is None:
++ host = context.host
+
++ with (
++ group(f"Compiling host Python ({host})"),
++ cwd(subdir(host)),
++ ):
++ run(["make"], host=host)
++ run(["make", "install"], host=host, env={"DESTDIR": f"{Path.cwd()}/"})
+
-+class SystemLog(io.TextIOWrapper):
-+ def __init__(self, log_write, level, **kwargs):
-+ kwargs.setdefault("encoding", "UTF-8")
-+ kwargs.setdefault("line_buffering", True)
-+ super().__init__(LogStream(log_write, level), **kwargs)
+
-+ def __repr__(self):
-+ return f""
++def framework_path(host_triple: str, multiarch: str) -> Path:
++ """The path to a built single-architecture framework product.
+
-+ def write(self, s):
-+ if not isinstance(s, str):
-+ raise TypeError(
-+ f"write() argument must be str, not {type(s).__name__}")
++ :param host_triple: The host triple (e.g., arm64-apple-ios-simulator)
++ :param multiarch: The multiarch identifier (e.g., arm64-simulator)
++ """
++ return (
++ CROSS_BUILD_DIR
++ / f"{host_triple}/Apple/{platform_for_host(host_triple)}"
++ / f"Frameworks/{multiarch}"
++ )
+
-+ # In case `s` is a str subclass that writes itself to stdout or stderr
-+ # when we call its methods, convert it to an actual str.
-+ s = str.__str__(s)
+
-+ # We want to emit one log message per line, so split
-+ # the string before sending it to the superclass.
-+ for line in s.splitlines(keepends=True):
-+ super().write(line)
++def package_version(prefix_path: Path) -> str:
++ """Extract the Python version being built from patchlevel.h."""
++ for path in prefix_path.glob("**/patchlevel.h"):
++ text = path.read_text(encoding="utf-8")
++ if match := re.search(
++ r'\n\s*#define\s+PY_VERSION\s+"(.+)"\s*\n', text
++ ):
++ version = match[1]
++ # If not building against a tagged commit, add a timestamp to the
++ # version. Follow the PyPA version number rules, as this will make
++ # it easier to process with other tools. The version will have a
++ # `+` suffix once any official release has been made; a freshly
++ # forked main branch will have a version of 3.X.0a0.
++ if version.endswith("a0"):
++ version += "+"
++ if version.endswith("+"):
++ version += datetime.now(timezone.utc).strftime("%Y%m%d.%H%M%S")
++
++ return version
++
++ sys.exit("Unable to determine Python version being packaged.")
++
++
++def lib_platform_files(dirname, names):
++ """A file filter that ignores platform-specific files in lib."""
++ path = Path(dirname)
++ if (
++ path.parts[-3] == "lib"
++ and path.parts[-2].startswith("python")
++ and path.parts[-1] == "lib-dynload"
++ ):
++ return names
++ elif path.parts[-2] == "lib" and path.parts[-1].startswith("python"):
++ ignored_names = {
++ name
++ for name in names
++ if (
++ name.startswith("_sysconfigdata_")
++ or name.startswith("_sysconfig_vars_")
++ or name == "build-details.json"
++ )
++ }
++ elif path.parts[-1] == "lib":
++ ignored_names = {
++ name
++ for name in names
++ if name.startswith("libpython") and name.endswith(".dylib")
++ }
++ else:
++ ignored_names = set()
+
-+ return len(s)
++ return ignored_names
+
+
-+class LogStream(io.RawIOBase):
-+ def __init__(self, log_write, level):
-+ self.log_write = log_write
-+ self.level = level
++def lib_non_platform_files(dirname, names):
++ """A file filter that ignores anything *except* platform-specific files
++ in the lib directory.
++ """
++ path = Path(dirname)
++ if path.parts[-2] == "lib" and path.parts[-1].startswith("python"):
++ return (
++ set(names) - lib_platform_files(dirname, names) - {"lib-dynload"}
++ )
++ else:
++ return set()
+
-+ def __repr__(self):
-+ return f""
+
-+ def writable(self):
-+ return True
++def create_xcframework(platform: str) -> str:
++ """Build an XCframework from the component parts for the platform.
+
-+ def write(self, b):
-+ if type(b) is not bytes:
-+ try:
-+ b = bytes(memoryview(b))
-+ except TypeError:
-+ raise TypeError(
-+ f"write() argument must be bytes-like, not {type(b).__name__}"
-+ ) from None
++ :return: The version number of the Python version that was packaged.
++ """
++ package_path = CROSS_BUILD_DIR / platform
++ try:
++ package_path.mkdir()
++ except FileExistsError:
++ raise RuntimeError(
++ f"{platform} XCframework already exists; do you need to run "
++ "with --clean?"
++ ) from None
++
++ frameworks = []
++ # Merge Frameworks for each component SDK. If there's only one architecture
++ # for the SDK, we can use the compiled Python.framework as-is. However, if
++ # there's more than architecture, we need to merge the individual built
++ # frameworks into a merged "fat" framework.
++ for slice_name, slice_parts in HOSTS[platform].items():
++ # Some parts are the same across all slices, so we use can any of the
++ # host frameworks as the source for the merged version. Use the first
++ # one on the list, as it's as representative as any other.
++ first_host_triple, first_multiarch = next(iter(slice_parts.items()))
++ first_framework = (
++ framework_path(first_host_triple, first_multiarch)
++ / "Python.framework"
++ )
+
-+ # Writing an empty string to the stream should have no effect.
-+ if b:
-+ # Encode null bytes using "modified UTF-8" to avoid truncating the
-+ # message. This should not affect the return value, as the caller
-+ # may be expecting it to match the length of the input.
-+ self.log_write(self.level, b.replace(b"\x00", b"\xc0\x80"))
++ if len(slice_parts) == 1:
++ # The first framework is the only framework, so copy it.
++ print(f"Copying framework for {slice_name}...")
++ frameworks.append(first_framework)
++ else:
++ print(f"Merging framework for {slice_name}...")
++ slice_path = CROSS_BUILD_DIR / slice_name
++ slice_framework = slice_path / "Python.framework"
++ slice_framework.mkdir(exist_ok=True, parents=True)
++
++ # Copy the Info.plist
++ shutil.copy(
++ first_framework / "Info.plist",
++ slice_framework / "Info.plist",
++ )
+
-+ return len(b)
---- /dev/null
-+++ b/Lib/_ios_support.py
-@@ -0,0 +1,71 @@
-+import sys
-+try:
-+ from ctypes import cdll, c_void_p, c_char_p, util
-+except ImportError:
-+ # ctypes is an optional module. If it's not present, we're limited in what
-+ # we can tell about the system, but we don't want to prevent the module
-+ # from working.
-+ print("ctypes isn't available; iOS system calls will not be available")
-+ objc = None
-+else:
-+ # ctypes is available. Load the ObjC library, and wrap the objc_getClass,
-+ # sel_registerName methods
-+ lib = util.find_library("objc")
-+ if lib is None:
-+ # Failed to load the objc library
-+ raise RuntimeError("ObjC runtime library couldn't be loaded")
++ # Copy the headers
++ shutil.copytree(
++ first_framework / "Headers",
++ slice_framework / "Headers",
++ )
+
-+ objc = cdll.LoadLibrary(lib)
-+ objc.objc_getClass.restype = c_void_p
-+ objc.objc_getClass.argtypes = [c_char_p]
-+ objc.sel_registerName.restype = c_void_p
-+ objc.sel_registerName.argtypes = [c_char_p]
++ # Create the "fat" library binary for the slice
++ run(
++ ["lipo", "-create", "-output", slice_framework / "Python"]
++ + [
++ (
++ framework_path(host_triple, multiarch)
++ / "Python.framework/Python"
++ )
++ for host_triple, multiarch in slice_parts.items()
++ ]
++ )
+
++ # Add this merged slice to the list to be added to the XCframework
++ frameworks.append(slice_framework)
+
-+def get_platform_ios():
-+ # Determine if this is a simulator using the multiarch value
-+ is_simulator = sys.implementation._multiarch.endswith("simulator")
++ print()
++ print("Build XCframework...")
++ cmd = [
++ "xcodebuild",
++ "-create-xcframework",
++ "-output",
++ package_path / "Python.xcframework",
++ ]
++ for framework in frameworks:
++ cmd.extend(["-framework", framework])
++
++ run(cmd)
++
++ # Extract the package version from the merged framework
++ version = package_version(package_path / "Python.xcframework")
++ version_tag = ".".join(version.split(".")[:2])
++
++ # On non-macOS platforms, each framework in XCframework only contains the
++ # headers, libPython, plus an Info.plist. Other resources like the standard
++ # library and binary shims aren't allowed to live in framework; they need
++ # to be copied in separately.
++ print()
++ print("Copy additional resources...")
++ has_common_stdlib = False
++ for slice_name, slice_parts in HOSTS[platform].items():
++ # Some parts are the same across all slices, so we can any of the
++ # host frameworks as the source for the merged version.
++ first_host_triple, first_multiarch = next(iter(slice_parts.items()))
++ first_path = framework_path(first_host_triple, first_multiarch)
++ first_framework = first_path / "Python.framework"
++
++ slice_path = package_path / f"Python.xcframework/{slice_name}"
++ slice_framework = slice_path / "Python.framework"
++
++ # Copy the binary helpers
++ print(f" - {slice_name} binaries")
++ shutil.copytree(first_path / "bin", slice_path / "bin")
++
++ # Copy the include path (a symlink to the framework headers)
++ print(f" - {slice_name} include files")
++ shutil.copytree(
++ first_path / "include",
++ slice_path / "include",
++ symlinks=True,
++ )
+
-+ # We can't use ctypes; abort
-+ if not objc:
-+ return None
++ # Copy in the cross-architecture pyconfig.h
++ shutil.copy(
++ PYTHON_DIR / f"Apple/{platform}/Resources/pyconfig.h",
++ slice_framework / "Headers/pyconfig.h",
++ )
+
-+ # Most of the methods return ObjC objects
-+ objc.objc_msgSend.restype = c_void_p
-+ # All the methods used have no arguments.
-+ objc.objc_msgSend.argtypes = [c_void_p, c_void_p]
++ print(f" - {slice_name} shared library")
++ # Create a simlink for the fat library
++ shared_lib = slice_path / f"lib/libpython{version_tag}.dylib"
++ shared_lib.parent.mkdir()
++ shared_lib.symlink_to("../Python.framework/Python")
++
++ print(f" - {slice_name} architecture-specific files")
++ for host_triple, multiarch in slice_parts.items():
++ print(f" - {multiarch} standard library")
++ arch, _ = multiarch.split("-", 1)
++
++ if not has_common_stdlib:
++ print(" - using this architecture as the common stdlib")
++ shutil.copytree(
++ framework_path(host_triple, multiarch) / "lib",
++ package_path / "Python.xcframework/lib",
++ ignore=lib_platform_files,
++ symlinks=True,
++ )
++ has_common_stdlib = True
+
-+ # Equivalent of:
-+ # device = [UIDevice currentDevice]
-+ UIDevice = objc.objc_getClass(b"UIDevice")
-+ SEL_currentDevice = objc.sel_registerName(b"currentDevice")
-+ device = objc.objc_msgSend(UIDevice, SEL_currentDevice)
++ shutil.copytree(
++ framework_path(host_triple, multiarch) / "lib",
++ slice_path / f"lib-{arch}",
++ ignore=lib_non_platform_files,
++ symlinks=True,
++ )
+
-+ # Equivalent of:
-+ # device_systemVersion = [device systemVersion]
-+ SEL_systemVersion = objc.sel_registerName(b"systemVersion")
-+ device_systemVersion = objc.objc_msgSend(device, SEL_systemVersion)
++ # Copy the host's pyconfig.h to an architecture-specific name.
++ arch = multiarch.split("-")[0]
++ host_path = (
++ CROSS_BUILD_DIR
++ / host_triple
++ / f"Apple/{platform}/Frameworks"
++ / multiarch
++ )
++ host_framework = host_path / "Python.framework"
++ shutil.copy(
++ host_framework / "Headers/pyconfig.h",
++ slice_framework / f"Headers/pyconfig-{arch}.h",
++ )
+
-+ # Equivalent of:
-+ # device_systemName = [device systemName]
-+ SEL_systemName = objc.sel_registerName(b"systemName")
-+ device_systemName = objc.objc_msgSend(device, SEL_systemName)
++ # Apple identifies certain libraries as "security risks"; if you
++ # statically link those libraries into a Framework, you become
++ # responsible for providing a privacy manifest for that framework.
++ xcprivacy_file = {
++ "OpenSSL": subdir(host_triple)
++ / "prefix/share/OpenSSL.xcprivacy"
++ }
++ print(f" - {multiarch} xcprivacy files")
++ for module, lib in [
++ ("_hashlib", "OpenSSL"),
++ ("_ssl", "OpenSSL"),
++ ]:
++ shutil.copy(
++ xcprivacy_file[lib],
++ slice_path
++ / f"lib-{arch}/python{version_tag}"
++ / f"lib-dynload/{module}.xcprivacy",
++ )
+
-+ # Equivalent of:
-+ # device_model = [device model]
-+ SEL_model = objc.sel_registerName(b"model")
-+ device_model = objc.objc_msgSend(device, SEL_model)
++ print(" - build tools")
++ shutil.copytree(
++ PYTHON_DIR / "Apple/testbed/Python.xcframework/build",
++ package_path / "Python.xcframework/build",
++ )
+
-+ # UTF8String returns a const char*;
-+ SEL_UTF8String = objc.sel_registerName(b"UTF8String")
-+ objc.objc_msgSend.restype = c_char_p
++ return version
+
-+ # Equivalent of:
-+ # system = [device_systemName UTF8String]
-+ # release = [device_systemVersion UTF8String]
-+ # model = [device_model UTF8String]
-+ system = objc.objc_msgSend(device_systemName, SEL_UTF8String).decode()
-+ release = objc.objc_msgSend(device_systemVersion, SEL_UTF8String).decode()
-+ model = objc.objc_msgSend(device_model, SEL_UTF8String).decode()
+
-+ return system, release, model, is_simulator
-diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py
-index 4afa4ebd422..dca2081bea4 100644
---- a/Lib/ctypes/__init__.py
-+++ b/Lib/ctypes/__init__.py
-@@ -341,6 +341,19 @@
- use_errno=False,
- use_last_error=False,
- winmode=None):
-+ if name:
-+ name = _os.fspath(name)
++def package(context: argparse.Namespace) -> None:
++ """The implementation of the "package" command."""
++ if context.clean:
++ clean(context, "package")
+
-+ # If the filename that has been provided is an iOS/tvOS/watchOS
-+ # .fwork file, dereference the location to the true origin of the
-+ # binary.
-+ if name.endswith(".fwork"):
-+ with open(name) as f:
-+ name = _os.path.join(
-+ _os.path.dirname(_sys.executable),
-+ f.read().strip()
-+ )
++ with group("Building package"):
++ # Create an XCframework
++ version = create_xcframework(context.platform)
+
- self._name = name
- flags = self._func_flags_
- if use_errno:
-diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py
-index 0c2510e1619..438f2713563 100644
---- a/Lib/ctypes/util.py
-+++ b/Lib/ctypes/util.py
-@@ -67,7 +67,7 @@
- return fname
- return None
-
--elif os.name == "posix" and sys.platform == "darwin":
-+elif os.name == "posix" and sys.platform in {"darwin", "ios", "tvos", "watchos"}:
- from ctypes.macholib.dyld import dyld_find as _dyld_find
- def find_library(name):
- possible = ['lib%s.dylib' % name,
-diff --git a/Lib/distutils/tests/test_cygwinccompiler.py b/Lib/distutils/tests/test_cygwinccompiler.py
-index 9dc869de4c8..646b24faa86 100644
---- a/Lib/distutils/tests/test_cygwinccompiler.py
-+++ b/Lib/distutils/tests/test_cygwinccompiler.py
-@@ -5,6 +5,9 @@
- from io import BytesIO
- from test.support import run_unittest
-
-+if sys.platform != 'win32':
-+ raise unittest.SkipTest("Cygwin tests only needed on Windows")
++ # watchOS doesn't have a testbed (yet!)
++ if context.platform != "watchOS":
++ # Clone testbed
++ print()
++ run([
++ sys.executable,
++ "Apple/testbed",
++ "clone",
++ "--platform",
++ context.platform,
++ "--framework",
++ CROSS_BUILD_DIR / context.platform / "Python.xcframework",
++ CROSS_BUILD_DIR / context.platform / "testbed",
++ ])
++
++ # Build the final archive
++ archive_name = (
++ CROSS_BUILD_DIR
++ / "dist"
++ / f"python-{version}-{context.platform}-XCframework"
++ )
+
- from distutils import cygwinccompiler
- from distutils.cygwinccompiler import (check_config_h,
- CONFIG_H_OK, CONFIG_H_NOTOK,
-diff --git a/Lib/distutils/tests/test_sysconfig.py b/Lib/distutils/tests/test_sysconfig.py
-index 59676b0e0b0..ba7bb5b7693 100644
---- a/Lib/distutils/tests/test_sysconfig.py
-+++ b/Lib/distutils/tests/test_sysconfig.py
-@@ -10,7 +10,7 @@
- from distutils import sysconfig
- from distutils.ccompiler import get_default_compiler
- from distutils.tests import support
--from test.support import run_unittest, swap_item
-+from test.support import is_apple_mobile, requires_subprocess, run_unittest, swap_item
- from test.support.os_helper import TESTFN
- from test.support.warnings_helper import check_warnings
-
-@@ -32,6 +32,7 @@
- elif os.path.isdir(TESTFN):
- shutil.rmtree(TESTFN)
-
-+ @unittest.skipIf(is_apple_mobile, "Header files not distributed with Apple mobile")
- def test_get_config_h_filename(self):
- config_h = sysconfig.get_config_h_filename()
- self.assertTrue(os.path.isfile(config_h), config_h)
-@@ -48,6 +49,7 @@
- self.assertIsInstance(cvars, dict)
- self.assertTrue(cvars)
-
-+ @unittest.skipIf(is_apple_mobile, "Header files not distributed with Apple mobile")
- def test_srcdir(self):
- # See Issues #15322, #15364.
- srcdir = sysconfig.get_config_var('srcdir')
-@@ -247,6 +249,7 @@
- self.assertIsNotNone(vars['SO'])
- self.assertEqual(vars['SO'], vars['EXT_SUFFIX'])
-
-+ @requires_subprocess()
- def test_customize_compiler_before_get_config_vars(self):
- # Issue #21923: test that a Distribution compiler
- # instance can be called without an explicit call to
-diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py
-index d00c48981eb..5d12b4779db 100644
---- a/Lib/distutils/unixccompiler.py
-+++ b/Lib/distutils/unixccompiler.py
-@@ -270,9 +270,9 @@
- static_f = self.library_filename(lib, lib_type='static')
-
- if sys.platform == 'darwin':
-- # On OSX users can specify an alternate SDK using
-- # '-isysroot', calculate the SDK root if it is specified
-- # (and use it further on)
-+ # On macOS users can specify an alternate SDK using
-+ # '-isysroot ' or --sysroot=, calculate the SDK root
-+ # if it is specified (and use it further on)
- #
- # Note that, as of Xcode 7, Apple SDKs may contain textual stub
- # libraries with .tbd extensions rather than the normal .dylib
-@@ -291,12 +291,14 @@
- cflags = sysconfig.get_config_var('CFLAGS')
- m = re.search(r'-isysroot\s*(\S+)', cflags)
- if m is None:
-- sysroot = _osx_support._default_sysroot(sysconfig.get_config_var('CC'))
-+ m = re.search(r'--sysroot=(\S+)', cflags)
-+ if m is None:
-+ sysroot = _osx_support._default_sysroot(sysconfig.get_config_var('CC'))
-+ else:
-+ sysroot = m.group(1)
- else:
- sysroot = m.group(1)
-
--
--
- for dir in dirs:
- shared = os.path.join(dir, shared_f)
- dylib = os.path.join(dir, dylib_f)
-diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py
-index 2ce5c5b64d6..e927f4af938 100644
---- a/Lib/distutils/util.py
-+++ b/Lib/distutils/util.py
-@@ -89,10 +89,25 @@
- if m:
- release = m.group()
- elif osname[:6] == "darwin":
-- import _osx_support, distutils.sysconfig
-- osname, release, machine = _osx_support.get_platform_osx(
-- distutils.sysconfig.get_config_vars(),
-- osname, release, machine)
-+ import distutils.sysconfig
-+ config_vars = distutils.sysconfig.get_config_vars()
-+ if sys.platform == "ios":
-+ release = config_vars.get("IPHONEOS_DEPLOYMENT_TARGET", "13.0")
-+ osname = sys.platform
-+ machine = sys.implementation._multiarch
-+ elif sys.platform == "tvos":
-+ release = config_vars.get("TVOS_DEPLOYMENT_TARGET", "9.0")
-+ osname = sys.platform
-+ machine = sys.implementation._multiarch
-+ elif sys.platform == "watchos":
-+ release = config_vars.get("WATCHOS_DEPLOYMENT_TARGET", "4.0")
-+ osname = sys.platform
-+ machine = sys.implementation._multiarch
-+ else:
-+ import _osx_support
-+ osname, release, machine = _osx_support.get_platform_osx(
-+ config_vars,
-+ osname, release, machine)
-
- return "%s-%s-%s" % (osname, release, machine)
-
-@@ -170,7 +185,7 @@
- if _environ_checked:
- return
-
-- if os.name == 'posix' and 'HOME' not in os.environ:
-+ if os.name == 'posix' and 'HOME' not in os.environ and sys.platform not in {"ios", "tvos", "watchos"}:
- try:
- import pwd
- os.environ['HOME'] = pwd.getpwuid(os.getuid())[5]
-diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py
-index 49bcaea78d7..94052fc72e4 100644
---- a/Lib/importlib/_bootstrap_external.py
-+++ b/Lib/importlib/_bootstrap_external.py
-@@ -52,7 +52,7 @@
-
- # Bootstrap-related code ######################################################
- _CASE_INSENSITIVE_PLATFORMS_STR_KEY = 'win',
--_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY = 'cygwin', 'darwin'
-+_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY = 'cygwin', 'darwin', 'ios', 'tvos', 'watchos'
- _CASE_INSENSITIVE_PLATFORMS = (_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY
- + _CASE_INSENSITIVE_PLATFORMS_STR_KEY)
-
-@@ -1637,6 +1637,46 @@
- return 'FileFinder({!r})'.format(self.path)
-
-
-+class AppleFrameworkLoader(ExtensionFileLoader):
-+ """A loader for modules that have been packaged as frameworks for
-+ compatibility with Apple's iOS App Store policies.
-+ """
-+ def create_module(self, spec):
-+ # If the ModuleSpec has been created by the FileFinder, it will have
-+ # been created with an origin pointing to the .fwork file. We need to
-+ # redirect this to the location in the Frameworks folder, using the
-+ # content of the .fwork file.
-+ if spec.origin.endswith(".fwork"):
-+ with _io.FileIO(spec.origin, 'r') as file:
-+ framework_binary = file.read().decode().strip()
-+ bundle_path = _path_split(sys.executable)[0]
-+ spec.origin = _path_join(bundle_path, framework_binary)
++ print()
++ print("Create package archive...")
++ shutil.make_archive(
++ str(CROSS_BUILD_DIR / archive_name),
++ format="gztar",
++ root_dir=CROSS_BUILD_DIR / context.platform,
++ base_dir=".",
++ )
++ print()
++ print(f"{archive_name.relative_to(PYTHON_DIR)}.tar.gz created.")
+
-+ # If the loader is created based on the spec for a loaded module, the
-+ # path will be pointing at the Framework location. If this occurs,
-+ # get the original .fwork location to use as the module's __file__.
-+ if self.path.endswith(".fwork"):
-+ path = self.path
++
++def build(context: argparse.Namespace, host: str | None = None) -> None:
++ """The implementation of the "build" command."""
++ if host is None:
++ host = context.host
++
++ if context.clean:
++ clean(context, host)
++
++ if host in {"all", "build"}:
++ for step in [
++ configure_build_python,
++ make_build_python,
++ ]:
++ step(context)
++
++ if host == "build":
++ hosts = []
++ elif host in {"all", "hosts"}:
++ hosts = all_host_triples(context.platform)
++ else:
++ hosts = [host]
++
++ for step_host in hosts:
++ for step in [
++ configure_host_python,
++ make_host_python,
++ ]:
++ step(context, host=step_host)
++
++ if host in {"all", "hosts"}:
++ package(context)
++
++
++def test(context: argparse.Namespace, host: str | None = None) -> None:
++ """The implementation of the "test" command."""
++ if host is None:
++ host = context.host
++
++ if context.clean:
++ clean(context, "test")
++
++ with group(f"Test {'XCframework' if host in {'all', 'hosts'} else host}"):
++ timestamp = str(time.time_ns())[:-6]
++ testbed_dir = (
++ CROSS_BUILD_DIR / f"{context.platform}-testbed.{timestamp}"
++ )
++ if host in {"all", "hosts"}:
++ framework_path = (
++ CROSS_BUILD_DIR / context.platform / "Python.xcframework"
++ )
+ else:
-+ with _io.FileIO(self.path + ".origin", 'r') as file:
-+ origin = file.read().decode().strip()
-+ bundle_path = _path_split(sys.executable)[0]
-+ path = _path_join(bundle_path, origin)
++ build_arch = platform.machine()
++ host_arch = host.split("-")[0]
+
-+ module = _bootstrap._call_with_frames_removed(_imp.create_dynamic, spec)
++ if not host.endswith("-simulator"):
++ print("Skipping test suite non-simulator build.")
++ return
++ elif build_arch != host_arch:
++ print(
++ f"Skipping test suite for an {host_arch} build "
++ f"on an {build_arch} machine."
++ )
++ return
++ else:
++ framework_path = (
++ CROSS_BUILD_DIR
++ / host
++ / f"Apple/{context.platform}"
++ / f"Frameworks/{apple_multiarch(host)}"
++ )
+
-+ _bootstrap._verbose_message(
-+ "Apple framework extension module {!r} loaded from {!r} (path {!r})",
-+ spec.name,
-+ spec.origin,
-+ path,
++ run([
++ sys.executable,
++ "Apple/testbed",
++ "clone",
++ "--platform",
++ context.platform,
++ "--framework",
++ framework_path,
++ testbed_dir,
++ ])
++
++ run(
++ [
++ sys.executable,
++ testbed_dir,
++ "run",
++ "--verbose",
++ ]
++ + (
++ ["--simulator", str(context.simulator)]
++ if context.simulator
++ else []
++ )
++ + [
++ "--",
++ "test",
++ # f"--{context.ci_mode}-ci",
++ "-uall",
++ # "--rerun",
++ # "--single-process",
++ "-W",
++ # Timeout handling requires subprocesses; explicitly setting
++ # the timeout to -1 disables the faulthandler.
++ "--timeout=-1",
++ # Adding Python options requires the use of a subprocess to
++ # start a new Python interpreter.
++ # "--dont-add-python-opts",
++ ]
+ )
+
-+ # Ensure that the __file__ points at the .fwork location
-+ module.__file__ = path
+
-+ return module
++def apple_sim_host(platform_name: str) -> str:
++ """Determine the native simulator target for this platform."""
++ for _, slice_parts in HOSTS[platform_name].items():
++ for host_triple in slice_parts:
++ parts = host_triple.split("-")
++ if parts[0] == platform.machine() and parts[-1] == "simulator":
++ return host_triple
+
- # Import setup ###############################################################
-
- def _fix_up_module(ns, name, pathname, cpathname=None):
-@@ -1667,10 +1707,17 @@
-
- Each item is a tuple (loader, suffixes).
- """
-- extensions = ExtensionFileLoader, _imp.extension_suffixes()
-+ if sys.platform in {"ios", "tvos", "watchos"}:
-+ extension_loaders = [(AppleFrameworkLoader, [
-+ suffix.replace(".so", ".fwork")
-+ for suffix in _imp.extension_suffixes()
-+ ])]
-+ else:
-+ extension_loaders = []
-+ extension_loaders.append((ExtensionFileLoader, _imp.extension_suffixes()))
- source = SourceFileLoader, SOURCE_SUFFIXES
- bytecode = SourcelessFileLoader, BYTECODE_SUFFIXES
-- return [extensions, source, bytecode]
-+ return extension_loaders + [source, bytecode]
-
-
- def _set_bootstrap_module(_bootstrap_module):
-diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py
-index 0b4a3f80717..5c97d45d2fc 100644
---- a/Lib/importlib/abc.py
-+++ b/Lib/importlib/abc.py
-@@ -250,7 +250,11 @@
- else:
- return self.source_to_code(source, path)
-
--_register(ExecutionLoader, machinery.ExtensionFileLoader)
-+_register(
-+ ExecutionLoader,
-+ machinery.ExtensionFileLoader,
-+ machinery.AppleFrameworkLoader,
-+)
-
-
- class FileLoader(_bootstrap_external.FileLoader, ResourceLoader, ExecutionLoader):
-diff --git a/Lib/importlib/machinery.py b/Lib/importlib/machinery.py
-index 9a7757fb6e4..cdf6385ea98 100644
---- a/Lib/importlib/machinery.py
-+++ b/Lib/importlib/machinery.py
-@@ -12,7 +12,11 @@
- from ._bootstrap_external import SourceFileLoader
- from ._bootstrap_external import SourcelessFileLoader
- from ._bootstrap_external import ExtensionFileLoader
--
-+try:
-+ # For cross-build purposes, allow this import to fail
-+ from ._bootstrap_external import AppleFrameworkLoader
-+except ImportError:
-+ pass
-
- def all_suffixes():
- """Returns a list of all recognized module suffixes for this process"""
-diff --git a/Lib/inspect.py b/Lib/inspect.py
-index 2999a6019e0..d28a98539d5 100644
---- a/Lib/inspect.py
-+++ b/Lib/inspect.py
-@@ -853,6 +853,7 @@
- return object
- if hasattr(object, '__module__'):
- return sys.modules.get(object.__module__)
++ raise KeyError(platform_name)
+
- # Try the filename to modulename cache
- if _filename is not None and _filename in modulesbyfile:
- return sys.modules.get(modulesbyfile[_filename])
-@@ -946,7 +947,7 @@
- # Allow filenames in form of "" to pass through.
- # `doctest` monkeypatches `linecache` module to enable
- # inspection, so let `linecache.getlines` to be called.
-- if not (file.startswith('<') and file.endswith('>')):
-+ if (not (file.startswith('<') and file.endswith('>'))) or file.endswith('.fwork'):
- raise OSError('source code not available')
-
- module = getmodule(object, file)
-diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py
-index 90a1b34b5ff..2e07663de43 100644
---- a/Lib/lib2to3/tests/test_parser.py
-+++ b/Lib/lib2to3/tests/test_parser.py
-@@ -62,6 +62,7 @@
- shutil.rmtree(tmpdir)
-
- @unittest.skipIf(sys.executable is None, 'sys.executable required')
-+ @test.support.requires_subprocess()
- def test_load_grammar_from_subprocess(self):
- tmpdir = tempfile.mkdtemp()
- tmpsubdir = os.path.join(tmpdir, 'subdir')
-diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py
-index cb455f40c4d..55a4c78e768 100644
---- a/Lib/modulefinder.py
-+++ b/Lib/modulefinder.py
-@@ -80,7 +80,12 @@
- if isinstance(spec.loader, importlib.machinery.SourceFileLoader):
- kind = _PY_SOURCE
-
-- elif isinstance(spec.loader, importlib.machinery.ExtensionFileLoader):
-+ elif isinstance(
-+ spec.loader, (
-+ importlib.machinery.ExtensionFileLoader,
-+ importlib.machinery.AppleFrameworkLoader,
++
++def ci(context: argparse.Namespace) -> None:
++ """The implementation of the "ci" command.
++
++ In "Fast" mode, this compiles the build python, and the simulator for the
++ build machine's architecture; and runs the test suite with `--fast-ci`
++ configuration.
++
++ In "Slow" mode, it compiles the build python, plus all candidate
++ architectures (both device and simulator); then runs the test suite with
++ `--slow-ci` configuration.
++ """
++ clean(context, "all")
++ if context.ci_mode == "slow":
++ # In slow mode, build and test the full XCframework
++ build(context, host="all")
++ test(context, host="all")
++ else:
++ # In fast mode, just build the simulator platform.
++ sim_host = apple_sim_host(context.platform)
++ build(context, host="build")
++ build(context, host=sim_host)
++ test(context, host=sim_host)
++
++
++def parse_args() -> argparse.Namespace:
++ parser = argparse.ArgumentParser(
++ description=(
++ "A tool for managing the build, package and test process of "
++ "CPython on Apple platforms."
++ ),
++ )
++ parser.suggest_on_error = True
++ subcommands = parser.add_subparsers(dest="subcommand", required=True)
++
++ clean = subcommands.add_parser(
++ "clean",
++ help="Delete all build directories",
++ )
++
++ configure_build = subcommands.add_parser(
++ "configure-build", help="Run `configure` for the build Python"
++ )
++ subcommands.add_parser(
++ "make-build", help="Run `make` for the build Python"
++ )
++ configure_host = subcommands.add_parser(
++ "configure-host",
++ help="Run `configure` for a specific platform and target",
++ )
++ make_host = subcommands.add_parser(
++ "make-host",
++ help="Run `make` for a specific platform and target",
++ )
++ package = subcommands.add_parser(
++ "package",
++ help="Create a release package for the platform",
++ )
++ build = subcommands.add_parser(
++ "build",
++ help="Build all platform targets and create the XCframework",
++ )
++ test = subcommands.add_parser(
++ "test",
++ help="Run the testbed for a specific platform",
++ )
++ ci = subcommands.add_parser(
++ "ci",
++ help="Run build, package, and test",
++ )
++
++ # platform argument
++ for cmd in [clean, configure_host, make_host, package, build, test, ci]:
++ cmd.add_argument(
++ "platform",
++ choices=HOSTS.keys(),
++ help="The target platform to build",
+ )
-+ ):
- kind = _C_EXTENSION
-
- elif isinstance(spec.loader, importlib.machinery.SourcelessFileLoader):
-diff --git a/Lib/platform.py b/Lib/platform.py
-index 6a820c90a1a..28bd77fcf3d 100755
---- a/Lib/platform.py
-+++ b/Lib/platform.py
-@@ -449,6 +449,78 @@
- # If that also doesn't work return the default values
- return release, versioninfo, machine
-
+
-+# A namedtuple for iOS version information.
-+IOSVersionInfo = collections.namedtuple(
-+ "IOSVersionInfo",
-+ ["system", "release", "model", "is_simulator"]
-+)
++ # host triple argument
++ for cmd in [configure_host, make_host]:
++ cmd.add_argument(
++ "host",
++ help="The host triple to build (e.g., arm64-apple-ios-simulator)",
++ )
++ # optional host triple argument
++ for cmd in [clean, build, test]:
++ cmd.add_argument(
++ "host",
++ nargs="?",
++ default="all",
++ help=(
++ "The host triple to build (e.g., arm64-apple-ios-simulator), "
++ "or 'build' for just the build platform, or 'hosts' for all "
++ "host platforms, or 'all' for the build platform and all "
++ "hosts. Defaults to 'all'"
++ ),
++ )
+
++ # --clean option
++ for cmd in [configure_build, configure_host, build, package, test, ci]:
++ cmd.add_argument(
++ "--clean",
++ action="store_true",
++ default=False,
++ dest="clean",
++ help="Delete the relevant build directories first",
++ )
+
-+def ios_ver(system="", release="", model="", is_simulator=False):
-+ """Get iOS version information, and return it as a namedtuple:
-+ (system, release, model, is_simulator).
++ # --cache-dir option
++ for cmd in [configure_host, build, ci]:
++ cmd.add_argument(
++ "--cache-dir",
++ default="./cross-build/downloads",
++ help="The directory to store cached downloads.",
++ )
+
-+ If values can't be determined, they are set to values provided as
-+ parameters.
-+ """
-+ if sys.platform == "ios":
-+ import _ios_support
-+ result = _ios_support.get_platform_ios()
-+ if result is not None:
-+ return IOSVersionInfo(*result)
++ # --simulator option
++ for cmd in [test, ci]:
++ cmd.add_argument(
++ "--simulator",
++ help=(
++ "The name of the simulator to use (eg: 'iPhone 16e'). "
++ "Defaults to the most recently released 'entry level' "
++ "iPhone device. Device architecture and OS version can also "
++ "be specified; e.g., "
++ "`--simulator 'iPhone 16 Pro,arch=arm64,OS=26.0'` would "
++ "run on an ARM64 iPhone 16 Pro simulator running iOS 26.0."
++ ),
++ )
++ group = cmd.add_mutually_exclusive_group()
++ group.add_argument(
++ "--fast-ci",
++ action="store_const",
++ dest="ci_mode",
++ const="fast",
++ help="Add test arguments for GitHub Actions",
++ )
++ group.add_argument(
++ "--slow-ci",
++ action="store_const",
++ dest="ci_mode",
++ const="slow",
++ help="Add test arguments for buildbots",
++ )
+
-+ return IOSVersionInfo(system, release, model, is_simulator)
++ for subcommand in [configure_build, configure_host, build, ci]:
++ subcommand.add_argument(
++ "args", nargs="*", help="Extra arguments to pass to `configure`"
++ )
+
++ return parser.parse_args()
+
-+# A namedtuple for tvOS version information.
-+TVOSVersionInfo = collections.namedtuple(
-+ "TVOSVersionInfo",
-+ ["system", "release", "model", "is_simulator"]
-+)
+
++def print_called_process_error(e: subprocess.CalledProcessError) -> None:
++ for stream_name in ["stdout", "stderr"]:
++ content = getattr(e, stream_name)
++ stream = getattr(sys, stream_name)
++ if content:
++ stream.write(content)
++ if not content.endswith("\n"):
++ stream.write("\n")
+
-+def tvos_ver(system="", release="", model="", is_simulator=False):
-+ """Get tvOS version information, and return it as a namedtuple:
-+ (system, release, model, is_simulator).
++ # shlex uses single quotes, so we surround the command with double quotes.
++ print(
++ f'Command "{join_command(e.cmd)}" returned exit status {e.returncode}'
++ )
+
-+ If values can't be determined, they are set to values provided as
-+ parameters.
-+ """
-+ if sys.platform == "tvos":
-+ # TODO: Can the iOS implementation be used here?
-+ import _ios_support
-+ result = _ios_support.get_platform_ios()
-+ if result is not None:
-+ return TVOSVersionInfo(*result)
+
-+ return TVOSVersionInfo(system, release, model, is_simulator)
++def main() -> None:
++ # Handle SIGTERM the same way as SIGINT. This ensures that if we're
++ # terminated by the buildbot worker, we'll make an attempt to clean up our
++ # subprocesses.
++ def signal_handler(*args):
++ os.kill(os.getpid(), signal.SIGINT)
++
++ signal.signal(signal.SIGTERM, signal_handler)
++
++ # Process command line arguments
++ context = parse_args()
++ dispatch: dict[str, Callable] = {
++ "clean": clean,
++ "configure-build": configure_build_python,
++ "make-build": make_build_python,
++ "configure-host": configure_host_python,
++ "make-host": make_host_python,
++ "package": package,
++ "build": build,
++ "test": test,
++ "ci": ci,
++ }
+
++ try:
++ dispatch[context.subcommand](context)
++ except CalledProcessError as e:
++ print()
++ print_called_process_error(e)
++ sys.exit(1)
++ except RuntimeError as e:
++ print()
++ print(e)
++ sys.exit(2)
+
-+# A namedtuple for watchOS version information.
-+WatchOSVersionInfo = collections.namedtuple(
-+ "WatchOSVersionInfo",
-+ ["system", "release", "model", "is_simulator"]
-+)
+
++if __name__ == "__main__":
++ # Under the buildbot, stdout is not a TTY, but we must still flush after
++ # every line to make sure our output appears in the correct order relative
++ # to the output of our subprocesses.
++ for stream in [sys.stdout, sys.stderr]:
++ stream.reconfigure(line_buffering=True)
+
-+def watchos_ver(system="", release="", model="", is_simulator=False):
-+ """Get watchOS version information, and return it as a namedtuple:
-+ (system, release, model, is_simulator).
++ main()
+--- /dev/null
++++ b/Apple/iOS/README.md
+@@ -0,0 +1,339 @@
++# Python on iOS README
+
-+ If values can't be determined, they are set to values provided as
-+ parameters.
-+ """
-+ if sys.platform == "watchos":
-+ # TODO: Can the iOS implementation be used here?
-+ import _ios_support
-+ result = _ios_support.get_platform_ios()
-+ if result is not None:
-+ return WatchOSVersionInfo(*result)
++**iOS support is [tier 3](https://peps.python.org/pep-0011/#tier-3).**
+
-+ return WatchOSVersionInfo(system, release, model, is_simulator)
++This document provides a quick overview of some iOS specific features in the
++Python distribution.
+
++These instructions are only needed if you're planning to compile Python for iOS
++yourself. Most users should *not* need to do this. If you're looking to
++experiment with writing an iOS app in Python, tools such as [BeeWare's
++Briefcase](https://briefcase.readthedocs.io) and [Kivy's
++Buildozer](https://buildozer.readthedocs.io) will provide a much more
++approachable user experience.
+
- def _java_getprop(name, default):
-
- from java.lang import System
-@@ -564,7 +636,7 @@
- if cleaned == platform:
- break
- platform = cleaned
-- while platform[-1] == '-':
-+ while platform and platform[-1] == '-':
- platform = platform[:-1]
-
- return platform
-@@ -605,7 +677,7 @@
- default in case the command should fail.
-
- """
-- if sys.platform in ('dos', 'win32', 'win16'):
-+ if sys.platform in {'dos', 'win32', 'win16', 'ios', 'tvos', 'watchos'}:
- # XXX Others too ?
- return default
-
-@@ -744,6 +816,25 @@
- csid, cpu_number = vms_lib.getsyi('SYI$_CPU', 0)
- return 'Alpha' if cpu_number >= 128 else 'VAX'
-
-+ # On the iOS/tvOS/watchOS simulator, os.uname returns the architecture as
-+ # uname.machine. On device it returns the model name for some reason; but
-+ # there's only one CPU architecture for devices, so we know the right
-+ # answer.
-+ def get_ios():
-+ if sys.implementation._multiarch.endswith("simulator"):
-+ return os.uname().machine
-+ return 'arm64'
++## Compilers for building on iOS
+
-+ def get_tvos():
-+ if sys.implementation._multiarch.endswith("simulator"):
-+ return os.uname().machine
-+ return 'arm64'
++Building for iOS requires the use of Apple's Xcode tooling. It is strongly
++recommended that you use the most recent stable release of Xcode. This will
++require the use of the most (or second-most) recently released macOS version,
++as Apple does not maintain Xcode for older macOS versions. The Xcode Command
++Line Tools are not sufficient for iOS development; you need a *full* Xcode
++install.
+
-+ def get_watchos():
-+ if sys.implementation._multiarch.endswith("simulator"):
-+ return os.uname().machine
-+ return 'arm64_32'
++If you want to run your code on the iOS simulator, you'll also need to install
++an iOS Simulator Platform. You should be prompted to select an iOS Simulator
++Platform when you first run Xcode. Alternatively, you can add an iOS Simulator
++Platform by selecting an open the Platforms tab of the Xcode Settings panel.
+
- def from_subprocess():
- """
- Fall back to `uname -p`
-@@ -893,6 +984,14 @@
- system = 'Windows'
- release = 'Vista'
-
-+ # Normalize responses on Apple mobile platforms
-+ if sys.platform == 'ios':
-+ system, release, _, _ = ios_ver()
-+ if sys.platform == 'tvos':
-+ system, release, _, _ = tvos_ver()
-+ if sys.platform == 'watchos':
-+ system, release, _, _ = watchos_ver()
++## Building Python on iOS
+
- vals = system, node, release, version, machine
- # Replace 'unknown' values with the more portable ''
- _uname_cache = uname_result(*map(_unknown_as_blank, vals))
-@@ -1205,11 +1304,18 @@
- system, release, version = system_alias(system, release, version)
-
- if system == 'Darwin':
-- # macOS (darwin kernel)
-- macos_release = mac_ver()[0]
-- if macos_release:
-- system = 'macOS'
-- release = macos_release
-+ # macOS and iOS both report as a "Darwin" kernel
-+ if sys.platform == "ios":
-+ system, release, _, _ = ios_ver()
-+ elif sys.platform == "tvos":
-+ system, release, _, _ = tvos_ver()
-+ elif sys.platform == "watchos":
-+ system, release, _, _ = watchos_ver()
-+ else:
-+ macos_release = mac_ver()[0]
-+ if macos_release:
-+ system = 'macOS'
-+ release = macos_release
-
- if system == 'Windows':
- # MS platforms
-diff --git a/Lib/site.py b/Lib/site.py
-index 5302037e0bf..35bf9b03d35 100644
---- a/Lib/site.py
-+++ b/Lib/site.py
-@@ -276,8 +276,8 @@
- if env_base:
- return env_base
-
-- # VxWorks has no home directories
-- if sys.platform == "vxworks":
-+ # iOS, tvOS, VxWorks and watchOS have no home directories
-+ if sys.platform in {"ios", "tvos", "vxworks", "watchos"}:
- return None
-
- def joinuser(*args):
-diff --git a/Lib/sqlite3/test/dbapi.py b/Lib/sqlite3/test/dbapi.py
-index a764c82b0d3..8b23cd3f733 100644
---- a/Lib/sqlite3/test/dbapi.py
-+++ b/Lib/sqlite3/test/dbapi.py
-@@ -26,7 +26,7 @@
- import sqlite3 as sqlite
- import sys
-
--from test.support import check_disallow_instantiation, SHORT_TIMEOUT
-+from test.support import check_disallow_instantiation, SHORT_TIMEOUT, is_apple, requires_subprocess
- from test.support.os_helper import TESTFN, unlink
-
-
-@@ -87,7 +87,7 @@
-
- # sqlite3_enable_shared_cache() is deprecated on macOS and calling it may raise
- # OperationalError on some buildbots.
-- @unittest.skipIf(sys.platform == "darwin", "shared cache is deprecated on macOS")
-+ @unittest.skipIf(is_apple, "shared cache is deprecated on Apple platforms")
- def test_shared_cache_deprecated(self):
- for enable in (True, False):
- with self.assertWarns(DeprecationWarning) as cm:
-@@ -976,6 +976,7 @@
- def tearDown(self):
- unlink(TESTFN)
-
-+ @requires_subprocess()
- def test_ctx_mgr_rollback_if_commit_failed(self):
- # bpo-27334: ctx manager does not rollback if commit fails
- SCRIPT = f"""if 1:
-diff --git a/Lib/subprocess.py b/Lib/subprocess.py
-index f1e3d64dfe0..bd82a633158 100644
---- a/Lib/subprocess.py
-+++ b/Lib/subprocess.py
-@@ -65,16 +65,19 @@
- # NOTE: We intentionally exclude list2cmdline as it is
- # considered an internal implementation detail. issue10838.
-
-+# use presence of msvcrt to detect Windows-like platforms (see bpo-8110)
- try:
- import msvcrt
-- import _winapi
-- _mswindows = True
- except ModuleNotFoundError:
- _mswindows = False
-- import _posixsubprocess
-- import select
-- import selectors
- else:
-+ _mswindows = True
++### ABIs and Architectures
+
-+# some platforms do not support subprocesses
-+_can_fork_exec = sys.platform not in {"ios", "tvos", "watchos"}
++iOS apps can be deployed on physical devices, and on the iOS simulator. Although
++the API used on these devices is identical, the ABI is different - you need to
++link against different libraries for an iOS device build (`iphoneos`) or an
++iOS simulator build (`iphonesimulator`).
+
-+if _mswindows:
-+ import _winapi
- from _winapi import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP,
- STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
- STD_ERROR_HANDLE, SW_HIDE,
-@@ -95,6 +98,12 @@
- "NORMAL_PRIORITY_CLASS", "REALTIME_PRIORITY_CLASS",
- "CREATE_NO_WINDOW", "DETACHED_PROCESS",
- "CREATE_DEFAULT_ERROR_MODE", "CREATE_BREAKAWAY_FROM_JOB"])
-+else:
-+ if _can_fork_exec:
-+ import _posixsubprocess
++Apple uses the `XCframework` format to allow specifying a single dependency
++that supports multiple ABIs. An `XCframework` is a wrapper around multiple
++ABI-specific frameworks that share a common API.
+
-+ import select
-+ import selectors
-
-
- # Exception classes used by this module.
-@@ -764,6 +773,11 @@
- pass_fds=(), *, user=None, group=None, extra_groups=None,
- encoding=None, errors=None, text=None, umask=-1, pipesize=-1):
- """Create new Popen instance."""
-+ if not _can_fork_exec:
-+ raise OSError(
-+ errno.ENOTSUP, f"{sys.platform} does not support processes."
-+ )
++iOS can also support different CPU architectures within each ABI. At present,
++there is only a single supported architecture on physical devices - ARM64.
++However, the *simulator* supports 2 architectures - ARM64 (for running on Apple
++Silicon machines), and x86_64 (for running on older Intel-based machines).
+
- _cleanup()
- # Held while anything is calling waitpid before returncode has been
- # updated to prevent clobbering returncode if wait() or poll() are
-diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
-index daf9f000060..5ddead7bbc6 100644
---- a/Lib/sysconfig.py
-+++ b/Lib/sysconfig.py
-@@ -20,6 +20,7 @@
-
- # Keys for get_config_var() that are never converted to Python integers.
- _ALWAYS_STR = {
-+ 'IPHONEOS_DEPLOYMENT_TARGET',
- 'MACOSX_DEPLOYMENT_TARGET',
- }
-
-@@ -56,6 +57,46 @@
- 'scripts': '{base}/Scripts',
- 'data': '{base}',
- },
++To support multiple CPU architectures on a single platform, Apple uses a "fat
++binary" format - a single physical file that contains support for multiple
++architectures. It is possible to compile and use a "thin" single architecture
++version of a binary for testing purposes; however, the "thin" binary will not be
++portable to machines using other architectures.
+
-+ # Downstream distributors can overwrite the default install scheme.
-+ # This is done to support downstream modifications where distributors change
-+ # the installation layout (eg. different site-packages directory).
-+ # So, distributors will change the default scheme to one that correctly
-+ # represents their layout.
-+ # This presents an issue for projects/people that need to bootstrap virtual
-+ # environments, like virtualenv. As distributors might now be customizing
-+ # the default install scheme, there is no guarantee that the information
-+ # returned by sysconfig.get_default_scheme/get_paths is correct for
-+ # a virtual environment, the only guarantee we have is that it is correct
-+ # for the *current* environment. When bootstrapping a virtual environment,
-+ # we need to know its layout, so that we can place the files in the
-+ # correct locations.
-+ # The "*_venv" install scheme is a scheme to bootstrap virtual environments,
-+ # essentially identical to the default posix_prefix/nt schemes.
-+ # Downstream distributors who patch posix_prefix/nt scheme are encouraged to
-+ # leave the following schemes unchanged
-+ 'posix_venv': {
-+ 'stdlib': '{installed_base}/{platlibdir}/python{py_version_short}',
-+ 'platstdlib': '{platbase}/{platlibdir}/python{py_version_short}',
-+ 'purelib': '{base}/lib/python{py_version_short}/site-packages',
-+ 'platlib': '{platbase}/{platlibdir}/python{py_version_short}/site-packages',
-+ 'include':
-+ '{installed_base}/include/python{py_version_short}{abiflags}',
-+ 'platinclude':
-+ '{installed_platbase}/include/python{py_version_short}{abiflags}',
-+ 'scripts': '{base}/bin',
-+ 'data': '{base}',
-+ },
-+ 'nt_venv': {
-+ 'stdlib': '{installed_base}/Lib',
-+ 'platstdlib': '{base}/Lib',
-+ 'purelib': '{base}/Lib/site-packages',
-+ 'platlib': '{base}/Lib/site-packages',
-+ 'include': '{installed_base}/Include',
-+ 'platinclude': '{installed_base}/Include',
-+ 'scripts': '{base}/Scripts',
-+ 'data': '{base}',
-+ },
- }
-
-
-@@ -66,8 +107,8 @@
- if env_base:
- return env_base
-
-- # VxWorks has no home directories
-- if sys.platform == "vxworks":
-+ # iOS, tvOS, VxWorks and watchOS have no home directories
-+ if sys.platform in {"ios", "tvos", "vxworks", "watchos"}:
- return None
-
- def joinuser(*args):
-@@ -237,6 +278,7 @@
- 'home': 'posix_home',
- 'user': 'osx_framework_user',
- }
++### Building a multi-architecture iOS XCframework
+
- return {
- 'prefix': 'posix_prefix',
- 'home': 'posix_home',
-@@ -740,10 +782,23 @@
- if m:
- release = m.group()
- elif osname[:6] == "darwin":
-- import _osx_support
-- osname, release, machine = _osx_support.get_platform_osx(
-- get_config_vars(),
-- osname, release, machine)
-+ if sys.platform == "ios":
-+ release = get_config_vars().get("IPHONEOS_DEPLOYMENT_TARGET", "13.0")
-+ osname = sys.platform
-+ machine = sys.implementation._multiarch
-+ elif sys.platform == "tvos":
-+ release = get_config_vars().get("TVOS_DEPLOYMENT_TARGET", "9.0")
-+ osname = sys.platform
-+ machine = sys.implementation._multiarch
-+ elif sys.platform == "watchos":
-+ release = get_config_vars().get("WATCHOS_DEPLOYMENT_TARGET", "4.0")
-+ osname = sys.platform
-+ machine = sys.implementation._multiarch
-+ else:
-+ import _osx_support
-+ osname, release, machine = _osx_support.get_platform_osx(
-+ get_config_vars(),
-+ osname, release, machine)
-
- return f"{osname}-{release}-{machine}"
-
-diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py
-index f474a756b33..21e792a8642 100644
---- a/Lib/test/datetimetester.py
-+++ b/Lib/test/datetimetester.py
-@@ -5908,6 +5908,8 @@
- ldt = tz.fromutc(udt.replace(tzinfo=tz))
- self.assertEqual(ldt.fold, 0)
-
-+ @unittest.skipIf(support.is_apple_mobile,
-+ "FIXME: Edge case in timezone handling")
- def test_system_transitions(self):
- if ('Riyadh8' in self.zonename or
- # From tzdata NEWS file:
-diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py
-index eef34f08121..22115948788 100644
---- a/Lib/test/pythoninfo.py
-+++ b/Lib/test/pythoninfo.py
-@@ -267,6 +267,7 @@
- "HOMEDRIVE",
- "HOMEPATH",
- "IDLESTARTUP",
-+ "IPHONEOS_DEPLOYMENT_TARGET",
- "LANG",
- "LDFLAGS",
- "LDSHARED",
-diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
-index b7cf1e28581..5eb0f0d7eed 100644
---- a/Lib/test/support/__init__.py
-+++ b/Lib/test/support/__init__.py
-@@ -43,7 +43,7 @@
- "check__all__", "skip_if_buggy_ucrt_strfptime",
- "check_disallow_instantiation", "check_sanitizer", "skip_if_sanitizer",
- # sys
-- "is_jython", "is_android", "check_impl_detail", "unix_shell",
-+ "is_jython", "is_android", "is_apple_mobile", "check_impl_detail", "unix_shell",
- "setswitchinterval",
- # network
- "open_urlresource",
-@@ -469,11 +469,27 @@
-
- is_android = hasattr(sys, 'getandroidapilevel')
-
--if sys.platform not in ('win32', 'vxworks'):
-+if sys.platform not in {"win32", "vxworks", "ios", "tvos", "watchos"}:
- unix_shell = '/system/bin/sh' if is_android else '/bin/sh'
- else:
- unix_shell = None
-
-+# Apple mobile platforms (iOS/tvOS/watchOS) are POSIX-like but do not
-+# have subprocess or fork support.
-+is_apple_mobile = sys.platform in {"ios", "tvos", "watchos"}
-+is_apple = is_apple_mobile or sys.platform == "darwin"
++The `Apple` subfolder of the Python repository acts as a build script that
++can be used to coordinate the compilation of a complete iOS XCframework. To use
++it, run::
+
-+has_fork_support = hasattr(os, "fork") and not is_apple_mobile
++ python Apple build iOS
+
-+def requires_fork():
-+ return unittest.skipUnless(has_fork_support, "requires working os.fork()")
++This will:
+
-+has_subprocess_support = not is_apple_mobile
++* Configure and compile a version of Python to run on the build machine
++* Download pre-compiled binary dependencies for each platform
++* Configure and build a `Python.framework` for each required architecture and
++ iOS SDK
++* Merge the multiple `Python.framework` folders into a single `Python.xcframework`
++* Produce a `.tar.gz` archive in the `cross-build/dist` folder containing
++ the `Python.xcframework`, plus a copy of the Testbed app pre-configured to
++ use the XCframework.
+
-+def requires_subprocess():
-+ """Used for subprocess, os.spawn calls, fd inheritance"""
-+ return unittest.skipUnless(has_subprocess_support, "requires subprocess support")
++The `Apple` build script has other entry points that will perform the
++individual parts of the overall `build` target, plus targets to test the
++build, clean the `cross-build` folder of iOS build products, and perform a
++complete "build and test" CI run. The `--clean` flag can also be used on
++individual commands to ensure that a stale build product are removed before
++building.
+
- # Define the URL of a dedicated HTTP server for the network tests.
- # The URL must use clear-text HTTP: no redirection to encrypted HTTPS.
- TEST_HTTP_URL = "http://www.pythontest.net"
-@@ -1428,6 +1444,7 @@
- if verbose:
- print("failed to clean up {}: {}".format(link, ex))
-
-+ @requires_subprocess()
- def _call(self, python, args, env, returncode):
- import subprocess
- cmd = [python, *args]
-diff --git a/Lib/test/support/os_helper.py b/Lib/test/support/os_helper.py
-index 82a6de789c8..78b61e13dd1 100644
---- a/Lib/test/support/os_helper.py
-+++ b/Lib/test/support/os_helper.py
-@@ -9,6 +9,8 @@
- import unittest
- import warnings
-
-+from test import support
++### Building a single-architecture framework
+
-
- # Filename used for testing
- if os.name == 'java':
-@@ -23,8 +25,8 @@
-
- # TESTFN_UNICODE is a non-ascii filename
- TESTFN_UNICODE = TESTFN_ASCII + "-\xe0\xf2\u0258\u0141\u011f"
--if sys.platform == 'darwin':
-- # In Mac OS X's VFS API file names are, by definition, canonically
-+if support.is_apple:
-+ # On Apple's VFS API file names are, by definition, canonically
- # decomposed Unicode, encoded using UTF-8. See QA1173:
- # http://developer.apple.com/mac/library/qa/qa2001/qa1173.html
- import unicodedata
-@@ -49,8 +51,8 @@
- 'encoding (%s). Unicode filename tests may not be effective'
- % (TESTFN_UNENCODABLE, sys.getfilesystemencoding()))
- TESTFN_UNENCODABLE = None
--# Mac OS X denies unencodable filenames (invalid utf-8)
--elif sys.platform != 'darwin':
-+# Apple denies unencodable filenames (invalid utf-8)
-+elif not support.is_apple:
- try:
- # ascii and utf-8 cannot encode the byte 0xff
- b'\xff'.decode(sys.getfilesystemencoding())
-@@ -515,7 +517,8 @@
- if hasattr(os, 'sysconf'):
- try:
- MAXFD = os.sysconf("SC_OPEN_MAX")
-- except OSError:
-+ except (OSError, ValueError):
-+ # gh-118201: ValueError is raised intermittently on iOS
- pass
-
- old_modes = None
-diff --git a/Lib/test/support/script_helper.py b/Lib/test/support/script_helper.py
-index 6d699c8486c..f8bc838020d 100644
---- a/Lib/test/support/script_helper.py
-+++ b/Lib/test/support/script_helper.py
-@@ -19,6 +19,7 @@
- __cached_interp_requires_environment = None
-
-
-+@support.requires_subprocess()
- def interpreter_requires_environment():
- """
- Returns True if our sys.executable interpreter requires environment
-@@ -87,6 +88,7 @@
-
-
- # Executing the interpreter in a subprocess
-+@support.requires_subprocess()
- def run_python_until_end(*args, **env_vars):
- env_required = interpreter_requires_environment()
- cwd = env_vars.pop('__cwd', None)
-@@ -146,6 +148,7 @@
- return res
-
-
-+@support.requires_subprocess()
- def assert_python_ok(*args, **env_vars):
- """
- Assert that running the interpreter with `args` and optional environment
-@@ -160,6 +163,7 @@
- return _assert_python(True, *args, **env_vars)
-
-
-+@support.requires_subprocess()
- def assert_python_failure(*args, **env_vars):
- """
- Assert that running the interpreter with `args` and optional environment
-@@ -171,6 +175,7 @@
- return _assert_python(False, *args, **env_vars)
-
-
-+@support.requires_subprocess()
- def spawn_python(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw):
- """Run a Python subprocess with the given arguments.
-
-@@ -273,6 +278,7 @@
- return zip_name, os.path.join(zip_name, script_name_in_zip)
-
-
-+@support.requires_subprocess()
- def run_test_script(script):
- # use -u to try to get the full output if the test hangs or crash
- if support.verbose:
-diff --git a/Lib/test/support/socket_helper.py b/Lib/test/support/socket_helper.py
-index 38c499bf722..8de55306053 100644
---- a/Lib/test/support/socket_helper.py
-+++ b/Lib/test/support/socket_helper.py
-@@ -1,8 +1,10 @@
- import contextlib
- import errno
-+import os.path
- import socket
--import unittest
-+import tempfile
- import sys
-+import unittest
-
- from .. import support
-
-@@ -267,3 +269,14 @@
- # __cause__ or __context__?
- finally:
- socket.setdefaulttimeout(old_timeout)
++If you're using the `Apple` build script, you won't need to build
++individual frameworks. However, if you do need to manually configure an iOS
++Python build for a single framework, the following options are available.
+
++#### iOS specific arguments to configure
+
-+def create_unix_domain_name():
-+ """
-+ Create a UNIX domain name: socket.bind() argument of a AF_UNIX socket.
++* `--enable-framework[=DIR]`
+
-+ Return a path relative to the current directory to get a short path
-+ (around 27 ASCII characters).
-+ """
-+ return tempfile.mktemp(prefix="test_python_", suffix='.sock',
-+ dir=os.path.curdir)
---- /dev/null
-+++ b/Lib/test/test_apple.py
-@@ -0,0 +1,155 @@
-+import unittest
-+from _apple_support import SystemLog
-+from test.support import is_apple_mobile
-+from unittest.mock import Mock, call
++ This argument specifies the location where the Python.framework will be
++ installed. If `DIR` is not specified, the framework will be installed into
++ a subdirectory of the `iOS/Frameworks` folder.
+
-+if not is_apple_mobile:
-+ raise unittest.SkipTest("iOS-specific")
++ This argument *must* be provided when configuring iOS builds. iOS does not
++ support non-framework builds.
+
++* `--with-framework-name=NAME`
+
-+# Test redirection of stdout and stderr to the Apple system log.
-+class TestAppleSystemLogOutput(unittest.TestCase):
-+ maxDiff = None
++ Specify the name for the Python framework; defaults to `Python`.
+
-+ def assert_writes(self, output):
-+ self.assertEqual(
-+ self.log_write.mock_calls,
-+ [
-+ call(self.log_level, line)
-+ for line in output
-+ ]
-+ )
++ > [!NOTE]
++ > Unless you know what you're doing, changing the name of the Python
++ > framework on iOS is not advised. If you use this option, you won't be able
++ > to run the `Apple` build script without making significant manual
++ > alterations, and you won't be able to use any binary packages unless you
++ > compile them yourself using your own framework name.
+
-+ self.log_write.reset_mock()
++#### Building Python for iOS
+
-+ def setUp(self):
-+ self.log_write = Mock()
-+ self.log_level = 42
-+ self.log = SystemLog(self.log_write, self.log_level, errors="replace")
++The Python build system will create a `Python.framework` that supports a
++*single* ABI with a *single* architecture. Unlike macOS, iOS does not allow a
++framework to contain non-library content, so the iOS build will produce a
++`bin` and `lib` folder in the same output folder as `Python.framework`.
++The `lib` folder will be needed at runtime to support the Python library.
+
-+ def test_repr(self):
-+ self.assertEqual(repr(self.log), "")
-+ self.assertEqual(repr(self.log.buffer), "")
++If you want to use Python in a real iOS project, you need to produce multiple
++`Python.framework` builds, one for each ABI and architecture. iOS builds of
++Python *must* be constructed as framework builds. To support this, you must
++provide the `--enable-framework` flag when configuring the build. The build
++also requires the use of cross-compilation. The minimal commands for building
++Python for the ARM64 iOS simulator will look something like:
++```
++export PATH="$(pwd)/Apple/iOS/Resources/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin"
++./configure \
++ --enable-framework \
++ --host=arm64-apple-ios-simulator \
++ --build=arm64-apple-darwin \
++ --with-build-python=/path/to/python.exe
++make
++make install
++```
+
-+ def test_log_config(self):
-+ self.assertIs(self.log.writable(), True)
-+ self.assertIs(self.log.readable(), False)
++In this invocation:
+
-+ self.assertEqual("UTF-8", self.log.encoding)
-+ self.assertEqual("replace", self.log.errors)
++* `Apple/iOS/Resources/bin` has been added to the path, providing some shims for the
++ compilers and linkers needed by the build. Xcode requires the use of `xcrun`
++ to invoke compiler tooling. However, if `xcrun` is pre-evaluated and the
++ result passed to `configure`, these results can embed user- and
++ version-specific paths into the sysconfig data, which limits the portability
++ of the compiled Python. Alternatively, if `xcrun` is used *as* the compiler,
++ it requires that compiler variables like `CC` include spaces, which can
++ cause significant problems with many C configuration systems which assume that
++ `CC` will be a single executable.
+
-+ self.assertIs(self.log.line_buffering, True)
-+ self.assertIs(self.log.write_through, False)
++ To work around this problem, the `Apple/iOS/Resources/bin` folder contains some
++ wrapper scripts that present as simple compilers and linkers, but wrap
++ underlying calls to `xcrun`. This allows configure to use a `CC`
++ definition without spaces, and without user- or version-specific paths, while
++ retaining the ability to adapt to the local Xcode install. These scripts are
++ included in the `bin` directory of an iOS install.
+
-+ def test_empty_str(self):
-+ self.log.write("")
-+ self.log.flush()
++ These scripts will, by default, use the currently active Xcode installation.
++ If you want to use a different Xcode installation, you can use
++ `xcode-select` to set a new default Xcode globally, or you can use the
++ `DEVELOPER_DIR` environment variable to specify an Xcode install. The
++ scripts will use the default `iphoneos`/`iphonesimulator` SDK version for
++ the select Xcode install; if you want to use a different SDK, you can set the
++ `IOS_SDK_VERSION` environment variable. (e.g, setting
++ `IOS_SDK_VERSION=17.1` would cause the scripts to use the `iphoneos17.1`
++ and `iphonesimulator17.1` SDKs, regardless of the Xcode default.)
+
-+ self.assert_writes([])
++ The path has also been cleared of any user customizations. A common source of
++ bugs is for tools like Homebrew to accidentally leak macOS binaries into an iOS
++ build. Resetting the path to a known "bare bones" value is the easiest way to
++ avoid these problems.
+
-+ def test_simple_str(self):
-+ self.log.write("hello world\n")
++* `--host` is the architecture and ABI that you want to build, in GNU compiler
++ triple format. This will be one of:
+
-+ self.assert_writes([b"hello world\n"])
++ - `arm64-apple-ios` for ARM64 iOS devices.
++ - `arm64-apple-ios-simulator` for the iOS simulator running on Apple
++ Silicon devices.
++ - `x86_64-apple-ios-simulator` for the iOS simulator running on Intel
++ devices.
+
-+ def test_buffered_str(self):
-+ self.log.write("h")
-+ self.log.write("ello")
-+ self.log.write(" ")
-+ self.log.write("world\n")
-+ self.log.write("goodbye.")
-+ self.log.flush()
++* `--build` is the GNU compiler triple for the machine that will be running
++ the compiler. This is one of:
+
-+ self.assert_writes([b"hello world\n", b"goodbye."])
++ - `arm64-apple-darwin` for Apple Silicon devices.
++ - `x86_64-apple-darwin` for Intel devices.
+
-+ def test_manual_flush(self):
-+ self.log.write("Hello")
++* `/path/to/python.exe` is the path to a Python binary on the machine that
++ will be running the compiler. This is needed because the Python compilation
++ process involves running some Python code. On a normal desktop build of
++ Python, you can compile a python interpreter and then use that interpreter to
++ run Python code. However, the binaries produced for iOS won't run on macOS, so
++ you need to provide an external Python interpreter. This interpreter must be
++ the same version as the Python that is being compiled. To be completely safe,
++ this should be the *exact* same commit hash. However, the longer a Python
++ release has been stable, the more likely it is that this constraint can be
++ relaxed - the same micro version will often be sufficient.
+
-+ self.assert_writes([])
++* The `install` target for iOS builds is slightly different to other
++ platforms. On most platforms, `make install` will install the build into
++ the final runtime location. This won't be the case for iOS, as the final
++ runtime location will be on a physical device.
+
-+ self.log.write(" world\nHere for a while...\nGoodbye")
-+ self.assert_writes([b"Hello world\n", b"Here for a while...\n"])
++ However, you still need to run the `install` target for iOS builds, as it
++ performs some final framework assembly steps. The location specified with
++ `--enable-framework` will be the location where `make install` will
++ assemble the complete iOS framework. This completed framework can then
++ be copied and relocated as required.
+
-+ self.log.write(" world\nHello again")
-+ self.assert_writes([b"Goodbye world\n"])
++For a full CPython build, you also need to specify the paths to iOS builds of
++the binary libraries that CPython depends on (such as XZ, LibFFI and OpenSSL).
++This can be done by defining library specific environment variables (such as
++`LIBLZMA_CFLAGS`, `LIBLZMA_LIBS`), and the `--with-openssl` configure
++option. Versions of these libraries pre-compiled for iOS can be found in [this
++repository](https://github.com/beeware/cpython-apple-source-deps/releases).
++LibFFI is especially important, as many parts of the standard library
++(including the `platform`, `sysconfig` and `webbrowser` modules) require
++the use of the `ctypes` module at runtime.
+
-+ self.log.flush()
-+ self.assert_writes([b"Hello again"])
++By default, Python will be compiled with an iOS deployment target (i.e., the
++minimum supported iOS version) of 13.0. To specify a different deployment
++target, provide the version number as part of the `--host` argument - for
++example, `--host=arm64-apple-ios15.4-simulator` would compile an ARM64
++simulator build with a deployment target of 15.4.
+
-+ def test_non_ascii(self):
-+ # Spanish
-+ self.log.write("ol\u00e9\n")
-+ self.assert_writes([b"ol\xc3\xa9\n"])
++## Testing Python on iOS
+
-+ # Chinese
-+ self.log.write("\u4e2d\u6587\n")
-+ self.assert_writes([b"\xe4\xb8\xad\xe6\x96\x87\n"])
++### Testing a multi-architecture framework
+
-+ # Printing Non-BMP emoji
-+ self.log.write("\U0001f600\n")
-+ self.assert_writes([b"\xf0\x9f\x98\x80\n"])
++Once you have a built an XCframework, you can test that framework by running:
+
-+ # Non-encodable surrogates are replaced
-+ self.log.write("\ud800\udc00\n")
-+ self.assert_writes([b"??\n"])
++ $ python Apple test iOS
+
-+ def test_modified_null(self):
-+ # Null characters are logged using "modified UTF-8".
-+ self.log.write("\u0000\n")
-+ self.assert_writes([b"\xc0\x80\n"])
-+ self.log.write("a\u0000\n")
-+ self.assert_writes([b"a\xc0\x80\n"])
-+ self.log.write("\u0000b\n")
-+ self.assert_writes([b"\xc0\x80b\n"])
-+ self.log.write("a\u0000b\n")
-+ self.assert_writes([b"a\xc0\x80b\n"])
++This test will attempt to find an "SE-class" simulator (i.e., an iPhone SE, or
++iPhone 16e, or similar), and run the test suite on the most recent version of
++iOS that is available. You can specify a simulator using the `--simulator`
++command line argument, providing the name of the simulator (e.g., `--simulator
++'iPhone 16 Pro'`). You can also use this argument to control the OS version used
++for testing; `--simulator 'iPhone 16 Pro,OS=18.2'` would attempt to run the
++tests on an iPhone 16 Pro running iOS 18.2.
+
-+ def test_nonstandard_str(self):
-+ # String subclasses are accepted, but they should be converted
-+ # to a standard str without calling any of their methods.
-+ class CustomStr(str):
-+ def splitlines(self, *args, **kwargs):
-+ raise AssertionError()
++If the test runner is executed on GitHub Actions, the `GITHUB_ACTIONS`
++environment variable will be exposed to the iOS process at runtime.
+
-+ def __len__(self):
-+ raise AssertionError()
++### Testing a single-architecture framework
+
-+ def __str__(self):
-+ raise AssertionError()
++The `Apple/testbed` folder that contains an Xcode project that is able to run
++the Python test suite on Apple platforms. This project converts the Python test
++suite into a single test case in Xcode's XCTest framework. The single XCTest
++passes if the test suite passes.
+
-+ self.log.write(CustomStr("custom\n"))
-+ self.assert_writes([b"custom\n"])
++To run the test suite, configure a Python build for an iOS simulator (i.e.,
++`--host=arm64-apple-ios-simulator` or `--host=x86_64-apple-ios-simulator`
++), specifying a framework build (i.e. `--enable-framework`). Ensure that your
++`PATH` has been configured to include the `Apple/iOS/Resources/bin` folder and
++exclude any non-iOS tools, then run:
++```
++make all
++make install
++make testios
++```
+
-+ def test_non_str(self):
-+ # Non-string classes are not accepted.
-+ for obj in [b"", b"hello", None, 42]:
-+ with self.subTest(obj=obj):
-+ with self.assertRaisesRegex(
-+ TypeError,
-+ fr"write\(\) argument must be str, not "
-+ fr"{type(obj).__name__}"
-+ ):
-+ self.log.write(obj)
++This will:
+
-+ def test_byteslike_in_buffer(self):
-+ # The underlying buffer *can* accept bytes-like objects
-+ self.log.buffer.write(bytearray(b"hello"))
-+ self.log.flush()
++* Build an iOS framework for your chosen architecture;
++* Finalize the single-platform framework;
++* Make a clean copy of the testbed project;
++* Install the Python iOS framework into the copy of the testbed project; and
++* Run the test suite on an "entry-level device" simulator (i.e., an iPhone SE,
++ iPhone 16e, or a similar).
+
-+ self.log.buffer.write(b"")
-+ self.log.flush()
++On success, the test suite will exit and report successful completion of the
++test suite. On a 2022 M1 MacBook Pro, the test suite takes approximately 15
++minutes to run; a couple of extra minutes is required to compile the testbed
++project, and then boot and prepare the iOS simulator.
+
-+ self.log.buffer.write(b"goodbye")
-+ self.log.flush()
++### Debugging test failures
+
-+ self.assert_writes([b"hello", b"goodbye"])
++Running `python Apple test iOS` generates a standalone version of the
++`Apple/testbed` project, and runs the full test suite. It does this using
++`Apple/testbed` itself - the folder is an executable module that can be used
++to create and run a clone of the testbed project. The standalone version of the
++testbed will be created in a directory named
++`cross-build/iOS-testbed.`.
+
-+ def test_non_byteslike_in_buffer(self):
-+ for obj in ["hello", None, 42]:
-+ with self.subTest(obj=obj):
-+ with self.assertRaisesRegex(
-+ TypeError,
-+ fr"write\(\) argument must be bytes-like, not "
-+ fr"{type(obj).__name__}"
-+ ):
-+ self.log.buffer.write(obj)
-diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py
-index 253a6c119c9..1640193c798 100644
---- a/Lib/test/test_asyncio/test_events.py
-+++ b/Lib/test/test_asyncio/test_events.py
-@@ -1799,6 +1799,7 @@
- else:
- self.assertEqual(-signal.SIGKILL, returncode)
-
-+ @support.requires_subprocess()
- def test_subprocess_exec(self):
- prog = os.path.join(os.path.dirname(__file__), 'echo.py')
-
-@@ -1820,6 +1821,7 @@
- self.check_killed(proto.returncode)
- self.assertEqual(b'Python The Winner', proto.data[1])
-
-+ @support.requires_subprocess()
- def test_subprocess_interactive(self):
- prog = os.path.join(os.path.dirname(__file__), 'echo.py')
-
-@@ -1847,6 +1849,7 @@
- self.loop.run_until_complete(proto.completed)
- self.check_killed(proto.returncode)
-
-+ @support.requires_subprocess()
- def test_subprocess_shell(self):
- connect = self.loop.subprocess_shell(
- functools.partial(MySubprocessProtocol, self.loop),
-@@ -1863,6 +1866,7 @@
- self.assertEqual(proto.data[2], b'')
- transp.close()
-
-+ @support.requires_subprocess()
- def test_subprocess_exitcode(self):
- connect = self.loop.subprocess_shell(
- functools.partial(MySubprocessProtocol, self.loop),
-@@ -1874,6 +1878,7 @@
- self.assertEqual(7, proto.returncode)
- transp.close()
-
-+ @support.requires_subprocess()
- def test_subprocess_close_after_finish(self):
- connect = self.loop.subprocess_shell(
- functools.partial(MySubprocessProtocol, self.loop),
-@@ -1888,6 +1893,7 @@
- self.assertEqual(7, proto.returncode)
- self.assertIsNone(transp.close())
-
-+ @support.requires_subprocess()
- def test_subprocess_kill(self):
- prog = os.path.join(os.path.dirname(__file__), 'echo.py')
-
-@@ -1904,6 +1910,7 @@
- self.check_killed(proto.returncode)
- transp.close()
-
-+ @support.requires_subprocess()
- def test_subprocess_terminate(self):
- prog = os.path.join(os.path.dirname(__file__), 'echo.py')
-
-@@ -1921,6 +1928,7 @@
- transp.close()
-
- @unittest.skipIf(sys.platform == 'win32', "Don't have SIGHUP")
-+ @support.requires_subprocess()
- def test_subprocess_send_signal(self):
- # bpo-31034: Make sure that we get the default signal handler (killing
- # the process). The parent process may have decided to ignore SIGHUP,
-@@ -1945,6 +1953,7 @@
- finally:
- signal.signal(signal.SIGHUP, old_handler)
-
-+ @support.requires_subprocess()
- def test_subprocess_stderr(self):
- prog = os.path.join(os.path.dirname(__file__), 'echo2.py')
-
-@@ -1966,6 +1975,7 @@
- self.assertTrue(proto.data[2].startswith(b'ERR:test'), proto.data[2])
- self.assertEqual(0, proto.returncode)
-
-+ @support.requires_subprocess()
- def test_subprocess_stderr_redirect_to_stdout(self):
- prog = os.path.join(os.path.dirname(__file__), 'echo2.py')
-
-@@ -1991,6 +2001,7 @@
- transp.close()
- self.assertEqual(0, proto.returncode)
-
-+ @support.requires_subprocess()
- def test_subprocess_close_client_stream(self):
- prog = os.path.join(os.path.dirname(__file__), 'echo3.py')
-
-@@ -2025,6 +2036,7 @@
- self.loop.run_until_complete(proto.completed)
- self.check_killed(proto.returncode)
-
-+ @support.requires_subprocess()
- def test_subprocess_wait_no_same_group(self):
- # start the new process in a new session
- connect = self.loop.subprocess_shell(
-@@ -2037,6 +2049,7 @@
- self.assertEqual(7, proto.returncode)
- transp.close()
-
-+ @support.requires_subprocess()
- def test_subprocess_exec_invalid_args(self):
- async def connect(**kwds):
- await self.loop.subprocess_exec(
-@@ -2050,6 +2063,7 @@
- with self.assertRaises(ValueError):
- self.loop.run_until_complete(connect(shell=True))
-
-+ @support.requires_subprocess()
- def test_subprocess_shell_invalid_args(self):
-
- async def connect(cmd=None, **kwds):
-diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py
-index 994041c10f0..e2bc1a2617d 100644
---- a/Lib/test/test_asyncio/test_streams.py
-+++ b/Lib/test/test_asyncio/test_streams.py
-@@ -9,7 +9,7 @@
- import threading
- import unittest
- from unittest import mock
--from test.support import socket_helper
-+from test.support import requires_subprocess, socket_helper
- try:
- import ssl
- except ImportError:
-@@ -707,6 +707,7 @@
- self.assertEqual(messages, [])
-
- @unittest.skipIf(sys.platform == 'win32', "Don't have pipes")
-+ @requires_subprocess()
- def test_read_all_from_pipe_reader(self):
- # See asyncio issue 168. This test is derived from the example
- # subprocess_attach_read_pipe.py, but we configure the
-diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py
-index 7cd80fd68e3..8c7bf67d94e 100644
---- a/Lib/test/test_asyncio/test_subprocess.py
-+++ b/Lib/test/test_asyncio/test_subprocess.py
-@@ -39,6 +39,7 @@
- self._proc.pid = -1
-
-
-+@support.requires_subprocess()
- class SubprocessTransportTests(test_utils.TestCase):
- def setUp(self):
- super().setUp()
-@@ -104,6 +105,7 @@
- transport.close()
-
-
-+@support.requires_subprocess()
- class SubprocessMixin:
-
- def test_stdin_stdout(self):
-diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py
-index 01c1214c7f7..7e16e2a369d 100644
---- a/Lib/test/test_asyncio/test_unix_events.py
-+++ b/Lib/test/test_asyncio/test_unix_events.py
-@@ -315,11 +315,15 @@
- self.loop.run_until_complete(coro)
-
- def test_create_unix_server_existing_path_nonsock(self):
-- with tempfile.NamedTemporaryFile() as file:
-- coro = self.loop.create_unix_server(lambda: None, file.name)
-- with self.assertRaisesRegex(OSError,
-- 'Address.*is already in use'):
-- self.loop.run_until_complete(coro)
-+ path = test_utils.gen_unix_socket_path()
-+ self.addCleanup(os_helper.unlink, path)
-+ # create the file
-+ open(path, "wb").close()
++You can generate your own standalone testbed instance by running:
++```
++python cross-build/iOS/testbed clone my-testbed
++```
+
-+ coro = self.loop.create_unix_server(lambda: None, path)
-+ with self.assertRaisesRegex(OSError,
-+ 'Address.*is already in use'):
-+ self.loop.run_until_complete(coro)
-
- def test_create_unix_server_ssl_bool(self):
- coro = self.loop.create_unix_server(lambda: None, path='spam',
-diff --git a/Lib/test/test_asyncio/utils.py b/Lib/test/test_asyncio/utils.py
-index 0b9cde6878f..3f4c90e2ba6 100644
---- a/Lib/test/test_asyncio/utils.py
-+++ b/Lib/test/test_asyncio/utils.py
-@@ -11,7 +11,6 @@
- import socket
- import socketserver
- import sys
--import tempfile
- import threading
- import time
- import unittest
-@@ -34,7 +33,7 @@
- from asyncio import tasks
- from asyncio.log import logger
- from test import support
--from test.support import threading_helper
-+from test.support import threading_helper, socket_helper
-
-
- def data_file(filename):
-@@ -250,8 +249,7 @@
-
-
- def gen_unix_socket_path():
-- with tempfile.NamedTemporaryFile() as file:
-- return file.name
-+ return socket_helper.create_unix_domain_name()
-
-
- @contextlib.contextmanager
-diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py
-index ecd1e120ecb..3616b9957fb 100644
---- a/Lib/test/test_asyncore.py
-+++ b/Lib/test/test_asyncore.py
-@@ -9,6 +9,7 @@
- import threading
-
- from test import support
-+from test.support import is_apple_mobile
- from test.support import os_helper
- from test.support import socket_helper
- from test.support import threading_helper
-@@ -658,6 +659,7 @@
-
- @unittest.skipIf(sys.platform.startswith("sunos"),
- "OOB support is broken on Solaris")
-+ @unittest.skipIf(is_apple_mobile, "FIXME: edge case in removed test module")
- def test_handle_expt(self):
- # Make sure handle_expt is called on OOB data received.
- # Note: this might fail on some platforms as OOB data is
-diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py
-index e0feef7c653..eab88bc256b 100644
---- a/Lib/test/test_atexit.py
-+++ b/Lib/test/test_atexit.py
-@@ -1,6 +1,5 @@
- import atexit
- import os
--import sys
- import textwrap
- import unittest
- from test import support
-diff --git a/Lib/test/test_audit.py b/Lib/test/test_audit.py
-index 10a61c60b57..2eab0fd6cf1 100644
---- a/Lib/test/test_audit.py
-+++ b/Lib/test/test_audit.py
-@@ -18,6 +18,7 @@
- class AuditTest(unittest.TestCase):
- maxDiff = None
-
-+ @support.requires_subprocess()
- def do_test(self, *args):
- with subprocess.Popen(
- [sys.executable, "-X utf8", AUDIT_TESTS_PY, *args],
-@@ -31,6 +32,7 @@
- if p.returncode:
- self.fail("".join(p.stderr))
-
-+ @support.requires_subprocess()
- def run_python(self, *args):
- events = []
- with subprocess.Popen(
-diff --git a/Lib/test/test_c_locale_coercion.py b/Lib/test/test_c_locale_coercion.py
-index 71f934756e2..ca976abb853 100644
---- a/Lib/test/test_c_locale_coercion.py
-+++ b/Lib/test/test_c_locale_coercion.py
-@@ -403,6 +403,7 @@
- expected_warnings=[LEGACY_LOCALE_WARNING],
- coercion_expected=False)
-
-+ @support.requires_subprocess()
- def test_PYTHONCOERCECLOCALE_set_to_one(self):
- # skip the test if the LC_CTYPE locale is C or coerced
- old_loc = locale.setlocale(locale.LC_CTYPE, None)
-diff --git a/Lib/test/test_capi/test_misc.py b/Lib/test/test_capi/test_misc.py
-index 404a13a0bcc..ffe6053aeb8 100644
---- a/Lib/test/test_capi/test_misc.py
-+++ b/Lib/test/test_capi/test_misc.py
-@@ -791,6 +791,13 @@
- self.addCleanup(os.close, r)
- self.addCleanup(os.close, w)
-
-+ # Apple extensions must be distributed as frameworks. This requires
-+ # a specialist loader.
-+ if support.is_apple_mobile:
-+ loader = "AppleFrameworkLoader"
-+ else:
-+ loader = "ExtensionFileLoader"
++In this invocation, `my-testbed` is the name of the folder for the new
++testbed clone.
+
- script = textwrap.dedent(f"""
- import importlib.machinery
- import importlib.util
-@@ -798,7 +805,7 @@
-
- fullname = '_test_module_state_shared'
- origin = importlib.util.find_spec('_testmultiphase').origin
-- loader = importlib.machinery.ExtensionFileLoader(fullname, origin)
-+ loader = importlib.machinery.{loader}(fullname, origin)
- spec = importlib.util.spec_from_loader(fullname, loader)
- module = importlib.util.module_from_spec(spec)
- attr_id = str(id(module.Error)).encode()
-@@ -996,7 +1003,12 @@
- def setUp(self):
- fullname = '_testmultiphase_meth_state_access' # XXX
- origin = importlib.util.find_spec('_testmultiphase').origin
-- loader = importlib.machinery.ExtensionFileLoader(fullname, origin)
-+ # Apple extensions must be distributed as frameworks. This requires
-+ # a specialist loader.
-+ if support.is_apple_mobile:
-+ loader = importlib.machinery.AppleFrameworkLoader(fullname, origin)
-+ else:
-+ loader = importlib.machinery.ExtensionFileLoader(fullname, origin)
- spec = importlib.util.spec_from_loader(fullname, loader)
- module = importlib.util.module_from_spec(spec)
- loader.exec_module(module)
-diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py
-index 86bcafcf0e3..529d9fd61e7 100644
---- a/Lib/test/test_cmd_line_script.py
-+++ b/Lib/test/test_cmd_line_script.py
-@@ -14,8 +14,7 @@
-
- import textwrap
- from test import support
--from test.support import import_helper
--from test.support import os_helper
-+from test.support import import_helper, is_apple, os_helper
- from test.support.script_helper import (
- make_pkg, make_script, make_zip_pkg, make_zip_script,
- assert_python_ok, assert_python_failure, spawn_python, kill_python)
-@@ -554,11 +553,14 @@
- self.assertTrue(text[3].startswith('NameError'))
-
- def test_non_ascii(self):
-- # Mac OS X denies the creation of a file with an invalid UTF-8 name.
-+ # Apple platforms deny the creation of a file with an invalid UTF-8 name.
- # Windows allows creating a name with an arbitrary bytes name, but
- # Python cannot a undecodable bytes argument to a subprocess.
-- if (os_helper.TESTFN_UNDECODABLE
-- and sys.platform not in ('win32', 'darwin')):
-+ if (
-+ os_helper.TESTFN_UNDECODABLE
-+ and sys.platform not in {"win32"}
-+ and not is_apple
-+ ):
- name = os.fsdecode(os_helper.TESTFN_UNDECODABLE)
- elif os_helper.TESTFN_NONASCII:
- name = os_helper.TESTFN_NONASCII
-diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py
-index 6eae8c9cce3..0cac02e48c3 100644
---- a/Lib/test/test_concurrent_futures.py
-+++ b/Lib/test/test_concurrent_futures.py
-@@ -152,6 +152,7 @@
- executor_type = futures.ThreadPoolExecutor
-
-
-+@support.requires_subprocess()
- class ProcessPoolForkMixin(ExecutorMixin):
- executor_type = futures.ProcessPoolExecutor
- ctx = "fork"
-@@ -166,6 +167,7 @@
- return super().get_context()
-
-
-+@support.requires_subprocess()
- class ProcessPoolSpawnMixin(ExecutorMixin):
- executor_type = futures.ProcessPoolExecutor
- ctx = "spawn"
-@@ -178,6 +180,7 @@
- return super().get_context()
-
-
-+@support.requires_subprocess()
- class ProcessPoolForkserverMixin(ExecutorMixin):
- executor_type = futures.ProcessPoolExecutor
- ctx = "forkserver"
-diff --git a/Lib/test/test_distutils.py b/Lib/test/test_distutils.py
-index d82d2b64234..f82aca2a01e 100644
---- a/Lib/test/test_distutils.py
-+++ b/Lib/test/test_distutils.py
-@@ -14,6 +14,8 @@
-
- import distutils.tests
-
-+if support.is_apple_mobile:
-+ raise unittest.SkipTest("FIXME: Edge case of test loader")
-
- def load_tests(*_):
- # used by unittest
-diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py
-index ebd4ad91924..d20dbc457c4 100644
---- a/Lib/test/test_doctest.py
-+++ b/Lib/test/test_doctest.py
-@@ -4,7 +4,6 @@
-
- from test import support
- from test.support import import_helper
--from test.support import os_helper
- import doctest
- import functools
- import os
-@@ -14,7 +13,6 @@
- import importlib.util
- import unittest
- import tempfile
--import shutil
- import types
- import contextlib
-
-@@ -431,8 +429,9 @@
-
- """
-
--class test_DocTestFinder:
-- def basics(): r"""
-+if not support.is_apple_mobile:
-+ class test_DocTestFinder:
-+ def basics(): r"""
- Unit tests for the `DocTestFinder` class.
-
- DocTestFinder is used to extract DocTests from an object's docstring
-@@ -2759,7 +2758,8 @@
- hook.remove()
-
-
--def test_lineendings(): r"""
-+if not support.is_apple_mobile:
-+ def test_lineendings(): r"""
- *nix systems use \n line endings, while Windows systems use \r\n, and
- old Mac systems used \r, which Python still recognizes as a line ending. Python
- handles this using universal newline mode for reading files. Let's make
-@@ -2875,7 +2875,8 @@
- TestResults(failed=1, attempted=1)
- """
-
--def test_CLI(): r"""
-+if not support.is_apple_mobile:
-+ def test_CLI(): r"""
- The doctest module can be used to run doctests against an arbitrary file.
- These tests test this CLI functionality.
-
-diff --git a/Lib/test/test_doctest2.py b/Lib/test/test_doctest2.py
-index ab8a0696736..f7007919113 100644
---- a/Lib/test/test_doctest2.py
-+++ b/Lib/test/test_doctest2.py
-@@ -13,9 +13,12 @@
-
- import sys
- import unittest
-+from test import support
++If you've built your own XCframework, or you only want to test a single architecture,
++you can construct a standalone testbed instance by running:
++```
++python Apple/testbed clone --platform iOS --framework my-testbed
++```
+
- if sys.flags.optimize >= 2:
- raise unittest.SkipTest("Cannot test docstrings with -O2")
-
++The framework path can be the path path to a `Python.xcframework`, or the
++path to a folder that contains a single-platform `Python.framework`.
+
- class C(object):
- """Class C.
-
-diff --git a/Lib/test/test_dtrace.py b/Lib/test/test_dtrace.py
-index 8a436ad123b..4fa7571fe43 100644
---- a/Lib/test/test_dtrace.py
-+++ b/Lib/test/test_dtrace.py
-@@ -6,7 +6,7 @@
- import types
- import unittest
-
--from test.support import findfile
-+from test.support import findfile, requires_subprocess
-
-
- def abspath(filename):
-@@ -60,6 +60,7 @@
- command += ["-c", subcommand]
- return command
-
-+ @requires_subprocess()
- def trace(self, script_file, subcommand=None):
- command = self.generate_trace_command(script_file, subcommand)
- stdout, _ = subprocess.Popen(command,
-diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py
-index 8c343f37210..f13b5a1745b 100644
---- a/Lib/test/test_embed.py
-+++ b/Lib/test/test_embed.py
-@@ -72,6 +72,7 @@
- def tearDown(self):
- os.chdir(self.oldcwd)
-
-+ @support.requires_subprocess()
- def run_embedded_interpreter(self, *args, env=None,
- timeout=None, returncode=0, input=None,
- cwd=None):
-@@ -1421,6 +1422,7 @@
-
-
- class SetConfigTests(unittest.TestCase):
-+ @support.requires_subprocess()
- def test_set_config(self):
- # bpo-42260: Test _PyInterpreterState_SetConfig()
- cmd = [sys.executable, '-I', '-m', 'test._test_embed_set_config']
-diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py
-index e0f09e821da..4bbdbdd1519 100644
---- a/Lib/test/test_faulthandler.py
-+++ b/Lib/test/test_faulthandler.py
-@@ -401,6 +401,7 @@
- finally:
- sys.stderr = orig_stderr
-
-+ @support.requires_subprocess()
- def test_disabled_by_default(self):
- # By default, the module should be disabled
- code = "import faulthandler; print(faulthandler.is_enabled())"
-@@ -409,6 +410,7 @@
- output = subprocess.check_output(args)
- self.assertEqual(output.rstrip(), b"False")
-
-+ @support.requires_subprocess()
- def test_sys_xoptions(self):
- # Test python -X faulthandler
- code = "import faulthandler; print(faulthandler.is_enabled())"
-@@ -421,6 +423,7 @@
- output = subprocess.check_output(args, env=env)
- self.assertEqual(output.rstrip(), b"True")
-
-+ @support.requires_subprocess()
- def test_env_var(self):
- # empty env var
- code = "import faulthandler; print(faulthandler.is_enabled())"
-diff --git a/Lib/test/test_fcntl.py b/Lib/test/test_fcntl.py
-index 8e98256a62c..7681e829d8b 100644
---- a/Lib/test/test_fcntl.py
-+++ b/Lib/test/test_fcntl.py
-@@ -6,7 +6,7 @@
- import sys
- import unittest
- from multiprocessing import Process
--from test.support import verbose, cpython_only
-+from test.support import cpython_only, is_apple, requires_subprocess, verbose
- from test.support.import_helper import import_module
- from test.support.os_helper import TESTFN, unlink
-
-@@ -25,7 +25,7 @@
- start_len = "qq"
-
- if (sys.platform.startswith(('netbsd', 'freebsd', 'openbsd'))
-- or sys.platform == 'darwin'):
-+ or is_apple):
- if struct.calcsize('l') == 8:
- off_t = 'l'
- pid_t = 'i'
-@@ -156,6 +156,7 @@
- self.assertRaises(TypeError, fcntl.flock, 'spam', fcntl.LOCK_SH)
-
- @unittest.skipIf(platform.system() == "AIX", "AIX returns PermissionError")
-+ @requires_subprocess()
- def test_lockf_exclusive(self):
- self.f = open(TESTFN, 'wb+')
- cmd = fcntl.LOCK_EX | fcntl.LOCK_NB
-@@ -167,6 +168,7 @@
- self.assertEqual(p.exitcode, 0)
-
- @unittest.skipIf(platform.system() == "AIX", "AIX returns PermissionError")
-+ @requires_subprocess()
- def test_lockf_share(self):
- self.f = open(TESTFN, 'wb+')
- cmd = fcntl.LOCK_SH | fcntl.LOCK_NB
-diff --git a/Lib/test/test_file_eintr.py b/Lib/test/test_file_eintr.py
-index 01408d838a8..0386d4d774d 100644
---- a/Lib/test/test_file_eintr.py
-+++ b/Lib/test/test_file_eintr.py
-@@ -15,6 +15,7 @@
- import sys
- import time
- import unittest
-+from test import support
-
- # Test import all of the things we're about to try testing up front.
- import _io
-@@ -69,6 +70,7 @@
- self.fail('Error from IO process %s:\nSTDOUT:\n%sSTDERR:\n%s\n' %
- (why, stdout.decode(), stderr.decode()))
-
-+ @support.requires_subprocess()
- def _test_reading(self, data_to_write, read_and_verify_code):
- """Generic buffered read method test harness to validate EINTR behavior.
-
-diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py
-index 2f5cc06ca4b..822324cfe19 100644
---- a/Lib/test/test_ftplib.py
-+++ b/Lib/test/test_ftplib.py
-@@ -18,6 +18,7 @@
-
- from unittest import TestCase, skipUnless
- from test import support
-+from test.support import requires_subprocess
- from test.support import threading_helper
- from test.support import socket_helper
- from test.support import warnings_helper
-@@ -904,6 +905,7 @@
-
-
- @skipUnless(ssl, "SSL not available")
-+@requires_subprocess()
- class TestTLS_FTPClassMixin(TestFTPClass):
- """Repeat TestFTPClass tests starting the TLS layer for both control
- and data connections first.
-@@ -920,6 +922,7 @@
-
-
- @skipUnless(ssl, "SSL not available")
-+@requires_subprocess()
- class TestTLS_FTPClass(TestCase):
- """Specific TLS_FTP class tests."""
-
-diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
-index 6c28b2b677c..76ea55f14ad 100644
---- a/Lib/test/test_gc.py
-+++ b/Lib/test/test_gc.py
-@@ -1,1415 +1,270 @@
-+import os
- import unittest
--import unittest.mock
--from test.support import (verbose, refcount_test,
-- cpython_only)
--from test.support.import_helper import import_module
--from test.support.os_helper import temp_dir, TESTFN, unlink
--from test.support.script_helper import assert_python_ok, make_script
-+import random
-+from test import support
- from test.support import threading_helper
--
--import gc
--import sys
--import sysconfig
--import textwrap
--import threading
-+import _thread as thread
- import time
- import weakref
-
--try:
-- from _testcapi import with_tp_del
--except ImportError:
-- def with_tp_del(cls):
-- class C(object):
-- def __new__(cls, *args, **kwargs):
-- raise TypeError('requires _testcapi.with_tp_del')
-- return C
--
--try:
-- from _testcapi import ContainerNoGC
--except ImportError:
-- ContainerNoGC = None
--
--### Support code
--###############################################################################
--
--# Bug 1055820 has several tests of longstanding bugs involving weakrefs and
--# cyclic gc.
--
--# An instance of C1055820 has a self-loop, so becomes cyclic trash when
--# unreachable.
--class C1055820(object):
-- def __init__(self, i):
-- self.i = i
-- self.loop = self
--
--class GC_Detector(object):
-- # Create an instance I. Then gc hasn't happened again so long as
-- # I.gc_happened is false.
--
-- def __init__(self):
-- self.gc_happened = False
--
-- def it_happened(ignored):
-- self.gc_happened = True
--
-- # Create a piece of cyclic trash that triggers it_happened when
-- # gc collects it.
-- self.wr = weakref.ref(C1055820(666), it_happened)
--
--@with_tp_del
--class Uncollectable(object):
-- """Create a reference cycle with multiple __del__ methods.
--
-- An object in a reference cycle will never have zero references,
-- and so must be garbage collected. If one or more objects in the
-- cycle have __del__ methods, the gc refuses to guess an order,
-- and leaves the cycle uncollected."""
-- def __init__(self, partner=None):
-- if partner is None:
-- self.partner = Uncollectable(partner=self)
-- else:
-- self.partner = partner
-- def __tp_del__(self):
-- pass
--
--if sysconfig.get_config_vars().get('PY_CFLAGS', ''):
-- BUILD_WITH_NDEBUG = ('-DNDEBUG' in sysconfig.get_config_vars()['PY_CFLAGS'])
--else:
-- # Usually, sys.gettotalrefcount() is only present if Python has been
-- # compiled in debug mode. If it's missing, expect that Python has
-- # been released in release mode: with NDEBUG defined.
-- BUILD_WITH_NDEBUG = (not hasattr(sys, 'gettotalrefcount'))
--
--### Tests
--###############################################################################
--
--class GCTests(unittest.TestCase):
-- def test_list(self):
-- l = []
-- l.append(l)
-- gc.collect()
-- del l
-- self.assertEqual(gc.collect(), 1)
--
-- def test_dict(self):
-- d = {}
-- d[1] = d
-- gc.collect()
-- del d
-- self.assertEqual(gc.collect(), 1)
--
-- def test_tuple(self):
-- # since tuples are immutable we close the loop with a list
-- l = []
-- t = (l,)
-- l.append(t)
-- gc.collect()
-- del t
-- del l
-- self.assertEqual(gc.collect(), 2)
--
-- def test_class(self):
-- class A:
-- pass
-- A.a = A
-- gc.collect()
-- del A
-- self.assertNotEqual(gc.collect(), 0)
--
-- def test_newstyleclass(self):
-- class A(object):
-- pass
-- gc.collect()
-- del A
-- self.assertNotEqual(gc.collect(), 0)
--
-- def test_instance(self):
-- class A:
-- pass
-- a = A()
-- a.a = a
-- gc.collect()
-- del a
-- self.assertNotEqual(gc.collect(), 0)
--
-- def test_newinstance(self):
-- class A(object):
-- pass
-- a = A()
-- a.a = a
-- gc.collect()
-- del a
-- self.assertNotEqual(gc.collect(), 0)
-- class B(list):
-- pass
-- class C(B, A):
-- pass
-- a = C()
-- a.a = a
-- gc.collect()
-- del a
-- self.assertNotEqual(gc.collect(), 0)
-- del B, C
-- self.assertNotEqual(gc.collect(), 0)
-- A.a = A()
-- del A
-- self.assertNotEqual(gc.collect(), 0)
-- self.assertEqual(gc.collect(), 0)
--
-- def test_method(self):
-- # Tricky: self.__init__ is a bound method, it references the instance.
-- class A:
-- def __init__(self):
-- self.init = self.__init__
-- a = A()
-- gc.collect()
-- del a
-- self.assertNotEqual(gc.collect(), 0)
--
-- @cpython_only
-- def test_legacy_finalizer(self):
-- # A() is uncollectable if it is part of a cycle, make sure it shows up
-- # in gc.garbage.
-- @with_tp_del
-- class A:
-- def __tp_del__(self): pass
-- class B:
-- pass
-- a = A()
-- a.a = a
-- id_a = id(a)
-- b = B()
-- b.b = b
-- gc.collect()
-- del a
-- del b
-- self.assertNotEqual(gc.collect(), 0)
-- for obj in gc.garbage:
-- if id(obj) == id_a:
-- del obj.a
-- break
-- else:
-- self.fail("didn't find obj in garbage (finalizer)")
-- gc.garbage.remove(obj)
--
-- @cpython_only
-- def test_legacy_finalizer_newclass(self):
-- # A() is uncollectable if it is part of a cycle, make sure it shows up
-- # in gc.garbage.
-- @with_tp_del
-- class A(object):
-- def __tp_del__(self): pass
-- class B(object):
-- pass
-- a = A()
-- a.a = a
-- id_a = id(a)
-- b = B()
-- b.b = b
-- gc.collect()
-- del a
-- del b
-- self.assertNotEqual(gc.collect(), 0)
-- for obj in gc.garbage:
-- if id(obj) == id_a:
-- del obj.a
-- break
-- else:
-- self.fail("didn't find obj in garbage (finalizer)")
-- gc.garbage.remove(obj)
--
-- def test_function(self):
-- # Tricky: f -> d -> f, code should call d.clear() after the exec to
-- # break the cycle.
-- d = {}
-- exec("def f(): pass\n", d)
-- gc.collect()
-- del d
-- self.assertEqual(gc.collect(), 2)
--
-- @refcount_test
-- def test_frame(self):
-- def f():
-- frame = sys._getframe()
-- gc.collect()
-- f()
-- self.assertEqual(gc.collect(), 1)
--
-- def test_saveall(self):
-- # Verify that cyclic garbage like lists show up in gc.garbage if the
-- # SAVEALL option is enabled.
--
-- # First make sure we don't save away other stuff that just happens to
-- # be waiting for collection.
-- gc.collect()
-- # if this fails, someone else created immortal trash
-- self.assertEqual(gc.garbage, [])
--
-- L = []
-- L.append(L)
-- id_L = id(L)
-+from test import lock_tests
-
-- debug = gc.get_debug()
-- gc.set_debug(debug | gc.DEBUG_SAVEALL)
-- del L
-- gc.collect()
-- gc.set_debug(debug)
-+NUMTASKS = 10
-+NUMTRIPS = 3
-+POLL_SLEEP = 0.010 # seconds = 10 ms
-
-- self.assertEqual(len(gc.garbage), 1)
-- obj = gc.garbage.pop()
-- self.assertEqual(id(obj), id_L)
-+_print_mutex = thread.allocate_lock()
-
-- def test_del(self):
-- # __del__ methods can trigger collection, make this to happen
-- thresholds = gc.get_threshold()
-- gc.enable()
-- gc.set_threshold(1)
-+def verbose_print(arg):
-+ """Helper function for printing out debugging output."""
-+ if support.verbose:
-+ with _print_mutex:
-+ print(arg)
-
-- class A:
-- def __del__(self):
-- dir(self)
-- a = A()
-- del a
-
-- gc.disable()
-- gc.set_threshold(*thresholds)
-+class BasicThreadTest(unittest.TestCase):
-
-- def test_del_newclass(self):
-- # __del__ methods can trigger collection, make this to happen
-- thresholds = gc.get_threshold()
-- gc.enable()
-- gc.set_threshold(1)
--
-- class A(object):
-- def __del__(self):
-- dir(self)
-- a = A()
-- del a
--
-- gc.disable()
-- gc.set_threshold(*thresholds)
--
-- # The following two tests are fragile:
-- # They precisely count the number of allocations,
-- # which is highly implementation-dependent.
-- # For example, disposed tuples are not freed, but reused.
-- # To minimize variations, though, we first store the get_count() results
-- # and check them at the end.
-- @refcount_test
-- def test_get_count(self):
-- gc.collect()
-- a, b, c = gc.get_count()
-- x = []
-- d, e, f = gc.get_count()
-- self.assertEqual((b, c), (0, 0))
-- self.assertEqual((e, f), (0, 0))
-- # This is less fragile than asserting that a equals 0.
-- self.assertLess(a, 5)
-- # Between the two calls to get_count(), at least one object was
-- # created (the list).
-- self.assertGreater(d, a)
--
-- @refcount_test
-- def test_collect_generations(self):
-- gc.collect()
-- # This object will "trickle" into generation N + 1 after
-- # each call to collect(N)
-- x = []
-- gc.collect(0)
-- # x is now in gen 1
-- a, b, c = gc.get_count()
-- gc.collect(1)
-- # x is now in gen 2
-- d, e, f = gc.get_count()
-- gc.collect(2)
-- # x is now in gen 3
-- g, h, i = gc.get_count()
-- # We don't check a, d, g since their exact values depends on
-- # internal implementation details of the interpreter.
-- self.assertEqual((b, c), (1, 0))
-- self.assertEqual((e, f), (0, 1))
-- self.assertEqual((h, i), (0, 0))
--
-- def test_trashcan(self):
-- class Ouch:
-- n = 0
-- def __del__(self):
-- Ouch.n = Ouch.n + 1
-- if Ouch.n % 17 == 0:
-- gc.collect()
-+ def setUp(self):
-+ self.done_mutex = thread.allocate_lock()
-+ self.done_mutex.acquire()
-+ self.running_mutex = thread.allocate_lock()
-+ self.random_mutex = thread.allocate_lock()
-+ self.created = 0
-+ self.running = 0
-+ self.next_ident = 0
-+
-+ key = threading_helper.threading_setup()
-+ self.addCleanup(threading_helper.threading_cleanup, *key)
-+
-+
-+class ThreadRunningTests(BasicThreadTest):
-+
-+ def newtask(self):
-+ with self.running_mutex:
-+ self.next_ident += 1
-+ verbose_print("creating task %s" % self.next_ident)
-+ thread.start_new_thread(self.task, (self.next_ident,))
-+ self.created += 1
-+ self.running += 1
-+
-+ def task(self, ident):
-+ with self.random_mutex:
-+ delay = random.random() / 10000.0
-+ verbose_print("task %s will run for %sus" % (ident, round(delay*1e6)))
-+ time.sleep(delay)
-+ verbose_print("task %s done" % ident)
-+ with self.running_mutex:
-+ self.running -= 1
-+ if self.created == NUMTASKS and self.running == 0:
-+ self.done_mutex.release()
-+
-+ def test_starting_threads(self):
-+ with threading_helper.wait_threads_exit():
-+ # Basic test for thread creation.
-+ for i in range(NUMTASKS):
-+ self.newtask()
-+ verbose_print("waiting for tasks to complete...")
-+ self.done_mutex.acquire()
-+ verbose_print("all tasks done")
-+
-+ def test_stack_size(self):
-+ # Various stack size tests.
-+ self.assertEqual(thread.stack_size(), 0, "initial stack size is not 0")
-+
-+ thread.stack_size(0)
-+ self.assertEqual(thread.stack_size(), 0, "stack_size not reset to default")
-+
-+ @unittest.skipIf(os.name not in ("nt", "posix"), 'test meant for nt and posix')
-+ def test_nt_and_posix_stack_size(self):
-+ try:
-+ thread.stack_size(4096)
-+ except ValueError:
-+ verbose_print("caught expected ValueError setting "
-+ "stack_size(4096)")
-+ except thread.error:
-+ self.skipTest("platform does not support changing thread stack "
-+ "size")
-+
-+ fail_msg = "stack_size(%d) failed - should succeed"
-+ for tss in (262144, 0x100000, 0):
-+ thread.stack_size(tss)
-+ self.assertEqual(thread.stack_size(), tss, fail_msg % tss)
-+ verbose_print("successfully set stack_size(%d)" % tss)
-+
-+ for tss in (262144, 0x100000):
-+ verbose_print("trying stack_size = (%d)" % tss)
-+ self.next_ident = 0
-+ self.created = 0
-+ with threading_helper.wait_threads_exit():
-+ for i in range(NUMTASKS):
-+ self.newtask()
-+
-+ verbose_print("waiting for all tasks to complete")
-+ self.done_mutex.acquire()
-+ verbose_print("all tasks done")
-+
-+ thread.stack_size(0)
-+
-+ def test__count(self):
-+ # Test the _count() function.
-+ orig = thread._count()
-+ mut = thread.allocate_lock()
-+ mut.acquire()
-+ started = []
-+
-+ def task():
-+ started.append(None)
-+ mut.acquire()
-+ mut.release()
-+
-+ with threading_helper.wait_threads_exit():
-+ thread.start_new_thread(task, ())
-+ while not started:
-+ time.sleep(POLL_SLEEP)
-+ self.assertEqual(thread._count(), orig + 1)
-+ # Allow the task to finish.
-+ mut.release()
-+ # The only reliable way to be sure that the thread ended from the
-+ # interpreter's point of view is to wait for the function object to be
-+ # destroyed.
-+ done = []
-+ wr = weakref.ref(task, lambda _: done.append(None))
-+ del task
-+ while not done:
-+ time.sleep(POLL_SLEEP)
-+ support.gc_collect() # For PyPy or other GCs.
-+ self.assertEqual(thread._count(), orig)
-+
-+ def test_unraisable_exception(self):
-+ def task():
-+ started.release()
-+ raise ValueError("task failed")
-+
-+ started = thread.allocate_lock()
-+ with support.catch_unraisable_exception() as cm:
-+ with threading_helper.wait_threads_exit():
-+ started.acquire()
-+ thread.start_new_thread(task, ())
-+ started.acquire()
-+
-+ self.assertEqual(str(cm.unraisable.exc_value), "task failed")
-+ self.assertIs(cm.unraisable.object, task)
-+ self.assertEqual(cm.unraisable.err_msg,
-+ "Exception ignored in thread started by")
-+ self.assertIsNotNone(cm.unraisable.exc_traceback)
-+
-+
-+class Barrier:
-+ def __init__(self, num_threads):
-+ self.num_threads = num_threads
-+ self.waiting = 0
-+ self.checkin_mutex = thread.allocate_lock()
-+ self.checkout_mutex = thread.allocate_lock()
-+ self.checkout_mutex.acquire()
-+
-+ def enter(self):
-+ self.checkin_mutex.acquire()
-+ self.waiting = self.waiting + 1
-+ if self.waiting == self.num_threads:
-+ self.waiting = self.num_threads - 1
-+ self.checkout_mutex.release()
-+ return
-+ self.checkin_mutex.release()
-+
-+ self.checkout_mutex.acquire()
-+ self.waiting = self.waiting - 1
-+ if self.waiting == 0:
-+ self.checkin_mutex.release()
-+ return
-+ self.checkout_mutex.release()
-+
-+
-+class BarrierTest(BasicThreadTest):
-+
-+ def test_barrier(self):
-+ with threading_helper.wait_threads_exit():
-+ self.bar = Barrier(NUMTASKS)
-+ self.running = NUMTASKS
-+ for i in range(NUMTASKS):
-+ thread.start_new_thread(self.task2, (i,))
-+ verbose_print("waiting for tasks to end")
-+ self.done_mutex.acquire()
-+ verbose_print("tasks done")
-+
-+ def task2(self, ident):
-+ for i in range(NUMTRIPS):
-+ if ident == 0:
-+ # give it a good chance to enter the next
-+ # barrier before the others are all out
-+ # of the current one
-+ delay = 0
-+ else:
-+ with self.random_mutex:
-+ delay = random.random() / 10000.0
-+ verbose_print("task %s will run for %sus" %
-+ (ident, round(delay * 1e6)))
-+ time.sleep(delay)
-+ verbose_print("task %s entering %s" % (ident, i))
-+ self.bar.enter()
-+ verbose_print("task %s leaving barrier" % ident)
-+ with self.running_mutex:
-+ self.running -= 1
-+ # Must release mutex before releasing done, else the main thread can
-+ # exit and set mutex to None as part of global teardown; then
-+ # mutex.release() raises AttributeError.
-+ finished = self.running == 0
-+ if finished:
-+ self.done_mutex.release()
-+
-+class LockTests(lock_tests.LockTests):
-+ locktype = thread.allocate_lock
-+
-+
-+class TestForkInThread(unittest.TestCase):
-+ def setUp(self):
-+ self.read_fd, self.write_fd = os.pipe()
-
-- # "trashcan" is a hack to prevent stack overflow when deallocating
-- # very deeply nested tuples etc. It works in part by abusing the
-- # type pointer and refcount fields, and that can yield horrible
-- # problems when gc tries to traverse the structures.
-- # If this test fails (as it does in 2.0, 2.1 and 2.2), it will
-- # most likely die via segfault.
-+ @unittest.skipUnless(hasattr(os, 'fork'), 'need os.fork')
-+ @support.requires_fork()
-+ @threading_helper.reap_threads
-+ def test_forkinthread(self):
-+ pid = None
-
-- # Note: In 2.3 the possibility for compiling without cyclic gc was
-- # removed, and that in turn allows the trashcan mechanism to work
-- # via much simpler means (e.g., it never abuses the type pointer or
-- # refcount fields anymore). Since it's much less likely to cause a
-- # problem now, the various constants in this expensive (we force a lot
-- # of full collections) test are cut back from the 2.2 version.
-- gc.enable()
-- N = 150
-- for count in range(2):
-- t = []
-- for i in range(N):
-- t = [t, Ouch()]
-- u = []
-- for i in range(N):
-- u = [u, Ouch()]
-- v = {}
-- for i in range(N):
-- v = {1: v, 2: Ouch()}
-- gc.disable()
-+ def fork_thread(read_fd, write_fd):
-+ nonlocal pid
-
-- def test_trashcan_threads(self):
-- # Issue #13992: trashcan mechanism should be thread-safe
-- NESTING = 60
-- N_THREADS = 2
-+ # fork in a thread
-+ pid = os.fork()
-+ if pid:
-+ # parent process
-+ return
-
-- def sleeper_gen():
-- """A generator that releases the GIL when closed or dealloc'ed."""
-+ # child process
- try:
-- yield
-+ os.close(read_fd)
-+ os.write(write_fd, b"OK")
- finally:
-- time.sleep(0.000001)
--
-- class C(list):
-- # Appending to a list is atomic, which avoids the use of a lock.
-- inits = []
-- dels = []
-- def __init__(self, alist):
-- self[:] = alist
-- C.inits.append(None)
-- def __del__(self):
-- # This __del__ is called by subtype_dealloc().
-- C.dels.append(None)
-- # `g` will release the GIL when garbage-collected. This
-- # helps assert subtype_dealloc's behaviour when threads
-- # switch in the middle of it.
-- g = sleeper_gen()
-- next(g)
-- # Now that __del__ is finished, subtype_dealloc will proceed
-- # to call list_dealloc, which also uses the trashcan mechanism.
-+ os._exit(0)
-
-- def make_nested():
-- """Create a sufficiently nested container object so that the
-- trashcan mechanism is invoked when deallocating it."""
-- x = C([])
-- for i in range(NESTING):
-- x = [C([x])]
-- del x
-+ with threading_helper.wait_threads_exit():
-+ thread.start_new_thread(fork_thread, (self.read_fd, self.write_fd))
-+ self.assertEqual(os.read(self.read_fd, 2), b"OK")
-+ os.close(self.write_fd)
-
-- def run_thread():
-- """Exercise make_nested() in a loop."""
-- while not exit:
-- make_nested()
-+ self.assertIsNotNone(pid)
-+ support.wait_process(pid, exitcode=0)
-
-- old_switchinterval = sys.getswitchinterval()
-- sys.setswitchinterval(1e-5)
-+ def tearDown(self):
- try:
-- exit = []
-- threads = []
-- for i in range(N_THREADS):
-- t = threading.Thread(target=run_thread)
-- threads.append(t)
-- with threading_helper.start_threads(threads, lambda: exit.append(1)):
-- time.sleep(1.0)
-- finally:
-- sys.setswitchinterval(old_switchinterval)
-- gc.collect()
-- self.assertEqual(len(C.inits), len(C.dels))
--
-- def test_boom(self):
-- class Boom:
-- def __getattr__(self, someattribute):
-- del self.attr
-- raise AttributeError
--
-- a = Boom()
-- b = Boom()
-- a.attr = b
-- b.attr = a
--
-- gc.collect()
-- garbagelen = len(gc.garbage)
-- del a, b
-- # a<->b are in a trash cycle now. Collection will invoke
-- # Boom.__getattr__ (to see whether a and b have __del__ methods), and
-- # __getattr__ deletes the internal "attr" attributes as a side effect.
-- # That causes the trash cycle to get reclaimed via refcounts falling to
-- # 0, thus mutating the trash graph as a side effect of merely asking
-- # whether __del__ exists. This used to (before 2.3b1) crash Python.
-- # Now __getattr__ isn't called.
-- self.assertEqual(gc.collect(), 4)
-- self.assertEqual(len(gc.garbage), garbagelen)
--
-- def test_boom2(self):
-- class Boom2:
-- def __init__(self):
-- self.x = 0
--
-- def __getattr__(self, someattribute):
-- self.x += 1
-- if self.x > 1:
-- del self.attr
-- raise AttributeError
--
-- a = Boom2()
-- b = Boom2()
-- a.attr = b
-- b.attr = a
--
-- gc.collect()
-- garbagelen = len(gc.garbage)
-- del a, b
-- # Much like test_boom(), except that __getattr__ doesn't break the
-- # cycle until the second time gc checks for __del__. As of 2.3b1,
-- # there isn't a second time, so this simply cleans up the trash cycle.
-- # We expect a, b, a.__dict__ and b.__dict__ (4 objects) to get
-- # reclaimed this way.
-- self.assertEqual(gc.collect(), 4)
-- self.assertEqual(len(gc.garbage), garbagelen)
--
-- def test_boom_new(self):
-- # boom__new and boom2_new are exactly like boom and boom2, except use
-- # new-style classes.
--
-- class Boom_New(object):
-- def __getattr__(self, someattribute):
-- del self.attr
-- raise AttributeError
--
-- a = Boom_New()
-- b = Boom_New()
-- a.attr = b
-- b.attr = a
--
-- gc.collect()
-- garbagelen = len(gc.garbage)
-- del a, b
-- self.assertEqual(gc.collect(), 4)
-- self.assertEqual(len(gc.garbage), garbagelen)
--
-- def test_boom2_new(self):
-- class Boom2_New(object):
-- def __init__(self):
-- self.x = 0
--
-- def __getattr__(self, someattribute):
-- self.x += 1
-- if self.x > 1:
-- del self.attr
-- raise AttributeError
--
-- a = Boom2_New()
-- b = Boom2_New()
-- a.attr = b
-- b.attr = a
--
-- gc.collect()
-- garbagelen = len(gc.garbage)
-- del a, b
-- self.assertEqual(gc.collect(), 4)
-- self.assertEqual(len(gc.garbage), garbagelen)
--
-- def test_get_referents(self):
-- alist = [1, 3, 5]
-- got = gc.get_referents(alist)
-- got.sort()
-- self.assertEqual(got, alist)
--
-- atuple = tuple(alist)
-- got = gc.get_referents(atuple)
-- got.sort()
-- self.assertEqual(got, alist)
--
-- adict = {1: 3, 5: 7}
-- expected = [1, 3, 5, 7]
-- got = gc.get_referents(adict)
-- got.sort()
-- self.assertEqual(got, expected)
--
-- got = gc.get_referents([1, 2], {3: 4}, (0, 0, 0))
-- got.sort()
-- self.assertEqual(got, [0, 0] + list(range(5)))
--
-- self.assertEqual(gc.get_referents(1, 'a', 4j), [])
--
-- def test_is_tracked(self):
-- # Atomic built-in types are not tracked, user-defined objects and
-- # mutable containers are.
-- # NOTE: types with special optimizations (e.g. tuple) have tests
-- # in their own test files instead.
-- self.assertFalse(gc.is_tracked(None))
-- self.assertFalse(gc.is_tracked(1))
-- self.assertFalse(gc.is_tracked(1.0))
-- self.assertFalse(gc.is_tracked(1.0 + 5.0j))
-- self.assertFalse(gc.is_tracked(True))
-- self.assertFalse(gc.is_tracked(False))
-- self.assertFalse(gc.is_tracked(b"a"))
-- self.assertFalse(gc.is_tracked("a"))
-- self.assertFalse(gc.is_tracked(bytearray(b"a")))
-- self.assertFalse(gc.is_tracked(type))
-- self.assertFalse(gc.is_tracked(int))
-- self.assertFalse(gc.is_tracked(object))
-- self.assertFalse(gc.is_tracked(object()))
--
-- class UserClass:
-- pass
--
-- class UserInt(int):
-- pass
--
-- # Base class is object; no extra fields.
-- class UserClassSlots:
-- __slots__ = ()
--
-- # Base class is fixed size larger than object; no extra fields.
-- class UserFloatSlots(float):
-- __slots__ = ()
--
-- # Base class is variable size; no extra fields.
-- class UserIntSlots(int):
-- __slots__ = ()
--
-- self.assertTrue(gc.is_tracked(gc))
-- self.assertTrue(gc.is_tracked(UserClass))
-- self.assertTrue(gc.is_tracked(UserClass()))
-- self.assertTrue(gc.is_tracked(UserInt()))
-- self.assertTrue(gc.is_tracked([]))
-- self.assertTrue(gc.is_tracked(set()))
-- self.assertTrue(gc.is_tracked(UserClassSlots()))
-- self.assertTrue(gc.is_tracked(UserFloatSlots()))
-- self.assertTrue(gc.is_tracked(UserIntSlots()))
--
-- def test_is_finalized(self):
-- # Objects not tracked by the always gc return false
-- self.assertFalse(gc.is_finalized(3))
--
-- storage = []
-- class Lazarus:
-- def __del__(self):
-- storage.append(self)
--
-- lazarus = Lazarus()
-- self.assertFalse(gc.is_finalized(lazarus))
--
-- del lazarus
-- gc.collect()
--
-- lazarus = storage.pop()
-- self.assertTrue(gc.is_finalized(lazarus))
--
-- def test_bug1055820b(self):
-- # Corresponds to temp2b.py in the bug report.
--
-- ouch = []
-- def callback(ignored):
-- ouch[:] = [wr() for wr in WRs]
--
-- Cs = [C1055820(i) for i in range(2)]
-- WRs = [weakref.ref(c, callback) for c in Cs]
-- c = None
--
-- gc.collect()
-- self.assertEqual(len(ouch), 0)
-- # Make the two instances trash, and collect again. The bug was that
-- # the callback materialized a strong reference to an instance, but gc
-- # cleared the instance's dict anyway.
-- Cs = None
-- gc.collect()
-- self.assertEqual(len(ouch), 2) # else the callbacks didn't run
-- for x in ouch:
-- # If the callback resurrected one of these guys, the instance
-- # would be damaged, with an empty __dict__.
-- self.assertEqual(x, None)
--
-- def test_bug21435(self):
-- # This is a poor test - its only virtue is that it happened to
-- # segfault on Tim's Windows box before the patch for 21435 was
-- # applied. That's a nasty bug relying on specific pieces of cyclic
-- # trash appearing in exactly the right order in finalize_garbage()'s
-- # input list.
-- # But there's no reliable way to force that order from Python code,
-- # so over time chances are good this test won't really be testing much
-- # of anything anymore. Still, if it blows up, there's _some_
-- # problem ;-)
-- gc.collect()
--
-- class A:
-+ os.close(self.read_fd)
-+ except OSError:
- pass
-
-- class B:
-- def __init__(self, x):
-- self.x = x
--
-- def __del__(self):
-- self.attr = None
--
-- def do_work():
-- a = A()
-- b = B(A())
--
-- a.attr = b
-- b.attr = a
--
-- do_work()
-- gc.collect() # this blows up (bad C pointer) when it fails
--
-- @cpython_only
-- def test_garbage_at_shutdown(self):
-- import subprocess
-- code = """if 1:
-- import gc
-- import _testcapi
-- @_testcapi.with_tp_del
-- class X:
-- def __init__(self, name):
-- self.name = name
-- def __repr__(self):
-- return "" %% self.name
-- def __tp_del__(self):
-- pass
--
-- x = X('first')
-- x.x = x
-- x.y = X('second')
-- del x
-- gc.set_debug(%s)
-- """
-- def run_command(code):
-- p = subprocess.Popen([sys.executable, "-Wd", "-c", code],
-- stdout=subprocess.PIPE,
-- stderr=subprocess.PIPE)
-- stdout, stderr = p.communicate()
-- p.stdout.close()
-- p.stderr.close()
-- self.assertEqual(p.returncode, 0)
-- self.assertEqual(stdout, b"")
-- return stderr
--
-- stderr = run_command(code % "0")
-- self.assertIn(b"ResourceWarning: gc: 2 uncollectable objects at "
-- b"shutdown; use", stderr)
-- self.assertNotIn(b"", stderr)
-- # With DEBUG_UNCOLLECTABLE, the garbage list gets printed
-- stderr = run_command(code % "gc.DEBUG_UNCOLLECTABLE")
-- self.assertIn(b"ResourceWarning: gc: 2 uncollectable objects at "
-- b"shutdown", stderr)
-- self.assertTrue(
-- (b"[, ]" in stderr) or
-- (b"[, ]" in stderr), stderr)
-- # With DEBUG_SAVEALL, no additional message should get printed
-- # (because gc.garbage also contains normally reclaimable cyclic
-- # references, and its elements get printed at runtime anyway).
-- stderr = run_command(code % "gc.DEBUG_SAVEALL")
-- self.assertNotIn(b"uncollectable objects at shutdown", stderr)
--
-- def test_gc_main_module_at_shutdown(self):
-- # Create a reference cycle through the __main__ module and check
-- # it gets collected at interpreter shutdown.
-- code = """if 1:
-- class C:
-- def __del__(self):
-- print('__del__ called')
-- l = [C()]
-- l.append(l)
-- """
-- rc, out, err = assert_python_ok('-c', code)
-- self.assertEqual(out.strip(), b'__del__ called')
--
-- def test_gc_ordinary_module_at_shutdown(self):
-- # Same as above, but with a non-__main__ module.
-- with temp_dir() as script_dir:
-- module = """if 1:
-- class C:
-- def __del__(self):
-- print('__del__ called')
-- l = [C()]
-- l.append(l)
-- """
-- code = """if 1:
-- import sys
-- sys.path.insert(0, %r)
-- import gctest
-- """ % (script_dir,)
-- make_script(script_dir, 'gctest', module)
-- rc, out, err = assert_python_ok('-c', code)
-- self.assertEqual(out.strip(), b'__del__ called')
--
-- def test_global_del_SystemExit(self):
-- code = """if 1:
-- class ClassWithDel:
-- def __del__(self):
-- print('__del__ called')
-- a = ClassWithDel()
-- a.link = a
-- raise SystemExit(0)"""
-- self.addCleanup(unlink, TESTFN)
-- with open(TESTFN, 'w', encoding="utf-8") as script:
-- script.write(code)
-- rc, out, err = assert_python_ok(TESTFN)
-- self.assertEqual(out.strip(), b'__del__ called')
--
-- def test_get_stats(self):
-- stats = gc.get_stats()
-- self.assertEqual(len(stats), 3)
-- for st in stats:
-- self.assertIsInstance(st, dict)
-- self.assertEqual(set(st),
-- {"collected", "collections", "uncollectable"})
-- self.assertGreaterEqual(st["collected"], 0)
-- self.assertGreaterEqual(st["collections"], 0)
-- self.assertGreaterEqual(st["uncollectable"], 0)
-- # Check that collection counts are incremented correctly
-- if gc.isenabled():
-- self.addCleanup(gc.enable)
-- gc.disable()
-- old = gc.get_stats()
-- gc.collect(0)
-- new = gc.get_stats()
-- self.assertEqual(new[0]["collections"], old[0]["collections"] + 1)
-- self.assertEqual(new[1]["collections"], old[1]["collections"])
-- self.assertEqual(new[2]["collections"], old[2]["collections"])
-- gc.collect(2)
-- new = gc.get_stats()
-- self.assertEqual(new[0]["collections"], old[0]["collections"] + 1)
-- self.assertEqual(new[1]["collections"], old[1]["collections"])
-- self.assertEqual(new[2]["collections"], old[2]["collections"] + 1)
--
-- def test_freeze(self):
-- gc.freeze()
-- self.assertGreater(gc.get_freeze_count(), 0)
-- gc.unfreeze()
-- self.assertEqual(gc.get_freeze_count(), 0)
--
-- def test_get_objects(self):
-- gc.collect()
-- l = []
-- l.append(l)
-- self.assertTrue(
-- any(l is element for element in gc.get_objects(generation=0))
-- )
-- self.assertFalse(
-- any(l is element for element in gc.get_objects(generation=1))
-- )
-- self.assertFalse(
-- any(l is element for element in gc.get_objects(generation=2))
-- )
-- gc.collect(generation=0)
-- self.assertFalse(
-- any(l is element for element in gc.get_objects(generation=0))
-- )
-- self.assertTrue(
-- any(l is element for element in gc.get_objects(generation=1))
-- )
-- self.assertFalse(
-- any(l is element for element in gc.get_objects(generation=2))
-- )
-- gc.collect(generation=1)
-- self.assertFalse(
-- any(l is element for element in gc.get_objects(generation=0))
-- )
-- self.assertFalse(
-- any(l is element for element in gc.get_objects(generation=1))
-- )
-- self.assertTrue(
-- any(l is element for element in gc.get_objects(generation=2))
-- )
-- gc.collect(generation=2)
-- self.assertFalse(
-- any(l is element for element in gc.get_objects(generation=0))
-- )
-- self.assertFalse(
-- any(l is element for element in gc.get_objects(generation=1))
-- )
-- self.assertTrue(
-- any(l is element for element in gc.get_objects(generation=2))
-- )
-- del l
-- gc.collect()
--
-- def test_get_objects_arguments(self):
-- gc.collect()
-- self.assertEqual(len(gc.get_objects()),
-- len(gc.get_objects(generation=None)))
--
-- self.assertRaises(ValueError, gc.get_objects, 1000)
-- self.assertRaises(ValueError, gc.get_objects, -1000)
-- self.assertRaises(TypeError, gc.get_objects, "1")
-- self.assertRaises(TypeError, gc.get_objects, 1.234)
--
-- def test_resurrection_only_happens_once_per_object(self):
-- class A: # simple self-loop
-- def __init__(self):
-- self.me = self
--
-- class Lazarus(A):
-- resurrected = 0
-- resurrected_instances = []
--
-- def __del__(self):
-- Lazarus.resurrected += 1
-- Lazarus.resurrected_instances.append(self)
--
-- gc.collect()
-- gc.disable()
--
-- # We start with 0 resurrections
-- laz = Lazarus()
-- self.assertEqual(Lazarus.resurrected, 0)
--
-- # Deleting the instance and triggering a collection
-- # resurrects the object
-- del laz
-- gc.collect()
-- self.assertEqual(Lazarus.resurrected, 1)
-- self.assertEqual(len(Lazarus.resurrected_instances), 1)
--
-- # Clearing the references and forcing a collection
-- # should not resurrect the object again.
-- Lazarus.resurrected_instances.clear()
-- self.assertEqual(Lazarus.resurrected, 1)
-- gc.collect()
-- self.assertEqual(Lazarus.resurrected, 1)
--
-- gc.enable()
--
-- def test_resurrection_is_transitive(self):
-- class Cargo:
-- def __init__(self):
-- self.me = self
--
-- class Lazarus:
-- resurrected_instances = []
--
-- def __del__(self):
-- Lazarus.resurrected_instances.append(self)
--
-- gc.collect()
-- gc.disable()
--
-- laz = Lazarus()
-- cargo = Cargo()
-- cargo_id = id(cargo)
--
-- # Create a cycle between cargo and laz
-- laz.cargo = cargo
-- cargo.laz = laz
--
-- # Drop the references, force a collection and check that
-- # everything was resurrected.
-- del laz, cargo
-- gc.collect()
-- self.assertEqual(len(Lazarus.resurrected_instances), 1)
-- instance = Lazarus.resurrected_instances.pop()
-- self.assertTrue(hasattr(instance, "cargo"))
-- self.assertEqual(id(instance.cargo), cargo_id)
--
-- gc.collect()
-- gc.enable()
--
-- def test_resurrection_does_not_block_cleanup_of_other_objects(self):
--
-- # When a finalizer resurrects objects, stats were reporting them as
-- # having been collected. This affected both collect()'s return
-- # value and the dicts returned by get_stats().
-- N = 100
--
-- class A: # simple self-loop
-- def __init__(self):
-- self.me = self
--
-- class Z(A): # resurrecting __del__
-- def __del__(self):
-- zs.append(self)
--
-- zs = []
--
-- def getstats():
-- d = gc.get_stats()[-1]
-- return d['collected'], d['uncollectable']
--
-- gc.collect()
-- gc.disable()
--
-- # No problems if just collecting A() instances.
-- oldc, oldnc = getstats()
-- for i in range(N):
-- A()
-- t = gc.collect()
-- c, nc = getstats()
-- self.assertEqual(t, 2*N) # instance object & its dict
-- self.assertEqual(c - oldc, 2*N)
-- self.assertEqual(nc - oldnc, 0)
--
-- # But Z() is not actually collected.
-- oldc, oldnc = c, nc
-- Z()
-- # Nothing is collected - Z() is merely resurrected.
-- t = gc.collect()
-- c, nc = getstats()
-- self.assertEqual(t, 0)
-- self.assertEqual(c - oldc, 0)
-- self.assertEqual(nc - oldnc, 0)
--
-- # Z() should not prevent anything else from being collected.
-- oldc, oldnc = c, nc
-- for i in range(N):
-- A()
-- Z()
-- t = gc.collect()
-- c, nc = getstats()
-- self.assertEqual(t, 2*N)
-- self.assertEqual(c - oldc, 2*N)
-- self.assertEqual(nc - oldnc, 0)
--
-- # The A() trash should have been reclaimed already but the
-- # 2 copies of Z are still in zs (and the associated dicts).
-- oldc, oldnc = c, nc
-- zs.clear()
-- t = gc.collect()
-- c, nc = getstats()
-- self.assertEqual(t, 4)
-- self.assertEqual(c - oldc, 4)
-- self.assertEqual(nc - oldnc, 0)
--
-- gc.enable()
--
-- @unittest.skipIf(ContainerNoGC is None,
-- 'requires ContainerNoGC extension type')
-- def test_trash_weakref_clear(self):
-- # Test that trash weakrefs are properly cleared (bpo-38006).
-- #
-- # Structure we are creating:
-- #
-- # Z <- Y <- A--+--> WZ -> C
-- # ^ |
-- # +--+
-- # where:
-- # WZ is a weakref to Z with callback C
-- # Y doesn't implement tp_traverse
-- # A contains a reference to itself, Y and WZ
-- #
-- # A, Y, Z, WZ are all trash. The GC doesn't know that Z is trash
-- # because Y does not implement tp_traverse. To show the bug, WZ needs
-- # to live long enough so that Z is deallocated before it. Then, if
-- # gcmodule is buggy, when Z is being deallocated, C will run.
-- #
-- # To ensure WZ lives long enough, we put it in a second reference
-- # cycle. That trick only works due to the ordering of the GC prev/next
-- # linked lists. So, this test is a bit fragile.
-- #
-- # The bug reported in bpo-38006 is caused because the GC did not
-- # clear WZ before starting the process of calling tp_clear on the
-- # trash. Normally, handle_weakrefs() would find the weakref via Z and
-- # clear it. However, since the GC cannot find Z, WR is not cleared and
-- # it can execute during delete_garbage(). That can lead to disaster
-- # since the callback might tinker with objects that have already had
-- # tp_clear called on them (leaving them in possibly invalid states).
--
-- callback = unittest.mock.Mock()
--
-- class A:
-- __slots__ = ['a', 'y', 'wz']
--
-- class Z:
-+ try:
-+ os.close(self.write_fd)
-+ except OSError:
- pass
-
-- # setup required object graph, as described above
-- a = A()
-- a.a = a
-- a.y = ContainerNoGC(Z())
-- a.wz = weakref.ref(a.y.value, callback)
-- # create second cycle to keep WZ alive longer
-- wr_cycle = [a.wz]
-- wr_cycle.append(wr_cycle)
-- # ensure trash unrelated to this test is gone
-- gc.collect()
-- gc.disable()
-- # release references and create trash
-- del a, wr_cycle
-- gc.collect()
-- # if called, it means there is a bug in the GC. The weakref should be
-- # cleared before Z dies.
-- callback.assert_not_called()
-- gc.enable()
--
--
--class GCCallbackTests(unittest.TestCase):
-- def setUp(self):
-- # Save gc state and disable it.
-- self.enabled = gc.isenabled()
-- gc.disable()
-- self.debug = gc.get_debug()
-- gc.set_debug(0)
-- gc.callbacks.append(self.cb1)
-- gc.callbacks.append(self.cb2)
-- self.othergarbage = []
--
-- def tearDown(self):
-- # Restore gc state
-- del self.visit
-- gc.callbacks.remove(self.cb1)
-- gc.callbacks.remove(self.cb2)
-- gc.set_debug(self.debug)
-- if self.enabled:
-- gc.enable()
-- # destroy any uncollectables
-- gc.collect()
-- for obj in gc.garbage:
-- if isinstance(obj, Uncollectable):
-- obj.partner = None
-- del gc.garbage[:]
-- del self.othergarbage
-- gc.collect()
--
-- def preclean(self):
-- # Remove all fluff from the system. Invoke this function
-- # manually rather than through self.setUp() for maximum
-- # safety.
-- self.visit = []
-- gc.collect()
-- garbage, gc.garbage[:] = gc.garbage[:], []
-- self.othergarbage.append(garbage)
-- self.visit = []
--
-- def cb1(self, phase, info):
-- self.visit.append((1, phase, dict(info)))
--
-- def cb2(self, phase, info):
-- self.visit.append((2, phase, dict(info)))
-- if phase == "stop" and hasattr(self, "cleanup"):
-- # Clean Uncollectable from garbage
-- uc = [e for e in gc.garbage if isinstance(e, Uncollectable)]
-- gc.garbage[:] = [e for e in gc.garbage
-- if not isinstance(e, Uncollectable)]
-- for e in uc:
-- e.partner = None
--
-- def test_collect(self):
-- self.preclean()
-- gc.collect()
-- # Algorithmically verify the contents of self.visit
-- # because it is long and tortuous.
--
-- # Count the number of visits to each callback
-- n = [v[0] for v in self.visit]
-- n1 = [i for i in n if i == 1]
-- n2 = [i for i in n if i == 2]
-- self.assertEqual(n1, [1]*2)
-- self.assertEqual(n2, [2]*2)
--
-- # Count that we got the right number of start and stop callbacks.
-- n = [v[1] for v in self.visit]
-- n1 = [i for i in n if i == "start"]
-- n2 = [i for i in n if i == "stop"]
-- self.assertEqual(n1, ["start"]*2)
-- self.assertEqual(n2, ["stop"]*2)
--
-- # Check that we got the right info dict for all callbacks
-- for v in self.visit:
-- info = v[2]
-- self.assertTrue("generation" in info)
-- self.assertTrue("collected" in info)
-- self.assertTrue("uncollectable" in info)
--
-- def test_collect_generation(self):
-- self.preclean()
-- gc.collect(2)
-- for v in self.visit:
-- info = v[2]
-- self.assertEqual(info["generation"], 2)
--
-- @cpython_only
-- def test_collect_garbage(self):
-- self.preclean()
-- # Each of these cause four objects to be garbage: Two
-- # Uncollectables and their instance dicts.
-- Uncollectable()
-- Uncollectable()
-- C1055820(666)
-- gc.collect()
-- for v in self.visit:
-- if v[1] != "stop":
-- continue
-- info = v[2]
-- self.assertEqual(info["collected"], 2)
-- self.assertEqual(info["uncollectable"], 8)
--
-- # We should now have the Uncollectables in gc.garbage
-- self.assertEqual(len(gc.garbage), 4)
-- for e in gc.garbage:
-- self.assertIsInstance(e, Uncollectable)
--
-- # Now, let our callback handle the Uncollectable instances
-- self.cleanup=True
-- self.visit = []
-- gc.garbage[:] = []
-- gc.collect()
-- for v in self.visit:
-- if v[1] != "stop":
-- continue
-- info = v[2]
-- self.assertEqual(info["collected"], 0)
-- self.assertEqual(info["uncollectable"], 4)
--
-- # Uncollectables should be gone
-- self.assertEqual(len(gc.garbage), 0)
--
--
-- @unittest.skipIf(BUILD_WITH_NDEBUG,
-- 'built with -NDEBUG')
-- def test_refcount_errors(self):
-- self.preclean()
-- # Verify the "handling" of objects with broken refcounts
--
-- # Skip the test if ctypes is not available
-- import_module("ctypes")
--
-- import subprocess
-- code = textwrap.dedent('''
-- from test.support import gc_collect, SuppressCrashReport
--
-- a = [1, 2, 3]
-- b = [a]
--
-- # Avoid coredump when Py_FatalError() calls abort()
-- SuppressCrashReport().__enter__()
--
-- # Simulate the refcount of "a" being too low (compared to the
-- # references held on it by live data), but keeping it above zero
-- # (to avoid deallocating it):
-- import ctypes
-- ctypes.pythonapi.Py_DecRef(ctypes.py_object(a))
--
-- # The garbage collector should now have a fatal error
-- # when it reaches the broken object
-- gc_collect()
-- ''')
-- p = subprocess.Popen([sys.executable, "-c", code],
-- stdout=subprocess.PIPE,
-- stderr=subprocess.PIPE)
-- stdout, stderr = p.communicate()
-- p.stdout.close()
-- p.stderr.close()
-- # Verify that stderr has a useful error message:
-- self.assertRegex(stderr,
-- br'gcmodule\.c:[0-9]+: gc_decref: Assertion "gc_get_refs\(g\) > 0" failed.')
-- self.assertRegex(stderr,
-- br'refcount is too small')
-- # "address : 0x7fb5062efc18"
-- # "address : 7FB5062EFC18"
-- address_regex = br'[0-9a-fA-Fx]+'
-- self.assertRegex(stderr,
-- br'object address : ' + address_regex)
-- self.assertRegex(stderr,
-- br'object refcount : 1')
-- self.assertRegex(stderr,
-- br'object type : ' + address_regex)
-- self.assertRegex(stderr,
-- br'object type name: list')
-- self.assertRegex(stderr,
-- br'object repr : \[1, 2, 3\]')
--
--
--class GCTogglingTests(unittest.TestCase):
-- def setUp(self):
-- gc.enable()
--
-- def tearDown(self):
-- gc.disable()
--
-- def test_bug1055820c(self):
-- # Corresponds to temp2c.py in the bug report. This is pretty
-- # elaborate.
--
-- c0 = C1055820(0)
-- # Move c0 into generation 2.
-- gc.collect()
--
-- c1 = C1055820(1)
-- c1.keep_c0_alive = c0
-- del c0.loop # now only c1 keeps c0 alive
--
-- c2 = C1055820(2)
-- c2wr = weakref.ref(c2) # no callback!
--
-- ouch = []
-- def callback(ignored):
-- ouch[:] = [c2wr()]
--
-- # The callback gets associated with a wr on an object in generation 2.
-- c0wr = weakref.ref(c0, callback)
--
-- c0 = c1 = c2 = None
--
-- # What we've set up: c0, c1, and c2 are all trash now. c0 is in
-- # generation 2. The only thing keeping it alive is that c1 points to
-- # it. c1 and c2 are in generation 0, and are in self-loops. There's a
-- # global weakref to c2 (c2wr), but that weakref has no callback.
-- # There's also a global weakref to c0 (c0wr), and that does have a
-- # callback, and that callback references c2 via c2wr().
-- #
-- # c0 has a wr with callback, which references c2wr
-- # ^
-- # |
-- # | Generation 2 above dots
-- #. . . . . . . .|. . . . . . . . . . . . . . . . . . . . . . . .
-- # | Generation 0 below dots
-- # |
-- # |
-- # ^->c1 ^->c2 has a wr but no callback
-- # | | | |
-- # <--v <--v
-- #
-- # So this is the nightmare: when generation 0 gets collected, we see
-- # that c2 has a callback-free weakref, and c1 doesn't even have a
-- # weakref. Collecting generation 0 doesn't see c0 at all, and c0 is
-- # the only object that has a weakref with a callback. gc clears c1
-- # and c2. Clearing c1 has the side effect of dropping the refcount on
-- # c0 to 0, so c0 goes away (despite that it's in an older generation)
-- # and c0's wr callback triggers. That in turn materializes a reference
-- # to c2 via c2wr(), but c2 gets cleared anyway by gc.
--
-- # We want to let gc happen "naturally", to preserve the distinction
-- # between generations.
-- junk = []
-- i = 0
-- detector = GC_Detector()
-- while not detector.gc_happened:
-- i += 1
-- if i > 10000:
-- self.fail("gc didn't happen after 10000 iterations")
-- self.assertEqual(len(ouch), 0)
-- junk.append([]) # this will eventually trigger gc
--
-- self.assertEqual(len(ouch), 1) # else the callback wasn't invoked
-- for x in ouch:
-- # If the callback resurrected c2, the instance would be damaged,
-- # with an empty __dict__.
-- self.assertEqual(x, None)
--
-- def test_bug1055820d(self):
-- # Corresponds to temp2d.py in the bug report. This is very much like
-- # test_bug1055820c, but uses a __del__ method instead of a weakref
-- # callback to sneak in a resurrection of cyclic trash.
--
-- ouch = []
-- class D(C1055820):
-- def __del__(self):
-- ouch[:] = [c2wr()]
--
-- d0 = D(0)
-- # Move all the above into generation 2.
-- gc.collect()
--
-- c1 = C1055820(1)
-- c1.keep_d0_alive = d0
-- del d0.loop # now only c1 keeps d0 alive
--
-- c2 = C1055820(2)
-- c2wr = weakref.ref(c2) # no callback!
--
-- d0 = c1 = c2 = None
--
-- # What we've set up: d0, c1, and c2 are all trash now. d0 is in
-- # generation 2. The only thing keeping it alive is that c1 points to
-- # it. c1 and c2 are in generation 0, and are in self-loops. There's
-- # a global weakref to c2 (c2wr), but that weakref has no callback.
-- # There are no other weakrefs.
-- #
-- # d0 has a __del__ method that references c2wr
-- # ^
-- # |
-- # | Generation 2 above dots
-- #. . . . . . . .|. . . . . . . . . . . . . . . . . . . . . . . .
-- # | Generation 0 below dots
-- # |
-- # |
-- # ^->c1 ^->c2 has a wr but no callback
-- # | | | |
-- # <--v <--v
-- #
-- # So this is the nightmare: when generation 0 gets collected, we see
-- # that c2 has a callback-free weakref, and c1 doesn't even have a
-- # weakref. Collecting generation 0 doesn't see d0 at all. gc clears
-- # c1 and c2. Clearing c1 has the side effect of dropping the refcount
-- # on d0 to 0, so d0 goes away (despite that it's in an older
-- # generation) and d0's __del__ triggers. That in turn materializes
-- # a reference to c2 via c2wr(), but c2 gets cleared anyway by gc.
--
-- # We want to let gc happen "naturally", to preserve the distinction
-- # between generations.
-- detector = GC_Detector()
-- junk = []
-- i = 0
-- while not detector.gc_happened:
-- i += 1
-- if i > 10000:
-- self.fail("gc didn't happen after 10000 iterations")
-- self.assertEqual(len(ouch), 0)
-- junk.append([]) # this will eventually trigger gc
--
-- self.assertEqual(len(ouch), 1) # else __del__ wasn't invoked
-- for x in ouch:
-- # If __del__ resurrected c2, the instance would be damaged, with an
-- # empty __dict__.
-- self.assertEqual(x, None)
--
--
--class PythonFinalizationTests(unittest.TestCase):
-- def test_ast_fini(self):
-- # bpo-44184: Regression test for subtype_dealloc() when deallocating
-- # an AST instance also destroy its AST type: subtype_dealloc() must
-- # not access the type memory after deallocating the instance, since
-- # the type memory can be freed as well. The test is also related to
-- # _PyAST_Fini() which clears references to AST types.
-- code = textwrap.dedent("""
-- import ast
-- import codecs
--
-- # Small AST tree to keep their AST types alive
-- tree = ast.parse("def f(x, y): return 2*x-y")
-- x = [tree]
-- x.append(x)
--
-- # Put the cycle somewhere to survive until the last GC collection.
-- # Codec search functions are only cleared at the end of
-- # interpreter_clear().
-- def search_func(encoding):
-- return None
-- search_func.a = x
-- codecs.register(search_func)
-- """)
-- assert_python_ok("-c", code)
--
--
--def setUpModule():
-- global enabled, debug
-- enabled = gc.isenabled()
-- gc.disable()
-- assert not gc.isenabled()
-- debug = gc.get_debug()
-- gc.set_debug(debug & ~gc.DEBUG_LEAK) # this test is supposed to leak
-- gc.collect() # Delete 2nd generation garbage
--
--
--def tearDownModule():
-- gc.set_debug(debug)
-- # test gc.enable() even if GC is disabled by default
-- if verbose:
-- print("restoring automatic collection")
-- # make sure to always test gc.enable()
-- gc.enable()
-- assert gc.isenabled()
-- if not enabled:
-- gc.disable()
--
-
- if __name__ == "__main__":
- unittest.main()
-diff --git a/Lib/test/test_genericpath.py b/Lib/test/test_genericpath.py
-index 1ff7f75ad3e..116391493d4 100644
---- a/Lib/test/test_genericpath.py
-+++ b/Lib/test/test_genericpath.py
-@@ -7,8 +7,9 @@
- import sys
- import unittest
- import warnings
--from test.support import os_helper
--from test.support import warnings_helper
-+from test.support import (
-+ is_apple, os_helper, warnings_helper
-+)
- from test.support.script_helper import assert_python_ok
- from test.support.os_helper import FakePath
-
-@@ -475,12 +476,14 @@
- self.assertIsInstance(abspath(path), str)
-
- def test_nonascii_abspath(self):
-- if (os_helper.TESTFN_UNDECODABLE
-- # Mac OS X denies the creation of a directory with an invalid
-- # UTF-8 name. Windows allows creating a directory with an
-- # arbitrary bytes name, but fails to enter this directory
-- # (when the bytes name is used).
-- and sys.platform not in ('win32', 'darwin')):
-+ if (
-+ os_helper.TESTFN_UNDECODABLE
-+ # Apple platforms deny the creation of a
-+ # directory with an invalid UTF-8 name. Windows allows creating a
-+ # directory with an arbitrary bytes name, but fails to enter this
-+ # directory (when the bytes name is used).
-+ and sys.platform not in {"win32"} and not is_apple
-+ ):
- name = os_helper.TESTFN_UNDECODABLE
- elif os_helper.TESTFN_NONASCII:
- name = os_helper.TESTFN_NONASCII
-diff --git a/Lib/test/test_getpass.py b/Lib/test/test_getpass.py
-index 3452e46213a..3519f2f9837 100644
---- a/Lib/test/test_getpass.py
-+++ b/Lib/test/test_getpass.py
-@@ -22,6 +22,8 @@
- environ.get.return_value = expected_name
- self.assertEqual(expected_name, getpass.getuser())
-
-+ @unittest.skipIf(support.is_apple_mobile,
-+ "FIXME: getpwuid implementation not complete on simulator")
- def test_username_priorities_of_env_values(self, environ):
- environ.get.return_value = None
- try:
-diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py
-index f86e767ac0e..14434981e95 100644
---- a/Lib/test/test_gzip.py
-+++ b/Lib/test/test_gzip.py
-@@ -12,6 +12,7 @@
- from subprocess import PIPE, Popen
- from test.support import import_helper
- from test.support import os_helper
-+from test.support import requires_subprocess
- from test.support import _4G, bigmemtest
- from test.support.script_helper import assert_python_ok, assert_python_failure
-
-@@ -752,6 +753,7 @@
- class TestCommandLine(unittest.TestCase):
- data = b'This is a simple test with gzip'
-
-+ @requires_subprocess()
- def test_decompress_stdin_stdout(self):
- with io.BytesIO() as bytes_io:
- with gzip.GzipFile(fileobj=bytes_io, mode='wb') as gzip_file:
-@@ -787,6 +789,7 @@
- self.assertEqual(rc, 1)
- self.assertEqual(out, b'')
-
-+ @requires_subprocess()
- @create_and_remove_directory(TEMPDIR)
- def test_compress_stdin_outfile(self):
- args = sys.executable, '-m', 'gzip'
-diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py
-index 10a50fe97ec..ae51668668c 100644
---- a/Lib/test/test_httpservers.py
-+++ b/Lib/test/test_httpservers.py
-@@ -30,8 +30,9 @@
-
- import unittest
- from test import support
--from test.support import os_helper
--from test.support import threading_helper
-+from test.support import (
-+ is_apple, os_helper, requires_subprocess, threading_helper
-+)
-
-
- class NoLogRequestHandler:
-@@ -388,8 +389,8 @@
- reader.close()
- return body
-
-- @unittest.skipIf(sys.platform == 'darwin',
-- 'undecodable name cannot always be decoded on macOS')
-+ @unittest.skipIf(is_apple,
-+ 'undecodable name cannot always be decoded on Apple platforms')
- @unittest.skipIf(sys.platform == 'win32',
- 'undecodable name cannot be decoded on win32')
- @unittest.skipUnless(os_helper.TESTFN_UNDECODABLE,
-@@ -400,11 +401,11 @@
- with open(os.path.join(self.tempdir, filename), 'wb') as f:
- f.write(os_helper.TESTFN_UNDECODABLE)
- response = self.request(self.base_url + '/')
-- if sys.platform == 'darwin':
-- # On Mac OS the HFS+ filesystem replaces bytes that aren't valid
-- # UTF-8 into a percent-encoded value.
-+ if is_apple:
-+ # On Apple platforms the HFS+ filesystem replaces bytes that
-+ # aren't valid UTF-8 into a percent-encoded value.
- for name in os.listdir(self.tempdir):
-- if name != 'test': # Ignore a filename created in setUp().
-+ if name != 'test': # Ignore a filename created in setUp().
- filename = name
- break
- body = self.check_status_and_reason(response, HTTPStatus.OK)
-@@ -670,6 +671,7 @@
-
- @unittest.skipIf(hasattr(os, 'geteuid') and os.geteuid() == 0,
- "This test can't be run reliably as root (issue #13308).")
-+@requires_subprocess()
- class CGIHTTPServerTestCase(BaseTestCase):
- class request_handler(NoLogRequestHandler, CGIHTTPRequestHandler):
- pass
-diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py
-index 21fec2ad960..c1cecb42f99 100644
---- a/Lib/test/test_imp.py
-+++ b/Lib/test/test_imp.py
-@@ -9,6 +9,7 @@
- from test.support import import_helper
- from test.support import os_helper
- from test.support import script_helper
-+from test.support import is_apple_mobile
- import unittest
- import warnings
- with warnings.catch_warnings():
-@@ -225,6 +226,7 @@
- self.assertIsNot(orig_getenv, new_os.getenv)
-
- @requires_load_dynamic
-+ @unittest.skipIf(is_apple_mobile, "FIXME: edge case of module loader")
- def test_issue15828_load_extensions(self):
- # Issue 15828 picked up that the adapter between the old imp API
- # and importlib couldn't handle C extensions
-@@ -237,6 +239,7 @@
- self.assertEqual(mod.__name__, example)
-
- @requires_load_dynamic
-+ @unittest.skipIf(is_apple_mobile, "FIXME: edge case of module loader")
- def test_issue16421_multiple_modules_in_one_dll(self):
- # Issue 16421: loading several modules from the same compiled file fails
- m = '_testimportmultiple'
-@@ -264,6 +267,7 @@
- self.assertEqual(name, err.exception.name)
-
- @requires_load_dynamic
-+ @unittest.skipIf(is_apple_mobile, "FIXME: edge case of module loader")
- def test_load_module_extension_file_is_None(self):
- # When loading an extension module and the file is None, open one
- # on the behalf of imp.load_dynamic().
-@@ -277,6 +281,7 @@
- imp.load_module(name, None, *found[1:])
-
- @requires_load_dynamic
-+ @unittest.skipIf(is_apple_mobile, "FIXME: edge case of module loader")
- def test_issue24748_load_module_skips_sys_modules_check(self):
- name = 'test.imp_dummy'
- try:
-diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py
-index 97447619b90..9abe0e0b7c0 100644
---- a/Lib/test/test_import/__init__.py
-+++ b/Lib/test/test_import/__init__.py
-@@ -19,7 +19,7 @@
- from unittest import mock
-
- from test.support import os_helper
--from test.support import (is_jython, swap_attr, swap_item, cpython_only)
-+from test.support import (is_apple_mobile, is_jython, swap_attr, swap_item, cpython_only)
- from test.support.import_helper import (
- forget, make_legacy_pyc, unlink, unload, DirsOnSysPath)
- from test.support.os_helper import (
-@@ -93,6 +93,8 @@
- self.assertRegex(str(cm.exception), r"cannot import name 'i_dont_exist' from 'os' \(.*os.py\)")
-
- @cpython_only
-+ @unittest.skipIf(is_apple_mobile,
-+ "FIXME: edge case in loader")
- def test_from_import_missing_attr_has_name_and_so_path(self):
- import _testcapi
- with self.assertRaises(ImportError) as cm:
-diff --git a/Lib/test/test_importlib/extension/test_finder.py b/Lib/test/test_importlib/extension/test_finder.py
-index e8065d7dade..d3e180db5eb 100644
---- a/Lib/test/test_importlib/extension/test_finder.py
-+++ b/Lib/test/test_importlib/extension/test_finder.py
-@@ -1,5 +1,5 @@
--from .. import abc
--from .. import util
-+from test.support import is_apple_mobile
-+from test.test_importlib import abc, util
-
- machinery = util.import_importlib('importlib.machinery')
-
-@@ -12,9 +12,27 @@
- """Test the finder for extension modules."""
-
- def find_spec(self, fullname):
-- importer = self.machinery.FileFinder(util.EXTENSIONS.path,
-- (self.machinery.ExtensionFileLoader,
-- self.machinery.EXTENSION_SUFFIXES))
-+ if is_apple_mobile:
-+ # Apple mobile platforms require a specialist loader that uses
-+ # .fwork files as placeholders for the true `.so` files.
-+ loaders = [
-+ (
-+ self.machinery.AppleFrameworkLoader,
-+ [
-+ ext.replace(".so", ".fwork")
-+ for ext in self.machinery.EXTENSION_SUFFIXES
-+ ]
-+ )
-+ ]
-+ else:
-+ loaders = [
-+ (
-+ self.machinery.ExtensionFileLoader,
-+ self.machinery.EXTENSION_SUFFIXES
-+ )
-+ ]
-+
-+ importer = self.machinery.FileFinder(util.EXTENSIONS.path, *loaders)
-
- return importer.find_spec(fullname)
-
-diff --git a/Lib/test/test_importlib/extension/test_loader.py b/Lib/test/test_importlib/extension/test_loader.py
-index 8fd556dbed5..36d9ba9f078 100644
---- a/Lib/test/test_importlib/extension/test_loader.py
-+++ b/Lib/test/test_importlib/extension/test_loader.py
-@@ -1,3 +1,4 @@
-+from test.support import is_apple_mobile
- from warnings import catch_warnings
- from .. import abc
- from .. import util
-@@ -18,8 +19,15 @@
- """Test load_module() for extension modules."""
-
- def setUp(self):
-- self.loader = self.machinery.ExtensionFileLoader(util.EXTENSIONS.name,
-- util.EXTENSIONS.file_path)
-+
-+ # Apple extensions must be distributed as frameworks. This requires
-+ # a specialist loader.
-+ if is_apple_mobile:
-+ self.LoaderClass = self.machinery.AppleFrameworkLoader
-+ else:
-+ self.LoaderClass = self.machinery.ExtensionFileLoader
-+
-+ self.loader = self.LoaderClass(util.EXTENSIONS.name, util.EXTENSIONS.file_path)
-
- def load_module(self, fullname):
- with warnings.catch_warnings():
-@@ -36,13 +44,11 @@
- self.load_module('XXX')
-
- def test_equality(self):
-- other = self.machinery.ExtensionFileLoader(util.EXTENSIONS.name,
-- util.EXTENSIONS.file_path)
-+ other = self.LoaderClass(util.EXTENSIONS.name, util.EXTENSIONS.file_path)
- self.assertEqual(self.loader, other)
-
- def test_inequality(self):
-- other = self.machinery.ExtensionFileLoader('_' + util.EXTENSIONS.name,
-- util.EXTENSIONS.file_path)
-+ other = self.LoaderClass('_' + util.EXTENSIONS.name, util.EXTENSIONS.file_path)
- self.assertNotEqual(self.loader, other)
-
- def test_module(self):
-@@ -53,8 +59,7 @@
- ('__package__', '')]:
- self.assertEqual(getattr(module, attr), value)
- self.assertIn(util.EXTENSIONS.name, sys.modules)
-- self.assertIsInstance(module.__loader__,
-- self.machinery.ExtensionFileLoader)
-+ self.assertIsInstance(module.__loader__, self.LoaderClass)
-
- # No extension module as __init__ available for testing.
- test_package = None
-@@ -81,7 +86,7 @@
- self.assertFalse(self.loader.is_package(util.EXTENSIONS.name))
- for suffix in self.machinery.EXTENSION_SUFFIXES:
- path = os.path.join('some', 'path', 'pkg', '__init__' + suffix)
-- loader = self.machinery.ExtensionFileLoader('pkg', path)
-+ loader = self.LoaderClass('pkg', path)
- self.assertTrue(loader.is_package('pkg'))
-
- (Frozen_LoaderTests,
-@@ -92,12 +97,19 @@
- # Test loading extension modules with multi-phase initialization (PEP 489).
-
- def setUp(self):
-+
-+ # Apple extensions must be distributed as frameworks. This requires
-+ # a specialist loader.
-+ if is_apple_mobile:
-+ self.LoaderClass = self.machinery.AppleFrameworkLoader
-+ else:
-+ self.LoaderClass = self.machinery.ExtensionFileLoader
-+
- self.name = '_testmultiphase'
- finder = self.machinery.FileFinder(None)
- self.spec = importlib.util.find_spec(self.name)
- assert self.spec
-- self.loader = self.machinery.ExtensionFileLoader(
-- self.name, self.spec.origin)
-+ self.loader = self.LoaderClass(self.name, self.spec.origin)
-
- def load_module(self):
- # Load the module from the test extension.
-@@ -108,7 +120,7 @@
- def load_module_by_name(self, fullname):
- # Load a module from the test extension by name.
- origin = self.spec.origin
-- loader = self.machinery.ExtensionFileLoader(fullname, origin)
-+ loader = self.LoaderClass(fullname, origin)
- spec = importlib.util.spec_from_loader(fullname, loader)
- module = importlib.util.module_from_spec(spec)
- loader.exec_module(module)
-@@ -134,8 +146,7 @@
- with self.assertRaises(AttributeError):
- module.__path__
- self.assertIs(module, sys.modules[self.name])
-- self.assertIsInstance(module.__loader__,
-- self.machinery.ExtensionFileLoader)
-+ self.assertIsInstance(module.__loader__, self.LoaderClass)
-
- def test_functionality(self):
- # Test basic functionality of stuff defined in an extension module.
-diff --git a/Lib/test/test_importlib/util.py b/Lib/test/test_importlib/util.py
-index b14ecb51b25..7e58dc321a5 100644
---- a/Lib/test/test_importlib/util.py
-+++ b/Lib/test/test_importlib/util.py
-@@ -13,6 +13,7 @@
- from pathlib import Path, PurePath
- from test import support
- from test.support import import_helper
-+from test.support import is_apple_mobile
- from test.support import os_helper
- import unittest
- import sys
-@@ -42,6 +43,11 @@
- global EXTENSIONS
- for path in sys.path:
- for ext in machinery.EXTENSION_SUFFIXES:
-+ # Apple mobile platforms mechanically load .so files,
-+ # but the findable files are labelled .fwork
-+ if is_apple_mobile:
-+ ext = ext.replace(".so", ".fwork")
-+
- filename = EXTENSIONS.name + ext
- file_path = os.path.join(path, filename)
- if os.path.exists(file_path):
-diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
-index 5e430dad061..ad0728408df 100644
---- a/Lib/test/test_inspect.py
-+++ b/Lib/test/test_inspect.py
-@@ -24,7 +24,7 @@
- except ImportError:
- ThreadPoolExecutor = None
-
--from test.support import cpython_only
-+from test.support import cpython_only, is_apple_mobile
- from test.support import MISSING_C_DOCSTRINGS, ALWAYS_EQ
- from test.support.import_helper import DirsOnSysPath
- from test.support.os_helper import TESTFN
-@@ -727,6 +727,7 @@
- @unittest.skipIf(not hasattr(unicodedata, '__file__') or
- unicodedata.__file__.endswith('.py'),
- "unicodedata is not an external binary module")
-+ @unittest.skipIf(is_apple_mobile, "FIXME: Edge case of module loader")
- def test_findsource_binary(self):
- self.assertRaises(OSError, inspect.getsource, unicodedata)
- self.assertRaises(OSError, inspect.findsource, unicodedata)
-diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
-index 8dae85ac4f5..54359c36f15 100644
---- a/Lib/test/test_io.py
-+++ b/Lib/test/test_io.py
-@@ -39,11 +39,9 @@
- from test import support
- from test.support.script_helper import (
- assert_python_ok, assert_python_failure, run_python_until_end)
--from test.support import import_helper
--from test.support import os_helper
--from test.support import threading_helper
--from test.support import warnings_helper
--from test.support import skip_if_sanitizer
-+from test.support import (
-+ import_helper, is_apple, os_helper, skip_if_sanitizer, threading_helper, warnings_helper
-+)
- from test.support.os_helper import FakePath
-
- import codecs
-@@ -598,10 +596,10 @@
- self.read_ops(f, True)
-
- def test_large_file_ops(self):
-- # On Windows and Mac OSX this test consumes large resources; It takes
-- # a long time to build the >2 GiB file and takes >2 GiB of disk space
-- # therefore the resource must be enabled to run this test.
-- if sys.platform[:3] == 'win' or sys.platform == 'darwin':
-+ # On Windows and Apple platforms this test consumes large resources; It
-+ # takes a long time to build the >2 GiB file and takes >2 GiB of disk
-+ # space therefore the resource must be enabled to run this test.
-+ if sys.platform[:3] == 'win' or is_apple:
- support.requires(
- 'largefile',
- 'test requires %s bytes and a long time to run' % self.LARGE)
-diff --git a/Lib/test/test_json/test_tool.py b/Lib/test/test_json/test_tool.py
-index 1d7fca6efb1..0715cc75b66 100644
---- a/Lib/test/test_json/test_tool.py
-+++ b/Lib/test/test_json/test_tool.py
-@@ -85,6 +85,7 @@
- }
- """)
-
-+ @support.requires_subprocess()
- def test_stdin_stdout(self):
- args = sys.executable, '-m', 'json.tool'
- process = subprocess.run(args, input=self.data, capture_output=True, text=True, check=True)
-@@ -140,6 +141,7 @@
- self.assertEqual(out, b'')
- self.assertEqual(err, b'')
-
-+ @support.requires_subprocess()
- def test_jsonlines(self):
- args = sys.executable, '-m', 'json.tool', '--json-lines'
- process = subprocess.run(args, input=self.jsonlines_raw, capture_output=True, text=True, check=True)
-@@ -160,6 +162,7 @@
- self.expect_without_sort_keys.encode().splitlines())
- self.assertEqual(err, b'')
-
-+ @support.requires_subprocess()
- def test_indent(self):
- input_ = '[1, 2]'
- expect = textwrap.dedent('''\
-@@ -173,6 +176,7 @@
- self.assertEqual(process.stdout, expect)
- self.assertEqual(process.stderr, '')
-
-+ @support.requires_subprocess()
- def test_no_indent(self):
- input_ = '[1,\n2]'
- expect = '[1, 2]\n'
-@@ -181,6 +185,7 @@
- self.assertEqual(process.stdout, expect)
- self.assertEqual(process.stderr, '')
-
-+ @support.requires_subprocess()
- def test_tab(self):
- input_ = '[1, 2]'
- expect = '[\n\t1,\n\t2\n]\n'
-@@ -189,6 +194,7 @@
- self.assertEqual(process.stdout, expect)
- self.assertEqual(process.stderr, '')
-
-+ @support.requires_subprocess()
- def test_compact(self):
- input_ = '[ 1 ,\n 2]'
- expect = '[1,2]\n'
-@@ -197,6 +203,7 @@
- self.assertEqual(process.stdout, expect)
- self.assertEqual(process.stderr, '')
-
-+ @unittest.skipIf(support.is_apple_mobile, "FIXME: Edge case in encoding handling")
- def test_no_ensure_ascii_flag(self):
- infile = self._create_infile('{"key":"💩"}')
- outfile = os_helper.TESTFN + '.out'
-@@ -208,6 +215,7 @@
- expected = [b'{', b' "key": "\xf0\x9f\x92\xa9"', b"}"]
- self.assertEqual(lines, expected)
-
-+ @unittest.skipIf(support.is_apple_mobile, "FIXME: Edge case in encoding handling")
- def test_ensure_ascii_default(self):
- infile = self._create_infile('{"key":"💩"}')
- outfile = os_helper.TESTFN + '.out'
-@@ -220,6 +228,7 @@
- self.assertEqual(lines, expected)
-
- @unittest.skipIf(sys.platform =="win32", "The test is failed with ValueError on Windows")
-+ @support.requires_subprocess()
- def test_broken_pipe_error(self):
- cmd = [sys.executable, '-m', 'json.tool']
- proc = subprocess.Popen(cmd,
-diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py
-index 74e950450cf..b3dc348d2bc 100644
---- a/Lib/test/test_logging.py
-+++ b/Lib/test/test_logging.py
-@@ -43,6 +43,7 @@
- import tempfile
- from test.support.script_helper import assert_python_ok, assert_python_failure
- from test import support
-+from test.support import is_apple_mobile
- from test.support import os_helper
- from test.support import socket_helper
- from test.support import threading_helper
-diff --git a/Lib/test/test_mailcap.py b/Lib/test/test_mailcap.py
-index 32f07ab290f..3ca7616feef 100644
---- a/Lib/test/test_mailcap.py
-+++ b/Lib/test/test_mailcap.py
-@@ -2,7 +2,7 @@
- import os
- import copy
- import test.support
--from test.support import os_helper
-+from test.support import os_helper, requires_subprocess
- import unittest
- import sys
-
-@@ -220,6 +220,7 @@
-
- @unittest.skipUnless(os.name == "posix", "Requires 'test' command on system")
- @unittest.skipIf(sys.platform == "vxworks", "'test' command is not supported on VxWorks")
-+ @requires_subprocess()
- def test_test(self):
- # findmatch() will automatically check any "test" conditions and skip
- # the entry if the check fails.
-diff --git a/Lib/test/test_marshal.py b/Lib/test/test_marshal.py
-index 7bcf8e8399a..6ff818ac893 100644
---- a/Lib/test/test_marshal.py
-+++ b/Lib/test/test_marshal.py
-@@ -1,5 +1,5 @@
- from test import support
--from test.support import os_helper
-+from test.support import is_apple_mobile, os_helper
- import array
- import io
- import marshal
-@@ -233,6 +233,8 @@
- #if os.name == 'nt' and hasattr(sys, 'gettotalrefcount'):
- if os.name == 'nt':
- MAX_MARSHAL_STACK_DEPTH = 1000
-+ elif is_apple_mobile:
-+ MAX_MARSHAL_STACK_DEPTH = 1500
- else:
- MAX_MARSHAL_STACK_DEPTH = 2000
- for i in range(MAX_MARSHAL_STACK_DEPTH - 2):
-diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py
-index 307e2b93559..f241bfdaaa7 100644
---- a/Lib/test/test_mmap.py
-+++ b/Lib/test/test_mmap.py
-@@ -1,4 +1,6 @@
--from test.support import (requires, _2G, _4G, gc_collect, cpython_only)
-+from test.support import (
-+ requires, _2G, _4G, gc_collect, cpython_only, is_apple,
-+)
- from test.support.import_helper import import_module
- from test.support.os_helper import TESTFN, unlink
- import unittest
-@@ -811,7 +813,7 @@
- unlink(TESTFN)
-
- def _make_test_file(self, num_zeroes, tail):
-- if sys.platform[:3] == 'win' or sys.platform == 'darwin':
-+ if sys.platform[:3] == 'win' or is_apple:
- requires('largefile',
- 'test requires %s bytes and a long time to run' % str(0x180000000))
- f = open(TESTFN, 'w+b')
-diff --git a/Lib/test/test_multiprocessing_fork.py b/Lib/test/test_multiprocessing_fork.py
-index 5000edb7c5c..5c2f1e08cc9 100644
---- a/Lib/test/test_multiprocessing_fork.py
-+++ b/Lib/test/test_multiprocessing_fork.py
-@@ -13,6 +13,9 @@
- if sys.platform == 'darwin':
- raise unittest.SkipTest("test may crash on macOS (bpo-33725)")
-
-+if support.is_apple_mobile:
-+ raise unittest.SkipTest("Can't use fork on Apple mobile")
-+
- test._test_multiprocessing.install_tests_in_module_dict(globals(), 'fork')
-
- if __name__ == '__main__':
-diff --git a/Lib/test/test_multiprocessing_forkserver.py b/Lib/test/test_multiprocessing_forkserver.py
-index 6ad5faf9e8a..0c0f470b6d3 100644
---- a/Lib/test/test_multiprocessing_forkserver.py
-+++ b/Lib/test/test_multiprocessing_forkserver.py
-@@ -10,6 +10,9 @@
- if sys.platform == "win32":
- raise unittest.SkipTest("forkserver is not available on Windows")
-
-+if support.is_apple_mobile:
-+ raise unittest.SkipTest("Can't use fork on Apple mobile")
-+
- test._test_multiprocessing.install_tests_in_module_dict(globals(), 'forkserver')
-
- if __name__ == '__main__':
-diff --git a/Lib/test/test_multiprocessing_spawn.py b/Lib/test/test_multiprocessing_spawn.py
-index 6558952308f..9c3901a63f3 100644
---- a/Lib/test/test_multiprocessing_spawn.py
-+++ b/Lib/test/test_multiprocessing_spawn.py
-@@ -6,6 +6,9 @@
- if support.PGO:
- raise unittest.SkipTest("test is not helpful for PGO")
-
-+if support.is_apple_mobile:
-+ raise unittest.SkipTest("Can't use fork on Apple mobile")
-+
- test._test_multiprocessing.install_tests_in_module_dict(globals(), 'spawn')
-
- if __name__ == '__main__':
-diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
-index 044ce5c1a39..8daa5f4071d 100644
---- a/Lib/test/test_os.py
-+++ b/Lib/test/test_os.py
-@@ -33,6 +33,8 @@
- from test import support
- from test.support import import_helper
- from test.support import os_helper
-+from test.support import requires_fork
-+from test.support import requires_subprocess
- from test.support import socket_helper
- from test.support import threading_helper
- from test.support import warnings_helper
-@@ -1095,6 +1097,7 @@
- value_str = value.decode(sys.getfilesystemencoding(), 'surrogateescape')
- self.assertEqual(os.environ['bytes'], value_str)
-
-+ @requires_subprocess()
- def test_putenv_unsetenv(self):
- name = "PYTHONTESTVAR"
- value = "testvalue"
-@@ -2180,6 +2183,7 @@
- self.check(os.fchown, -1, -1)
-
- @unittest.skipUnless(hasattr(os, 'fpathconf'), 'test needs os.fpathconf()')
-+ @unittest.skipIf(support.is_apple_mobile, "gh-118201: Test is flaky on iOS")
- def test_fpathconf(self):
- self.check(os.pathconf, "PC_NAME_MAX")
- self.check(os.fpathconf, "PC_NAME_MAX")
-@@ -2306,6 +2310,7 @@
- self.assertRaises(OverflowError, os.setreuid, 0, self.UID_OVERFLOW)
-
- @unittest.skipUnless(hasattr(os, 'setreuid'), 'test needs os.setreuid()')
-+ @requires_subprocess()
- def test_setreuid_neg1(self):
- # Needs to accept -1. We run this in a subprocess to avoid
- # altering the test runner's process state (issue8045).
-@@ -2323,6 +2328,7 @@
- self.assertRaises(OverflowError, os.setregid, 0, self.GID_OVERFLOW)
-
- @unittest.skipUnless(hasattr(os, 'setregid'), 'test needs os.setregid()')
-+ @requires_subprocess()
- def test_setregid_neg1(self):
- # Needs to accept -1. We run this in a subprocess to avoid
- # altering the test runner's process state (issue8045).
-@@ -2995,6 +3001,7 @@
-
- class PidTests(unittest.TestCase):
- @unittest.skipUnless(hasattr(os, 'getppid'), "test needs os.getppid")
-+ @requires_subprocess()
- def test_getppid(self):
- p = subprocess.Popen([sys.executable, '-c',
- 'import os; print(os.getppid())'],
-@@ -3003,6 +3010,7 @@
- # We are the parent of our subprocess
- self.assertEqual(int(stdout), os.getpid())
-
-+ @requires_fork()
- def check_waitpid(self, code, exitcode, callback=None):
- if sys.platform == 'win32':
- # On Windows, os.spawnv() simply joins arguments with spaces:
-@@ -3065,6 +3073,7 @@
- self.check_waitpid(code, exitcode=-signum, callback=kill_process)
-
-
-+@requires_fork()
- class SpawnTests(unittest.TestCase):
- def create_args(self, *, with_env=False, use_bytes=False):
- self.exitcode = 17
-@@ -3147,6 +3156,7 @@
- self.assertEqual(exitcode, self.exitcode)
-
- @requires_os_func('spawnv')
-+ @requires_fork()
- def test_nowait(self):
- args = self.create_args()
- pid = os.spawnv(os.P_NOWAIT, args[0], args)
-@@ -3690,6 +3700,7 @@
- self.assertGreaterEqual(size.columns, 0)
- self.assertGreaterEqual(size.lines, 0)
-
-+ @support.requires_subprocess()
- def test_stty_match(self):
- """Check if stty returns the same results
-
-diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py
-index bf3fc5fb249..3da409e9917 100644
---- a/Lib/test/test_pathlib.py
-+++ b/Lib/test/test_pathlib.py
-@@ -12,6 +12,7 @@
- from unittest import mock
-
- from test.support import import_helper
-+from test.support import is_apple_mobile
- from test.support import os_helper
- from test.support.os_helper import TESTFN, FakePath
-
-@@ -1468,6 +1469,7 @@
- self.assertIs(type(p), type(q))
- self.assertTrue(p.is_absolute())
-
-+ @unittest.skipIf(is_apple_mobile, "No home folder on Apple mobile")
- def test_home(self):
- with os_helper.EnvironmentVarGuard() as env:
- self._test_home(self.cls.home())
-@@ -2546,6 +2548,7 @@
- 'pwd module does not expose getpwall()')
- @unittest.skipIf(sys.platform == "vxworks",
- "no home directory on VxWorks")
-+ @unittest.skipIf(is_apple_mobile, "No home folder on Apple mobile")
- def test_expanduser(self):
- P = self.cls
- import_helper.import_module('pwd')
-diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py
-index 77f68084482..94cde4008ea 100644
---- a/Lib/test/test_pdb.py
-+++ b/Lib/test/test_pdb.py
-@@ -13,7 +13,7 @@
-
- from contextlib import ExitStack, redirect_stdout
- from io import StringIO
--from test.support import os_helper
-+from test.support import os_helper, requires_subprocess
- # This little helper class is essential for testing pdb under doctest.
- from test.test_doctest import _FakeInput
- from unittest.mock import patch
-@@ -1531,6 +1531,7 @@
- """
-
-
-+@requires_subprocess()
- class PdbTestCase(unittest.TestCase):
- def tearDown(self):
- os_helper.unlink(os_helper.TESTFN)
-diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py
-index 2d41166644a..964e8fa3154 100644
---- a/Lib/test/test_platform.py
-+++ b/Lib/test/test_platform.py
-@@ -10,6 +10,14 @@
- from test import support
- from test.support import os_helper
-
-+try:
-+ # Some of the iOS tests need ctypes to operate.
-+ # Confirm that the ctypes module is available
-+ # is available.
-+ import _ctypes
-+except ImportError:
-+ _ctypes = None
-+
- FEDORA_OS_RELEASE = """\
- NAME=Fedora
- VERSION="32 (Thirty Two)"
-@@ -228,6 +236,29 @@
- self.assertEqual(res[-1], res.processor)
- self.assertEqual(len(res), 6)
-
-+ if os.name == "posix":
-+ uname = os.uname()
-+ self.assertEqual(res.node, uname.nodename)
-+ self.assertEqual(res.version, uname.version)
-+ self.assertEqual(res.machine, uname.machine)
-+
-+ if sys.platform == "android":
-+ self.assertEqual(res.system, "Android")
-+ self.assertEqual(res.release, platform.android_ver().release)
-+ elif sys.platform == "ios":
-+ # Platform module needs ctypes for full operation. If ctypes
-+ # isn't available, there's no ObjC module, and dummy values are
-+ # returned.
-+ if _ctypes:
-+ self.assertIn(res.system, {"iOS", "iPadOS"})
-+ self.assertEqual(res.release, platform.ios_ver().release)
-+ else:
-+ self.assertEqual(res.system, "")
-+ self.assertEqual(res.release, "")
-+ else:
-+ self.assertEqual(res.system, uname.sysname)
-+ self.assertEqual(res.release, uname.release)
-+
- def test_uname_cast_to_tuple(self):
- res = platform.uname()
- expected = (
-@@ -277,6 +308,7 @@
- self.assertIn('processor', res)
-
- @unittest.skipIf(sys.platform in ['win32', 'OpenVMS'], "uname -p not used")
-+ @support.requires_subprocess()
- def test_uname_processor(self):
- """
- On some systems, the processor must match the output
-@@ -318,6 +350,7 @@
- def test_win32_ver(self):
- res = platform.win32_ver()
-
-+ @support.requires_subprocess()
- def test_mac_ver(self):
- res = platform.mac_ver()
-
-@@ -370,6 +403,56 @@
- # parent
- support.wait_process(pid, exitcode=0)
-
-+ def test_ios_ver(self):
-+ result = platform.ios_ver()
-+
-+ # ios_ver is only fully available on iOS where ctypes is available.
-+ if sys.platform == "ios" and _ctypes:
-+ system, release, model, is_simulator = result
-+ # Result is a namedtuple
-+ self.assertEqual(result.system, system)
-+ self.assertEqual(result.release, release)
-+ self.assertEqual(result.model, model)
-+ self.assertEqual(result.is_simulator, is_simulator)
-+
-+ # We can't assert specific values without reproducing the logic of
-+ # ios_ver(), so we check that the values are broadly what we expect.
-+
-+ # System is either iOS or iPadOS, depending on the test device
-+ self.assertIn(system, {"iOS", "iPadOS"})
-+
-+ # Release is a numeric version specifier with at least 2 parts
-+ parts = release.split(".")
-+ self.assertGreaterEqual(len(parts), 2)
-+ self.assertTrue(all(part.isdigit() for part in parts))
-+
-+ # If this is a simulator, we get a high level device descriptor
-+ # with no identifying model number. If this is a physical device,
-+ # we get a model descriptor like "iPhone13,1"
-+ if is_simulator:
-+ self.assertIn(model, {"iPhone", "iPad"})
-+ else:
-+ self.assertTrue(
-+ (model.startswith("iPhone") or model.startswith("iPad"))
-+ and "," in model
-+ )
-+
-+ self.assertEqual(type(is_simulator), bool)
-+ else:
-+ # On non-iOS platforms, calling ios_ver doesn't fail; you get
-+ # default values
-+ self.assertEqual(result.system, "")
-+ self.assertEqual(result.release, "")
-+ self.assertEqual(result.model, "")
-+ self.assertFalse(result.is_simulator)
-+
-+ # Check the fallback values can be overridden by arguments
-+ override = platform.ios_ver("Foo", "Bar", "Whiz", True)
-+ self.assertEqual(override.system, "Foo")
-+ self.assertEqual(override.release, "Bar")
-+ self.assertEqual(override.model, "Whiz")
-+ self.assertTrue(override.is_simulator)
-+
- def test_libc_ver(self):
- # check that libc_ver(executable) doesn't raise an exception
- if os.path.isdir(sys.executable) and \
-@@ -464,7 +547,8 @@
- 'root:xnu-4570.71.2~1/RELEASE_X86_64'),
- 'x86_64', 'i386')
- arch = ('64bit', '')
-- with mock.patch.object(platform, 'uname', return_value=uname), \
-+ with mock.patch.object(sys, "platform", "darwin"), \
-+ mock.patch.object(platform, 'uname', return_value=uname), \
- mock.patch.object(platform, 'architecture', return_value=arch):
- for mac_ver, expected_terse, expected in [
- # darwin: mac_ver() returns empty strings
-diff --git a/Lib/test/test_poll.py b/Lib/test/test_poll.py
-index 82bbb3af9f1..2a09eed55b6 100644
---- a/Lib/test/test_poll.py
-+++ b/Lib/test/test_poll.py
-@@ -8,6 +8,7 @@
- import time
- import unittest
- from test.support import cpython_only
-+from test.support import requires_subprocess
- from test.support import threading_helper
- from test.support.os_helper import TESTFN
-
-@@ -120,6 +121,7 @@
- # Another test case for poll(). This is copied from the test case for
- # select(), modified to use poll() instead.
-
-+ @requires_subprocess()
- def test_poll2(self):
- cmd = 'for i in 0 1 2 3 4 5 6 7 8 9; do echo testing...; sleep 1; done'
- proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
-diff --git a/Lib/test/test_popen.py b/Lib/test/test_popen.py
-index cac2f6177f3..50ceffc81b8 100644
---- a/Lib/test/test_popen.py
-+++ b/Lib/test/test_popen.py
-@@ -7,7 +7,7 @@
- from test import support
- import os, sys
-
--if not hasattr(os, 'popen'):
-+if not hasattr(os, 'popen') or support.is_apple_mobile:
- raise unittest.SkipTest("need os.popen()")
-
- # Test that command-lines get down as we expect.
-diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py
-index 19bc8853159..e2308875a30 100644
---- a/Lib/test/test_posix.py
-+++ b/Lib/test/test_posix.py
-@@ -555,6 +555,7 @@
-
- @unittest.skipUnless(hasattr(posix, 'confstr'),
- 'test needs posix.confstr()')
-+ @unittest.skipIf(support.is_apple_mobile, "gh-118201: Test is flaky on iOS")
- def test_confstr(self):
- self.assertRaises(ValueError, posix.confstr, "CS_garbage")
- self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
-@@ -766,9 +767,10 @@
- check_stat(uid, gid)
- self.assertRaises(OSError, chown_func, first_param, 0, -1)
- check_stat(uid, gid)
-- if 0 not in os.getgroups():
-- self.assertRaises(OSError, chown_func, first_param, -1, 0)
-- check_stat(uid, gid)
-+ if hasattr(os, 'getgroups'):
-+ if 0 not in os.getgroups():
-+ self.assertRaises(OSError, chown_func, first_param, -1, 0)
-+ check_stat(uid, gid)
- # test illegal types
- for t in str, float:
- self.assertRaises(TypeError, chown_func, first_param, t(uid), gid)
-@@ -1048,6 +1050,7 @@
- @unittest.skipUnless(hasattr(posix, 'getgrouplist'), "test needs posix.getgrouplist()")
- @unittest.skipUnless(hasattr(pwd, 'getpwuid'), "test needs pwd.getpwuid()")
- @unittest.skipUnless(hasattr(os, 'getuid'), "test needs os.getuid()")
-+ @unittest.skipIf(support.is_apple_mobile, "FIXME: edge case of getpwuid() on simulator")
- def test_getgrouplist(self):
- user = pwd.getpwuid(os.getuid())[0]
- group = pwd.getpwuid(os.getuid())[3]
-@@ -1056,6 +1059,7 @@
-
- @unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()")
- @unittest.skipUnless(hasattr(os, 'popen'), "test needs os.popen()")
-+ @support.requires_subprocess()
- def test_getgroups(self):
- with os.popen('id -G 2>/dev/null') as idg:
- groups = idg.read().strip()
-@@ -1113,8 +1117,8 @@
- self.assertIsInstance(lo, int)
- self.assertIsInstance(hi, int)
- self.assertGreaterEqual(hi, lo)
-- # OSX evidently just returns 15 without checking the argument.
-- if sys.platform != "darwin":
-+ # Apple plaforms return 15 without checking the argument.
-+ if not support.is_apple:
- self.assertRaises(OSError, posix.sched_get_priority_min, -23)
- self.assertRaises(OSError, posix.sched_get_priority_max, -23)
-
-@@ -1880,11 +1884,13 @@
-
-
- @unittest.skipUnless(hasattr(os, 'posix_spawn'), "test needs os.posix_spawn")
-+@support.requires_subprocess()
- class TestPosixSpawn(unittest.TestCase, _PosixSpawnMixin):
- spawn_func = getattr(posix, 'posix_spawn', None)
-
-
- @unittest.skipUnless(hasattr(os, 'posix_spawnp'), "test needs os.posix_spawnp")
-+@support.requires_subprocess()
- class TestPosixSpawnP(unittest.TestCase, _PosixSpawnMixin):
- spawn_func = getattr(posix, 'posix_spawnp', None)
-
-diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py
-index 50cba256cef..c0f99fddd51 100644
---- a/Lib/test/test_posixpath.py
-+++ b/Lib/test/test_posixpath.py
-@@ -5,6 +5,7 @@
- from posixpath import realpath, abspath, dirname, basename
- from test import test_genericpath
- from test.support import import_helper
-+from test.support import is_apple_mobile
- from test.support import os_helper
- from test.support.os_helper import FakePath
- from unittest import mock
-@@ -267,6 +268,7 @@
-
- @unittest.skipIf(sys.platform == "vxworks",
- "no home directory on VxWorks")
-+ @unittest.skipIf(is_apple_mobile, "FIXME: Edge case of getpwuid handling")
- def test_expanduser_pwd(self):
- pwd = import_helper.import_module('pwd')
-
-diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py
-index 0243b8a30b9..f300555eaa1 100644
---- a/Lib/test/test_pty.py
-+++ b/Lib/test/test_pty.py
-@@ -1,20 +1,24 @@
--from test.support import verbose, reap_children
-+import sys
-+import unittest
-+from test.support import is_apple_mobile, reap_children, verbose
- from test.support.import_helper import import_module
-+from test.support.os_helper import TESTFN, unlink
-
- # Skip these tests if termios is not available
- import_module('termios')
-
-+# Skip tests on WASM platforms, plus iOS/tvOS/watchOS
-+if is_apple_mobile:
-+ raise unittest.SkipTest(f"pty tests not required on {sys.platform}")
-+
- import errno
- import os
- import pty
- import tty
--import sys
- import select
- import signal
- import socket
- import io # readline
--import unittest
--
- import struct
- import fcntl
- import warnings
-diff --git a/Lib/test/test_py_compile.py b/Lib/test/test_py_compile.py
-index 5ed98dbff17..794d6436b61 100644
---- a/Lib/test/test_py_compile.py
-+++ b/Lib/test/test_py_compile.py
-@@ -230,6 +230,7 @@
- def tearDown(self):
- os_helper.rmtree(self.directory)
-
-+ @support.requires_subprocess()
- def pycompilecmd(self, *args, **kwargs):
- # assert_python_* helpers don't return proc object. We'll just use
- # subprocess.run() instead of spawn_python() and its friends to test
-diff --git a/Lib/test/test_quopri.py b/Lib/test/test_quopri.py
-index 715544c8a96..152d1858dcd 100644
---- a/Lib/test/test_quopri.py
-+++ b/Lib/test/test_quopri.py
-@@ -3,6 +3,7 @@
- import sys, io, subprocess
- import quopri
-
-+from test import support
-
-
- ENCSAMPLE = b"""\
-@@ -180,6 +181,7 @@
- for p, e in self.HSTRINGS:
- self.assertEqual(quopri.decodestring(e, header=True), p)
-
-+ @support.requires_subprocess()
- def test_scriptencode(self):
- (p, e) = self.STRINGS[-1]
- process = subprocess.Popen([sys.executable, "-mquopri"],
-@@ -196,6 +198,7 @@
- self.assertEqual(cout[i], e[i])
- self.assertEqual(cout, e)
-
-+ @support.requires_subprocess()
- def test_scriptdecode(self):
- (p, e) = self.STRINGS[-1]
- process = subprocess.Popen([sys.executable, "-mquopri", "-d"],
-diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py
-index 62e6c28280e..76ae976e69a 100644
---- a/Lib/test/test_regrtest.py
-+++ b/Lib/test/test_regrtest.py
-@@ -513,6 +513,7 @@
- self.assertTrue(0 <= randseed <= 10000000, randseed)
- return randseed
-
-+ @support.requires_subprocess()
- def run_command(self, args, input=None, exitcode=0, **kw):
- if not input:
- input = ''
-diff --git a/Lib/test/test_repl.py b/Lib/test/test_repl.py
-index 03bf8d8b548..9775c3e89af 100644
---- a/Lib/test/test_repl.py
-+++ b/Lib/test/test_repl.py
-@@ -5,9 +5,10 @@
- import unittest
- import subprocess
- from textwrap import dedent
--from test.support import cpython_only, SuppressCrashReport
-+from test.support import cpython_only, SuppressCrashReport, requires_subprocess
- from test.support.script_helper import kill_python
-
-+@requires_subprocess()
- def spawn_repl(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw):
- """Run the Python REPL with the given arguments.
-
-diff --git a/Lib/test/test_runpy.py b/Lib/test/test_runpy.py
-index e6d36825f15..93e1ab556ae 100644
---- a/Lib/test/test_runpy.py
-+++ b/Lib/test/test_runpy.py
-@@ -12,7 +12,7 @@
- import textwrap
- import unittest
- import warnings
--from test.support import no_tracing, verbose
-+from test.support import no_tracing, verbose, requires_subprocess
- from test.support.import_helper import forget, make_legacy_pyc, unload
- from test.support.os_helper import create_empty_file, temp_dir
- from test.support.script_helper import make_script, make_zip_script
-@@ -780,6 +780,7 @@
- )
- super().run(*args, **kwargs)
-
-+ @requires_subprocess()
- def assertSigInt(self, *args, **kwargs):
- proc = subprocess.run(*args, **kwargs, text=True, stderr=subprocess.PIPE)
- self.assertTrue(proc.stderr.endswith("\nKeyboardInterrupt\n"))
-diff --git a/Lib/test/test_select.py b/Lib/test/test_select.py
-index cf32cf2f6a6..810c67aa2b3 100644
---- a/Lib/test/test_select.py
-+++ b/Lib/test/test_select.py
-@@ -47,6 +47,7 @@
- self.assertIsNot(w, x)
-
- @unittest.skipUnless(hasattr(os, 'popen'), "need os.popen()")
-+ @support.requires_subprocess()
- def test_select(self):
- code = textwrap.dedent('''
- import time
-diff --git a/Lib/test/test_selectors.py b/Lib/test/test_selectors.py
-index fe6b725a4bd..456ee9aea7b 100644
---- a/Lib/test/test_selectors.py
-+++ b/Lib/test/test_selectors.py
-@@ -6,8 +6,7 @@
- import socket
- import sys
- from test import support
--from test.support import os_helper
--from test.support import socket_helper
-+from test.support import is_apple, os_helper, socket_helper
- from time import sleep
- import unittest
- import unittest.mock
-@@ -486,7 +485,7 @@
- try:
- fds = s.select()
- except OSError as e:
-- if e.errno == errno.EINVAL and sys.platform == 'darwin':
-+ if e.errno == errno.EINVAL and is_apple:
- # unexplainable errors on macOS don't need to fail the test
- self.skipTest("Invalid argument error calling poll()")
- raise
-diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py
-index 72fb3afcbef..ccb37967780 100644
---- a/Lib/test/test_shutil.py
-+++ b/Lib/test/test_shutil.py
-@@ -1777,6 +1777,7 @@
- check_chown(dirname, uid, gid)
-
-
-+@support.requires_subprocess()
- class TestWhich(BaseTest, unittest.TestCase):
-
- def setUp(self):
-@@ -2644,6 +2645,7 @@
- self.assertGreaterEqual(size.lines, 0)
-
- @unittest.skipUnless(os.isatty(sys.__stdout__.fileno()), "not on tty")
-+ @support.requires_subprocess()
- @unittest.skipUnless(hasattr(os, 'get_terminal_size'),
- 'need os.get_terminal_size()')
- def test_stty_match(self):
-diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py
-index 294cf3888d1..26d51621647 100644
---- a/Lib/test/test_signal.py
-+++ b/Lib/test/test_signal.py
-@@ -11,7 +11,7 @@
- import time
- import unittest
- from test import support
--from test.support import os_helper
-+from test.support import is_apple, is_apple_mobile, os_helper
- from test.support.script_helper import assert_python_ok, spawn_python
- try:
- import _testcapi
-@@ -89,6 +89,7 @@
- self.assertLess(len(s), signal.NSIG)
-
- @unittest.skipUnless(sys.executable, "sys.executable required.")
-+ @support.requires_subprocess()
- def test_keyboard_interrupt_exit_code(self):
- """KeyboardInterrupt triggers exit via SIGINT."""
- process = subprocess.run(
-@@ -139,6 +140,7 @@
- signal.signal(7, handler)
-
- @unittest.skipUnless(sys.executable, "sys.executable required.")
-+ @support.requires_subprocess()
- def test_keyboard_interrupt_exit_code(self):
- """KeyboardInterrupt triggers an exit using STATUS_CONTROL_C_EXIT."""
- # We don't test via os.kill(os.getpid(), signal.CTRL_C_EVENT) here
-@@ -612,6 +614,7 @@
- @unittest.skipUnless(hasattr(signal, 'siginterrupt'), "needs signal.siginterrupt()")
- class SiginterruptTest(unittest.TestCase):
-
-+ @support.requires_fork()
- def readpipe_interrupted(self, interrupt):
- """Perform a read during which a signal will arrive. Return True if the
- read is interrupted by the signal and raises an exception. Return False
-@@ -746,7 +749,7 @@
- self.assertEqual(self.hndl_called, True)
-
- # Issue 3864, unknown if this affects earlier versions of freebsd also
-- @unittest.skipIf(sys.platform in ('netbsd5',),
-+ @unittest.skipIf(sys.platform in ('netbsd5',) or is_apple_mobile,
- 'itimer not reliable (does not mix well with threading) on some BSDs.')
- def test_itimer_virtual(self):
- self.itimer = signal.ITIMER_VIRTUAL
-@@ -1261,6 +1264,7 @@
- # Python handler
- self.assertEqual(len(sigs), N, "Some signals were lost")
-
-+ @unittest.skipIf(is_apple, "crashes due to system bug (FB13453490)")
- @unittest.skipUnless(hasattr(signal, "SIGUSR1"),
- "test needs SIGUSR1")
- def test_stress_modifying_handlers(self):
-diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
-index c70e1fa9ae1..18086ac55b9 100644
---- a/Lib/test/test_site.py
-+++ b/Lib/test/test_site.py
-@@ -221,6 +221,7 @@
- pth_file.cleanup()
-
- @unittest.skipUnless(sys.platform == 'win32', 'test needs Windows')
-+ @support.requires_subprocess()
- def test_addsitedir_hidden_file_attribute(self):
- pth_file = PthFile()
- pth_file.cleanup(prep=True)
-@@ -249,6 +250,7 @@
-
- @unittest.skipUnless(site.ENABLE_USER_SITE, "requires access to PEP 370 "
- "user-site (site.ENABLE_USER_SITE)")
-+ @support.requires_subprocess()
- def test_s_option(self):
- # (ncoghlan) Change this to use script_helper...
- usersite = os.path.normpath(site.USER_SITE)
-@@ -534,6 +536,7 @@
-
- class StartupImportTests(unittest.TestCase):
-
-+ @support.requires_subprocess()
- def test_startup_imports(self):
- # Get sys.path in isolated mode (python3 -I)
- popen = subprocess.Popen([sys.executable, '-I', '-c',
-@@ -582,17 +585,20 @@
- }.difference(sys.builtin_module_names)
- self.assertFalse(modules.intersection(collection_mods), stderr)
-
-+ @support.requires_subprocess()
- def test_startup_interactivehook(self):
- r = subprocess.Popen([sys.executable, '-c',
- 'import sys; sys.exit(hasattr(sys, "__interactivehook__"))']).wait()
- self.assertTrue(r, "'__interactivehook__' not added by site")
-
-+ @support.requires_subprocess()
- def test_startup_interactivehook_isolated(self):
- # issue28192 readline is not automatically enabled in isolated mode
- r = subprocess.Popen([sys.executable, '-I', '-c',
- 'import sys; sys.exit(hasattr(sys, "__interactivehook__"))']).wait()
- self.assertFalse(r, "'__interactivehook__' added in isolated mode")
-
-+ @support.requires_subprocess()
- def test_startup_interactivehook_isolated_explicit(self):
- # issue28192 readline can be explicitly enabled in isolated mode
- r = subprocess.Popen([sys.executable, '-I', '-c',
-@@ -631,6 +637,7 @@
- sys_path.append(abs_path)
- return sys_path
-
-+ @support.requires_subprocess()
- def test_underpth_nosite_file(self):
- libpath = os.path.dirname(os.path.dirname(encodings.__file__))
- exe_prefix = os.path.dirname(sys.executable)
-@@ -659,6 +666,7 @@
- "sys.path is incorrect"
- )
-
-+ @support.requires_subprocess()
- def test_underpth_file(self):
- libpath = os.path.dirname(os.path.dirname(encodings.__file__))
- exe_prefix = os.path.dirname(sys.executable)
-diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
-index 0050298b416..99d267a663e 100644
---- a/Lib/test/test_socket.py
-+++ b/Lib/test/test_socket.py
-@@ -3,6 +3,7 @@
- from test.support import os_helper
- from test.support import socket_helper
- from test.support import threading_helper
-+from test.support import is_apple
-
- import errno
- import io
-@@ -700,7 +701,7 @@
- super().setUp()
-
- def bindSock(self, sock):
-- path = tempfile.mktemp(dir=self.dir_path)
-+ path = socket_helper.create_unix_domain_name()
- socket_helper.bind_unix_socket(sock, path)
- self.addCleanup(os_helper.unlink, path)
-
-@@ -1162,8 +1163,11 @@
- # Find one service that exists, then check all the related interfaces.
- # I've ordered this by protocols that have both a tcp and udp
- # protocol, at least for modern Linuxes.
-- if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
-- or sys.platform in ('linux', 'darwin')):
-+ if (
-+ sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
-+ or sys.platform == 'linux'
-+ or is_apple
-+ ):
- # avoid the 'echo' service on this platform, as there is an
- # assumption breaking non-standard port/protocol entry
- services = ('daytime', 'qotd', 'domain')
-@@ -1921,12 +1925,13 @@
- self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
-
- if hasattr(socket, "AF_UNIX"):
-- tmpdir = tempfile.mkdtemp()
-- self.addCleanup(shutil.rmtree, tmpdir)
-+ unix_name = socket_helper.create_unix_domain_name()
-+ self.addCleanup(os_helper.unlink, unix_name)
-+
- s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
- self.addCleanup(s.close)
- try:
-- s.bind(os.path.join(tmpdir, 'socket'))
-+ s.bind(unix_name)
- except PermissionError:
- pass
- else:
-@@ -3534,7 +3539,7 @@
- def _testFDPassCMSG_LEN(self):
- self.createAndSendFDs(1)
-
-- @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
-+ @unittest.skipIf(is_apple, "skipping, see issue #12958")
- @unittest.skipIf(AIX, "skipping, see issue #22397")
- @requireAttrs(socket, "CMSG_SPACE")
- def testFDPassSeparate(self):
-@@ -3545,7 +3550,7 @@
- maxcmsgs=2)
-
- @testFDPassSeparate.client_skip
-- @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
-+ @unittest.skipIf(is_apple, "skipping, see issue #12958")
- @unittest.skipIf(AIX, "skipping, see issue #22397")
- def _testFDPassSeparate(self):
- fd0, fd1 = self.newFDs(2)
-@@ -3558,7 +3563,7 @@
- array.array("i", [fd1]))]),
- len(MSG))
-
-- @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
-+ @unittest.skipIf(is_apple, "skipping, see issue #12958")
- @unittest.skipIf(AIX, "skipping, see issue #22397")
- @requireAttrs(socket, "CMSG_SPACE")
- def testFDPassSeparateMinSpace(self):
-@@ -3572,7 +3577,7 @@
- maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
-
- @testFDPassSeparateMinSpace.client_skip
-- @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
-+ @unittest.skipIf(is_apple, "skipping, see issue #12958")
- @unittest.skipIf(AIX, "skipping, see issue #22397")
- def _testFDPassSeparateMinSpace(self):
- fd0, fd1 = self.newFDs(2)
-@@ -3596,7 +3601,7 @@
- nbytes = self.sendmsgToServer([msg])
- self.assertEqual(nbytes, len(msg))
-
-- @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
-+ @unittest.skipIf(is_apple, "skipping, see issue #12958")
- def testFDPassEmpty(self):
- # Try to pass an empty FD array. Can receive either no array
- # or an empty array.
-diff --git a/Lib/test/test_socketserver.py b/Lib/test/test_socketserver.py
-index 211321f3761..faa038816a7 100644
---- a/Lib/test/test_socketserver.py
-+++ b/Lib/test/test_socketserver.py
-@@ -96,8 +96,7 @@
- else:
- # XXX: We need a way to tell AF_UNIX to pick its own name
- # like AF_INET provides port==0.
-- dir = None
-- fn = tempfile.mktemp(prefix='unix_socket.', dir=dir)
-+ fn = socket_helper.create_unix_domain_name()
- self.test_files.append(fn)
- return fn
-
-diff --git a/Lib/test/test_source_encoding.py b/Lib/test/test_source_encoding.py
-index 219c25cd2f6..d2ad941c051 100644
---- a/Lib/test/test_source_encoding.py
-+++ b/Lib/test/test_source_encoding.py
-@@ -1,7 +1,7 @@
- # -*- coding: koi8-r -*-
-
- import unittest
--from test.support import script_helper, captured_stdout
-+from test.support import script_helper, captured_stdout, requires_subprocess, is_apple_mobile
- from test.support.os_helper import TESTFN, unlink, rmtree
- from test.support.import_helper import unload
- import importlib
-@@ -12,13 +12,14 @@
-
- class MiscSourceEncodingTest(unittest.TestCase):
-
-+ @unittest.skipIf(is_apple_mobile, "FIXME: Edge case of encoding")
- def test_pep263(self):
- self.assertEqual(
-- "ðÉÔÏÎ".encode("utf-8"),
-+ "�����".encode("utf-8"),
- b'\xd0\x9f\xd0\xb8\xd1\x82\xd0\xbe\xd0\xbd'
- )
- self.assertEqual(
-- "\ð".encode("utf-8"),
-+ "\�".encode("utf-8"),
- b'\\\xd0\x9f'
- )
-
-@@ -65,6 +66,7 @@
- # two bytes in common with the UTF-8 BOM
- self.assertRaises(SyntaxError, eval, b'\xef\xbb\x20')
-
-+ @requires_subprocess()
- def test_20731(self):
- sub = subprocess.Popen([sys.executable,
- os.path.join(os.path.dirname(__file__),
-diff --git a/Lib/test/test_stat.py b/Lib/test/test_stat.py
-index 2e1e2c349c8..867c4723086 100644
---- a/Lib/test/test_stat.py
-+++ b/Lib/test/test_stat.py
-@@ -2,8 +2,7 @@
- import os
- import socket
- import sys
--from test.support import os_helper
--from test.support import socket_helper
-+from test.support import is_apple, os_helper, socket_helper
- from test.support.import_helper import import_fresh_module
- from test.support.os_helper import TESTFN
-
-diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
-index 0d3afe612a3..3fc38f8a754 100644
---- a/Lib/test/test_subprocess.py
-+++ b/Lib/test/test_subprocess.py
-@@ -48,6 +48,8 @@
-
- if support.PGO:
- raise unittest.SkipTest("test is not helpful for PGO")
-+if not support.has_subprocess_support:
-+ raise unittest.SkipTest("test requires subprocess support")
-
- mswindows = (sys.platform == "win32")
-
-diff --git a/Lib/test/test_sundry.py b/Lib/test/test_sundry.py
-index 007d68817c6..e64733e71f2 100644
---- a/Lib/test/test_sundry.py
-+++ b/Lib/test/test_sundry.py
-@@ -2,6 +2,7 @@
- import importlib
- import platform
- import sys
-+import sys
- from test import support
- from test.support import import_helper
- from test.support import warnings_helper
-@@ -22,7 +23,8 @@
-
- import distutils.bcppcompiler
- import distutils.ccompiler
-- import distutils.cygwinccompiler
-+ if sys.platform.startswith("win"):
-+ import distutils.cygwinccompiler
- import distutils.filelist
- import distutils.text_file
- import distutils.unixccompiler
-diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py
-index 79290986c49..86c2e6ff817 100644
---- a/Lib/test/test_support.py
-+++ b/Lib/test/test_support.py
-@@ -489,6 +489,7 @@
- # pending child process
- support.reap_children()
-
-+ @support.requires_subprocess()
- def check_options(self, args, func, expected=None):
- code = f'from test.support import {func}; print(repr({func}()))'
- cmd = [sys.executable, *args, '-c', code]
-diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py
-index 1094d40849d..61f6c6b2840 100644
---- a/Lib/test/test_sys.py
-+++ b/Lib/test/test_sys.py
-@@ -633,6 +633,7 @@
- def test_clear_type_cache(self):
- sys._clear_type_cache()
-
-+ @support.requires_subprocess()
- def test_ioencoding(self):
- env = dict(os.environ)
-
-@@ -680,6 +681,7 @@
- 'requires OS support of non-ASCII encodings')
- @unittest.skipUnless(sys.getfilesystemencoding() == locale.getpreferredencoding(False),
- 'requires FS encoding to match locale')
-+ @support.requires_subprocess()
- def test_ioencoding_nonascii(self):
- env = dict(os.environ)
-
-@@ -692,6 +694,7 @@
-
- @unittest.skipIf(sys.base_prefix != sys.prefix,
- 'Test is not venv-compatible')
-+ @support.requires_subprocess()
- def test_executable(self):
- # sys.executable should be absolute
- self.assertEqual(os.path.abspath(sys.executable), sys.executable)
-@@ -726,6 +729,7 @@
- expected = None
- self.check_fsencoding(fs_encoding, expected)
-
-+ @support.requires_subprocess()
- def c_locale_get_error_handler(self, locale, isolated=False, encoding=None):
- # Force the POSIX locale
- env = os.environ.copy()
-@@ -933,6 +937,7 @@
- self.assertIsInstance(level, int)
- self.assertGreater(level, 0)
-
-+ @support.requires_subprocess()
- def test_sys_tracebacklimit(self):
- code = """if 1:
- import sys
-@@ -979,6 +984,7 @@
- out = out.decode('ascii', 'replace').rstrip()
- self.assertEqual(out, 'mbcs replace')
-
-+ @support.requires_subprocess()
- def test_orig_argv(self):
- code = textwrap.dedent('''
- import sys
-diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py
-index 5ee9839c048..e4b37afab4e 100644
---- a/Lib/test/test_sysconfig.py
-+++ b/Lib/test/test_sysconfig.py
-@@ -5,7 +5,7 @@
- import shutil
- from copy import copy
-
--from test.support import (captured_stdout, PythonSymlink)
-+from test.support import (is_apple_mobile, captured_stdout, PythonSymlink)
- from test.support.import_helper import import_module
- from test.support.os_helper import (TESTFN, unlink, skip_unless_symlink,
- change_cwd)
-@@ -258,12 +258,14 @@
-
- # XXX more platforms to tests here
-
-+ @unittest.skipIf(is_apple_mobile,
-+ f"{sys.platform} doesn't distribute header files in the runtime environment")
- def test_get_config_h_filename(self):
- config_h = sysconfig.get_config_h_filename()
- self.assertTrue(os.path.isfile(config_h), config_h)
-
- def test_get_scheme_names(self):
-- wanted = ['nt', 'posix_home', 'posix_prefix']
-+ wanted = ['nt', 'nt_venv', 'posix_home', 'posix_prefix', 'posix_venv']
- if HAS_USER_BASE:
- wanted.extend(['nt_user', 'osx_framework_user', 'posix_user'])
- self.assertEqual(get_scheme_names(), tuple(sorted(wanted)))
-@@ -364,6 +366,8 @@
- self.assertEqual(status, 0)
- self.assertEqual(my_platform, test_platform)
-
-+ @unittest.skipIf(is_apple_mobile,
-+ f"{sys.platform} doesn't include config folder at runtime")
- def test_srcdir(self):
- # See Issues #15322, #15364.
- srcdir = sysconfig.get_config_var('srcdir')
-@@ -440,6 +444,8 @@
-
- @unittest.skipIf(sys.platform.startswith('win'),
- 'Test is not Windows compatible')
-+ @unittest.skipIf(is_apple_mobile,
-+ f"{sys.platform} doesn't include config folder at runtime")
- def test_get_makefile_filename(self):
- makefile = sysconfig.get_makefile_filename()
- self.assertTrue(os.path.isfile(makefile), makefile)
-diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py
-index 6e06bfc7f2f..e1fb2a39750 100644
---- a/Lib/test/test_tempfile.py
-+++ b/Lib/test/test_tempfile.py
-@@ -201,6 +201,7 @@
-
- @unittest.skipUnless(hasattr(os, 'fork'),
- "os.fork is required for this test")
-+ @support.requires_fork()
- def test_process_awareness(self):
- # ensure that the random source differs between
- # child and parent.
-@@ -462,6 +463,7 @@
- self.assertEqual(mode, expected)
-
- @unittest.skipUnless(has_spawnl, 'os.spawnl not available')
-+ @support.requires_fork()
- def test_noinherit(self):
- # _mkstemp_inner file handles are not inherited by child processes
-
-diff --git a/Lib/test/test_thread.py b/Lib/test/test_thread.py
-index 4ae8a833b99..76ea55f14ad 100644
---- a/Lib/test/test_thread.py
-+++ b/Lib/test/test_thread.py
-@@ -225,6 +225,7 @@
- self.read_fd, self.write_fd = os.pipe()
-
- @unittest.skipUnless(hasattr(os, 'fork'), 'need os.fork')
-+ @support.requires_fork()
- @threading_helper.reap_threads
- def test_forkinthread(self):
- pid = None
-diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py
-index c54806e5946..1a01b06e722 100644
---- a/Lib/test/test_threading.py
-+++ b/Lib/test/test_threading.py
-@@ -1258,6 +1258,7 @@
- lock = threading.Lock()
- self.assertRaises(RuntimeError, lock.release)
-
-+ @support.requires_subprocess()
- def test_recursion_limit(self):
- # Issue 9670
- # test that excessive recursion within a non-main thread causes
-diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py
-index 18cd4aba24a..1c65268411e 100644
---- a/Lib/test/test_traceback.py
-+++ b/Lib/test/test_traceback.py
-@@ -130,6 +130,7 @@
- str_name = '.'.join([X.__module__, X.__qualname__])
- self.assertEqual(err[0], "%s: %s\n" % (str_name, str_value))
-
-+ @support.requires_subprocess()
- def test_encoded_file(self):
- # Test that tracebacks are correctly printed for encoded source files:
- # - correct line number (Issue2384)
-diff --git a/Lib/test/test_unicode_file_functions.py b/Lib/test/test_unicode_file_functions.py
-index 54916dec4ea..06f3f7051f3 100644
---- a/Lib/test/test_unicode_file_functions.py
-+++ b/Lib/test/test_unicode_file_functions.py
-@@ -5,7 +5,7 @@
- import unittest
- import warnings
- from unicodedata import normalize
--from test.support import os_helper
-+from test.support import is_apple, os_helper
-
-
- filenames = [
-@@ -22,13 +22,13 @@
- '10_\u1fee\u1ffd',
- ]
-
--# Mac OS X decomposes Unicode names, using Normal Form D.
-+# Apple platforms decompose Unicode names, using Normal Form D.
- # http://developer.apple.com/mac/library/qa/qa2001/qa1173.html
- # "However, most volume formats do not follow the exact specification for
- # these normal forms. For example, HFS Plus uses a variant of Normal Form D
- # in which U+2000 through U+2FFF, U+F900 through U+FAFF, and U+2F800 through
- # U+2FAFF are not decomposed."
--if sys.platform != 'darwin':
-+if not is_apple:
- filenames.extend([
- # Specific code points: NFC(fn), NFD(fn), NFKC(fn) and NFKD(fn) all different
- '11_\u0385\u03d3\u03d4',
-@@ -118,11 +118,11 @@
- os.stat(name)
- self._apply_failure(os.listdir, name, self._listdir_failure)
-
-- # Skip the test on darwin, because darwin does normalize the filename to
-+ # Skip the test on Apple platforms, because they don't normalize the filename to
- # NFD (a variant of Unicode NFD form). Normalize the filename to NFC, NFKC,
- # NFKD in Python is useless, because darwin will normalize it later and so
- # open(), os.stat(), etc. don't raise any exception.
-- @unittest.skipIf(sys.platform == 'darwin', 'irrelevant test on Mac OS X')
-+ @unittest.skipIf(is_apple, 'irrelevant test on Apple platforms')
- def test_normalize(self):
- files = set(self.files)
- others = set()
-@@ -137,10 +137,10 @@
- self._apply_failure(os.remove, name)
- self._apply_failure(os.listdir, name)
-
-- # Skip the test on darwin, because darwin uses a normalization different
-+ # Skip the test on Apple platforms, because they use a normalization different
- # than Python NFD normalization: filenames are different even if we use
- # Python NFD normalization.
-- @unittest.skipIf(sys.platform == 'darwin', 'irrelevant test on Mac OS X')
-+ @unittest.skipIf(is_apple, 'irrelevant test on Apple platforms')
- def test_listdir(self):
- sf0 = set(self.files)
- with warnings.catch_warnings():
-diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py
-index fe17aac6c1f..0df55745afd 100644
---- a/Lib/test/test_urllib2.py
-+++ b/Lib/test/test_urllib2.py
-@@ -1,7 +1,7 @@
- import unittest
- from test import support
- from test.support import os_helper
--from test.support import socket_helper
-+from test.support import requires_subprocess
- from test.support import warnings_helper
- from test import test_urllib
-
-@@ -985,6 +985,7 @@
-
- file_obj.close()
-
-+ @requires_subprocess()
- def test_http_body_pipe(self):
- # A file reading from a pipe.
- # A pipe cannot be seek'ed. There is no way to determine the
-diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py
-index d8ee66e4990..ebbd71aabe7 100644
---- a/Lib/test/test_venv.py
-+++ b/Lib/test/test_venv.py
-@@ -17,7 +17,8 @@
- import tempfile
- import shlex
- from test.support import (captured_stdout, captured_stderr, requires_zlib,
-- skip_if_broken_multiprocessing_synchronize)
-+ skip_if_broken_multiprocessing_synchronize,
-+ requires_subprocess, is_apple_mobile)
- from test.support.os_helper import (can_symlink, EnvironmentVarGuard, rmtree)
- import unittest
- import venv
-@@ -35,6 +36,12 @@
- or sys._base_executable != sys.executable,
- 'cannot run venv.create from within a venv on this platform')
-
-+# Skip tests on iOS/tvOS/watchOS
-+if is_apple_mobile:
-+ raise unittest.SkipTest(f"venv tests not required on {sys.platform}")
-+
-+
-+@requires_subprocess()
- def check_output(cmd, encoding=None):
- p = subprocess.Popen(cmd,
- stdout=subprocess.PIPE,
-diff --git a/Lib/test/test_wait3.py b/Lib/test/test_wait3.py
-index aa166baa400..964fd82e38f 100644
---- a/Lib/test/test_wait3.py
-+++ b/Lib/test/test_wait3.py
-@@ -15,6 +15,9 @@
- if not hasattr(os, 'wait3'):
- raise unittest.SkipTest("os.wait3 not defined")
-
-+if support.is_apple_mobile:
-+ raise unittest.SkipTest("os.wait3 doesn't work on Apple mobile")
-+
- class Wait3Test(ForkWait):
- def wait_impl(self, cpid, *, exitcode):
- # This many iterations can be required, since some previously run
-diff --git a/Lib/test/test_webbrowser.py b/Lib/test/test_webbrowser.py
-index 673cc995d3f..547fcf40ac7 100644
---- a/Lib/test/test_webbrowser.py
-+++ b/Lib/test/test_webbrowser.py
-@@ -5,8 +5,10 @@
- import subprocess
- from unittest import mock
- from test import support
-+from test.support import is_apple_mobile
- from test.support import import_helper
- from test.support import os_helper
-+from test.support import requires_subprocess
-
-
- URL = 'http://www.example.com'
-@@ -22,6 +24,7 @@
- return 0
-
-
-+@requires_subprocess()
- class CommandTestMixin:
-
- def _test(self, meth, *, args=[URL], kw={}, options, arguments):
-@@ -217,6 +220,73 @@
- arguments=['openURL({},new-tab)'.format(URL)])
-
-
-+@unittest.skipUnless(sys.platform == "ios", "Test only applicable to iOS")
-+class IOSBrowserTest(unittest.TestCase):
-+ def _obj_ref(self, *args):
-+ # Construct a string representation of the arguments that can be used
-+ # as a proxy for object instance references
-+ return "|".join(str(a) for a in args)
-+
-+ @unittest.skipIf(getattr(webbrowser, "objc", None) is None,
-+ "iOS Webbrowser tests require ctypes")
-+ def setUp(self):
-+ # Intercept the the objc library. Wrap the calls to get the
-+ # references to classes and selectors to return strings, and
-+ # wrap msgSend to return stringified object references
-+ self.orig_objc = webbrowser.objc
-+
-+ webbrowser.objc = mock.Mock()
-+ webbrowser.objc.objc_getClass = lambda cls: f"C#{cls.decode()}"
-+ webbrowser.objc.sel_registerName = lambda sel: f"S#{sel.decode()}"
-+ webbrowser.objc.objc_msgSend.side_effect = self._obj_ref
-+
-+ def tearDown(self):
-+ webbrowser.objc = self.orig_objc
-+
-+ def _test(self, meth, **kwargs):
-+ # The browser always gets focus, there's no concept of separate browser
-+ # windows, and there's no API-level control over creating a new tab.
-+ # Therefore, all calls to webbrowser are effectively the same.
-+ getattr(webbrowser, meth)(URL, **kwargs)
-+
-+ # The ObjC String version of the URL is created with UTF-8 encoding
-+ url_string_args = [
-+ "C#NSString",
-+ "S#stringWithCString:encoding:",
-+ b'http://www.example.com',
-+ 4,
-+ ]
-+ # The NSURL version of the URL is created from that string
-+ url_obj_args = [
-+ "C#NSURL",
-+ "S#URLWithString:",
-+ self._obj_ref(*url_string_args),
-+ ]
-+ # The openURL call is invoked on the shared application
-+ shared_app_args = ["C#UIApplication", "S#sharedApplication"]
-+
-+ # Verify that the last call is the one that opens the URL.
-+ webbrowser.objc.objc_msgSend.assert_called_with(
-+ self._obj_ref(*shared_app_args),
-+ "S#openURL:options:completionHandler:",
-+ self._obj_ref(*url_obj_args),
-+ None,
-+ None
-+ )
-+
-+ def test_open(self):
-+ self._test('open')
-+
-+ def test_open_with_autoraise_false(self):
-+ self._test('open', autoraise=False)
-+
-+ def test_open_new(self):
-+ self._test('open_new')
-+
-+ def test_open_new_tab(self):
-+ self._test('open_new_tab')
-+
-+
- class BrowserRegistrationTest(unittest.TestCase):
-
- def setUp(self):
-@@ -300,6 +370,10 @@
- webbrowser.register(name, None, webbrowser.GenericBrowser(name))
- webbrowser.get(sys.executable)
-
-+ @unittest.skipIf(
-+ is_apple_mobile,
-+ "Apple mobile doesn't allow modifying browser with environment"
-+ )
- def test_environment(self):
- webbrowser = import_helper.import_fresh_module('webbrowser')
- try:
-@@ -311,6 +385,10 @@
- webbrowser = import_helper.import_fresh_module('webbrowser')
- webbrowser.get()
-
-+ @unittest.skipIf(
-+ is_apple_mobile,
-+ "Apple mobile doesn't allow modifying browser with environment"
-+ )
- def test_environment_preferred(self):
- webbrowser = import_helper.import_fresh_module('webbrowser')
- try:
-diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py
-index b4f71a8b3f6..50bf8f4690d 100644
---- a/Lib/test/test_zipfile.py
-+++ b/Lib/test/test_zipfile.py
-@@ -21,7 +21,7 @@
- from tempfile import TemporaryFile
- from random import randint, random, randbytes
-
--from test.support import script_helper
-+from test.support import script_helper, requires_subprocess
- from test.support import (findfile, requires_zlib, requires_bz2,
- requires_lzma, captured_stdout)
- from test.support.os_helper import TESTFN, unlink, rmtree, temp_dir, temp_cwd
-@@ -2839,6 +2839,7 @@
- @unittest.skipUnless(sys.executable, 'sys.executable required.')
- @unittest.skipUnless(os.access('/bin/bash', os.X_OK),
- 'Test relies on #!/bin/bash working.')
-+ @requires_subprocess()
- def test_execute_zip2(self):
- output = subprocess.check_output([self.exe_zip, sys.executable])
- self.assertIn(b'number in executable: 5', output)
-@@ -2846,6 +2847,7 @@
- @unittest.skipUnless(sys.executable, 'sys.executable required.')
- @unittest.skipUnless(os.access('/bin/bash', os.X_OK),
- 'Test relies on #!/bin/bash working.')
-+ @requires_subprocess()
- def test_execute_zip64(self):
- output = subprocess.check_output([self.exe_zip64, sys.executable])
- self.assertIn(b'number in executable: 5', output)
-diff --git a/Lib/test/test_zipimport_support.py b/Lib/test/test_zipimport_support.py
-index 7bf50a33728..d172895be51 100644
---- a/Lib/test/test_zipimport_support.py
-+++ b/Lib/test/test_zipimport_support.py
-@@ -13,7 +13,7 @@
- import inspect
- import linecache
- import unittest
--from test.support import os_helper
-+from test.support import os_helper, is_apple_mobile
- from test.support.script_helper import (spawn_python, kill_python, assert_python_ok,
- make_script, make_zip_script)
-
-@@ -92,6 +92,7 @@
- finally:
- del sys.modules["zip_pkg"]
-
-+ @unittest.skipIf(is_apple_mobile, "FIXME: Edge case of doctest importer")
- def test_doctest_issue4197(self):
- # To avoid having to keep two copies of the doctest module's
- # unit tests in sync, this test works by taking the source of
-diff --git a/Lib/unittest/test/test_program.py b/Lib/unittest/test/test_program.py
-index b7fbbc1e7ba..a544819d516 100644
---- a/Lib/unittest/test/test_program.py
-+++ b/Lib/unittest/test/test_program.py
-@@ -1,5 +1,3 @@
--import io
--
- import os
- import sys
- import subprocess
-@@ -427,6 +425,7 @@
-
- self.assertEqual(program.testNamePatterns, ['*foo*', '*bar*', '*pat*'])
-
-+ @support.requires_subprocess()
- def testSelectedTestNamesFunctionalTest(self):
- def run_unittest(args):
- p = subprocess.Popen([sys.executable, '-m', 'unittest'] + args,
-diff --git a/Lib/unittest/test/test_runner.py b/Lib/unittest/test/test_runner.py
-index 0082d394dc9..c6ef4851745 100644
---- a/Lib/unittest/test/test_runner.py
-+++ b/Lib/unittest/test/test_runner.py
-@@ -9,6 +9,7 @@
-
- from unittest.test.support import (LoggingResult,
- ResultWithNoStartTestRunStopTestRun)
-+from test import support
-
-
- def resultFactory(*_):
-@@ -1176,6 +1177,7 @@
- expectedresult = (runner.stream, DESCRIPTIONS, VERBOSITY)
- self.assertEqual(runner._makeResult(), expectedresult)
-
-+ @support.requires_subprocess()
- def test_warnings(self):
- """
- Check that warnings argument of TextTestRunner correctly affects the
-diff --git a/Lib/webbrowser.py b/Lib/webbrowser.py
-index ec3cece48c9..34a772ab3c4 100755
---- a/Lib/webbrowser.py
-+++ b/Lib/webbrowser.py
-@@ -532,6 +532,9 @@
- # OS X can use below Unix support (but we prefer using the OS X
- # specific stuff)
-
-+ if sys.platform == "ios":
-+ register("iosbrowser", None, IOSBrowser(), preferred=True)
-+
- if sys.platform == "serenityos":
- # SerenityOS webbrowser, simply called "Browser".
- register("Browser", None, BackgroundBrowser("Browser"))
-@@ -688,6 +691,70 @@
- rc = osapipe.close()
- return not rc
-
-+#
-+# Platform support for iOS
-+#
-+if sys.platform == "ios":
-+ from _ios_support import objc
-+ if objc:
-+ # If objc exists, we know ctypes is also importable.
-+ from ctypes import c_void_p, c_char_p, c_ulong
-+
-+ class IOSBrowser(BaseBrowser):
-+ def open(self, url, new=0, autoraise=True):
-+ sys.audit("webbrowser.open", url)
-+ # If ctypes isn't available, we can't open a browser
-+ if objc is None:
-+ return False
-+
-+ # All the messages in this call return object references.
-+ objc.objc_msgSend.restype = c_void_p
-+
-+ # This is the equivalent of:
-+ # NSString url_string =
-+ # [NSString stringWithCString:url.encode("utf-8")
-+ # encoding:NSUTF8StringEncoding];
-+ NSString = objc.objc_getClass(b"NSString")
-+ constructor = objc.sel_registerName(b"stringWithCString:encoding:")
-+ objc.objc_msgSend.argtypes = [c_void_p, c_void_p, c_char_p, c_ulong]
-+ url_string = objc.objc_msgSend(
-+ NSString,
-+ constructor,
-+ url.encode("utf-8"),
-+ 4, # NSUTF8StringEncoding = 4
-+ )
-+
-+ # Create an NSURL object representing the URL
-+ # This is the equivalent of:
-+ # NSURL *nsurl = [NSURL URLWithString:url];
-+ NSURL = objc.objc_getClass(b"NSURL")
-+ urlWithString_ = objc.sel_registerName(b"URLWithString:")
-+ objc.objc_msgSend.argtypes = [c_void_p, c_void_p, c_void_p]
-+ ns_url = objc.objc_msgSend(NSURL, urlWithString_, url_string)
-+
-+ # Get the shared UIApplication instance
-+ # This code is the equivalent of:
-+ # UIApplication shared_app = [UIApplication sharedApplication]
-+ UIApplication = objc.objc_getClass(b"UIApplication")
-+ sharedApplication = objc.sel_registerName(b"sharedApplication")
-+ objc.objc_msgSend.argtypes = [c_void_p, c_void_p]
-+ shared_app = objc.objc_msgSend(UIApplication, sharedApplication)
-+
-+ # Open the URL on the shared application
-+ # This code is the equivalent of:
-+ # [shared_app openURL:ns_url
-+ # options:NIL
-+ # completionHandler:NIL];
-+ openURL_ = objc.sel_registerName(b"openURL:options:completionHandler:")
-+ objc.objc_msgSend.argtypes = [
-+ c_void_p, c_void_p, c_void_p, c_void_p, c_void_p
-+ ]
-+ # Method returns void
-+ objc.objc_msgSend.restype = None
-+ objc.objc_msgSend(shared_app, openURL_, ns_url, None, None)
-+
-+ return True
-+
-
- def main():
- import getopt
---- /dev/null
-+++ b/Mac/Resources/app-store-compliance.patch
-@@ -0,0 +1 @@
-+# No compliance patching required.
-diff --git a/Makefile.pre.in b/Makefile.pre.in
-index fa99dd86c41..f6aa9d68d57 100644
---- a/Makefile.pre.in
-+++ b/Makefile.pre.in
-@@ -170,18 +170,29 @@
- EXE= @EXEEXT@
- BUILDEXE= @BUILDEXEEXT@
-
-+# Name of the patch file to apply for app store compliance
-+APP_STORE_COMPLIANCE_PATCH=@APP_STORE_COMPLIANCE_PATCH@
-+
- # Short name and location for Mac OS X Python framework
- UNIVERSALSDK=@UNIVERSALSDK@
- PYTHONFRAMEWORK= @PYTHONFRAMEWORK@
- PYTHONFRAMEWORKDIR= @PYTHONFRAMEWORKDIR@
- PYTHONFRAMEWORKPREFIX= @PYTHONFRAMEWORKPREFIX@
- PYTHONFRAMEWORKINSTALLDIR= @PYTHONFRAMEWORKINSTALLDIR@
--# Deployment target selected during configure, to be checked
-+PYTHONFRAMEWORKINSTALLNAMEPREFIX= @PYTHONFRAMEWORKINSTALLNAMEPREFIX@
-+RESSRCDIR= @RESSRCDIR@
-+# macOS deployment target selected during configure, to be checked
- # by distutils. The export statement is needed to ensure that the
- # deployment target is active during build.
- MACOSX_DEPLOYMENT_TARGET=@CONFIGURE_MACOSX_DEPLOYMENT_TARGET@
- @EXPORT_MACOSX_DEPLOYMENT_TARGET@export MACOSX_DEPLOYMENT_TARGET
-
-+# iOS Deployment target selected during configure. Unlike macOS, the iOS
-+# deployment target is controlled using `-mios-version-min` arguments added to
-+# CFLAGS and LDFLAGS by the configure script. This variable is not used during
-+# the build, and is only listed here so it will be included in sysconfigdata.
-+IPHONEOS_DEPLOYMENT_TARGET=@IPHONEOS_DEPLOYMENT_TARGET@
-+
- # Option to install to strip binaries
- STRIPFLAG=-s
-
-@@ -307,6 +318,8 @@
- ##########################################################################
-
- LIBFFI_INCLUDEDIR= @LIBFFI_INCLUDEDIR@
-+LIBFFI_LIBDIR= @LIBFFI_LIBDIR@
-+LIBFFI_LIB= @LIBFFI_LIB@
-
- ##########################################################################
- # Parser
-@@ -471,7 +484,7 @@
-
- # Default target
- all: @DEF_MAKE_ALL_RULE@
--build_all: check-clean-src $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks \
-+build_all: check-clean-src check-app-store-compliance $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks \
- Programs/_testembed python-config
-
- # Check that the source is clean when building out of source.
-@@ -483,6 +496,16 @@
- exit 1; \
- fi
-
-+# Check that the app store compliance patch can be applied (if configured).
-+# This is checked as a dry-run against the original library sources;
-+# the patch will be actually applied during the install phase.
-+.PHONY: check-app-store-compliance
-+check-app-store-compliance:
-+ @if [ "$(APP_STORE_COMPLIANCE_PATCH)" != "" ]; then \
-+ patch --dry-run --quiet --force --strip 1 --directory "$(abs_srcdir)" --input "$(abs_srcdir)/$(APP_STORE_COMPLIANCE_PATCH)"; \
-+ echo "App store compliance patch can be applied."; \
-+ fi
-+
- # Profile generation build must start from a clean tree.
- profile-clean-stamp:
- $(MAKE) clean
-@@ -651,7 +674,7 @@
- $(BLDSHARED) $(NO_AS_NEEDED) -o $@ -Wl,-h$@ $^
-
- libpython$(LDVERSION).dylib: $(LIBRARY_OBJS)
-- $(CC) -dynamiclib -Wl,-single_module $(PY_CORE_LDFLAGS) -undefined dynamic_lookup -Wl,-install_name,$(prefix)/lib/libpython$(LDVERSION).dylib -Wl,-compatibility_version,$(VERSION) -Wl,-current_version,$(VERSION) -o $@ $(LIBRARY_OBJS) $(DTRACE_OBJS) $(SHLIBS) $(LIBC) $(LIBM); \
-+ $(CC) -dynamiclib $(PY_CORE_LDFLAGS) -undefined dynamic_lookup -Wl,-install_name,$(prefix)/lib/libpython$(LDVERSION).dylib -Wl,-compatibility_version,$(VERSION) -Wl,-current_version,$(VERSION) -o $@ $(LIBRARY_OBJS) $(DTRACE_OBJS) $(SHLIBS) $(LIBC) $(LIBM); \
-
-
- libpython$(VERSION).sl: $(LIBRARY_OBJS)
-@@ -675,14 +698,13 @@
- # This rule is here for OPENSTEP/Rhapsody/MacOSX. It builds a temporary
- # minimal framework (not including the Lib directory and such) in the current
- # directory.
--RESSRCDIR=Mac/Resources/framework
- $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK): \
- $(LIBRARY) \
- $(RESSRCDIR)/Info.plist
- $(INSTALL) -d -m $(DIRMODE) $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)
- $(CC) -o $(LDLIBRARY) $(PY_CORE_LDFLAGS) -dynamiclib \
-- -all_load $(LIBRARY) -Wl,-single_module \
-- -install_name $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK) \
-+ -all_load $(LIBRARY) \
-+ -install_name $(DESTDIR)$(PYTHONFRAMEWORKINSTALLNAMEPREFIX)/$(PYTHONFRAMEWORK) \
- -compatibility_version $(VERSION) \
- -current_version $(VERSION) \
- -framework CoreFoundation $(LIBS);
-@@ -694,6 +716,21 @@
- $(LN) -fsn Versions/Current/$(PYTHONFRAMEWORK) $(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK)
- $(LN) -fsn Versions/Current/Resources $(PYTHONFRAMEWORKDIR)/Resources
-
-+# This rule is for iOS, which requires an annoyingly just slighly different
-+# format for frameworks to macOS. It *doesn't* use a versioned framework, and
-+# the Info.plist must be in the root of the framework.
-+$(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK): \
-+ $(LIBRARY) \
-+ $(RESSRCDIR)/Info.plist
-+ $(INSTALL) -d -m $(DIRMODE) $(PYTHONFRAMEWORKDIR)
-+ $(CC) -o $(LDLIBRARY) $(PY_CORE_LDFLAGS) -dynamiclib \
-+ -all_load $(LIBRARY) \
-+ -install_name $(PYTHONFRAMEWORKINSTALLNAMEPREFIX)/$(PYTHONFRAMEWORK) \
-+ -compatibility_version $(VERSION) \
-+ -current_version $(VERSION) \
-+ -framework CoreFoundation $(LIBS);
-+ $(INSTALL_DATA) $(RESSRCDIR)/Info.plist $(PYTHONFRAMEWORKDIR)/Info.plist
-+
- # This rule builds the Cygwin Python DLL and import library if configured
- # for a shared core library; otherwise, this rule is a noop.
- $(DLLLIBRARY) libpython$(LDVERSION).dll.a: $(LIBRARY_OBJS)
-@@ -1236,6 +1273,36 @@
- $(RUNSHARED) /usr/libexec/oah/translate \
- ./$(BUILDPYTHON) -E -m test -j 0 -u all $(TESTOPTS)
-
-+# Run the test suite on the iOS simulator. Must be run on a macOS machine with
-+# a full Xcode install that has an iPhone SE (3rd edition) simulator available.
-+# This must be run *after* a `make install` has completed the build. The
-+# `--with-framework-name` argument *cannot* be used when configuring the build.
-+XCFOLDER:=iOSTestbed.$(MULTIARCH).$(shell date +%s)
-+.PHONY: testios
-+testios:
-+ @if test "$(MACHDEP)" != "ios"; then \
-+ echo "Cannot run the iOS testbed for a non-iOS build."; \
-+ exit 1;\
-+ fi
-+ @if test "$(findstring -iphonesimulator,$(MULTIARCH))" != "-iphonesimulator"; then \
-+ echo "Cannot run the iOS testbed for non-simulator builds."; \
-+ exit 1;\
-+ fi
-+ @if test $(PYTHONFRAMEWORK) != "Python"; then \
-+ echo "Cannot run the iOS testbed with a non-default framework name."; \
-+ exit 1;\
-+ fi
-+ @if ! test -d $(PYTHONFRAMEWORKPREFIX); then \
-+ echo "Cannot find a finalized iOS Python.framework. Have you run 'make install' to finalize the framework build?"; \
-+ exit 1;\
-+ fi
-+
-+ # Clone the testbed project into the XCFOLDER
-+ $(PYTHON_FOR_BUILD) $(srcdir)/iOS/testbed clone --framework $(PYTHONFRAMEWORKPREFIX) "$(XCFOLDER)"
-+
-+ # Run the testbed project
-+ $(PYTHON_FOR_BUILD) "$(XCFOLDER)" run --verbose -- test -uall --single-process --rerun -W
-+
- # Like testall, but with only one pass and without multiple processes.
- # Run an optional script to include information about the build environment.
- buildbottest: build_all platform
-@@ -1264,7 +1331,11 @@
- multissltest: build_all
- $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/ssl/multissltests.py
-
--install: @FRAMEWORKINSTALLFIRST@ commoninstall bininstall maninstall @FRAMEWORKINSTALLLAST@
-+# All install targets use the "all" target as synchronization point to
-+# prevent race conditions with PGO builds. PGO builds use recursive make,
-+# which can lead to two parallel `./python setup.py build` processes that
-+# step on each others toes.
-+install: @FRAMEWORKINSTALLFIRST@ @INSTALLTARGETS@ @FRAMEWORKINSTALLLAST@
- if test "x$(ENSUREPIP)" != "xno" ; then \
- case $(ENSUREPIP) in \
- upgrade) ensurepip="--upgrade" ;; \
-@@ -1601,7 +1672,16 @@
- $(INSTALL_DATA) $(srcdir)/Modules/xxmodule.c \
- $(DESTDIR)$(LIBDEST)/distutils/tests ; \
- fi
-- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
-+ @ # If app store compliance has been configured, apply the patch to the
-+ @ # installed library code. The patch has been previously validated against
-+ @ # the original source tree, so we can ignore any errors that are raised
-+ @ # due to files that are missing because of --disable-test-modules etc.
-+ @if [ "$(APP_STORE_COMPLIANCE_PATCH)" != "" ]; then \
-+ echo "Applying app store compliance patch"; \
-+ patch --force --reject-file "$(abs_builddir)/app-store-compliance.rej" --strip 2 --directory "$(DESTDIR)$(LIBDEST)" --input "$(abs_srcdir)/$(APP_STORE_COMPLIANCE_PATCH)" || true ; \
-+ fi
-+ @ # Build PYC files for the 3 optimization levels (0, 1, 2)
-+ -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
- $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
- -j0 -d $(LIBDEST) -f \
- -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
-@@ -1771,9 +1851,11 @@
- # automatically set prefix to the location deep down in the framework, so we
- # only have to cater for the structural bits of the framework.
-
--frameworkinstallframework: frameworkinstallstructure install frameworkinstallmaclib
-+frameworkinstallframework: @FRAMEWORKINSTALLFIRST@ install frameworkinstallmaclib
-
--frameworkinstallstructure: $(LDLIBRARY)
-+# macOS uses a versioned frameworks structure that includes a full install
-+.PHONY: frameworkinstallversionedstructure
-+frameworkinstallversionedstructure: $(LDLIBRARY)
- @if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
- echo Not configured with --enable-framework; \
- exit 1; \
-@@ -1794,6 +1876,27 @@
- $(LN) -fsn Versions/Current/Resources $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Resources
- $(INSTALL_SHARED) $(LDLIBRARY) $(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/$(LDLIBRARY)
-
-+# iOS/tvOS/watchOS uses a non-versioned framework with Info.plist in the
-+# framework root, no .lproj data, and only stub compilation assistance binaries
-+.PHONY: frameworkinstallunversionedstructure
-+frameworkinstallunversionedstructure: $(LDLIBRARY)
-+ @if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
-+ echo Not configured with --enable-framework; \
-+ exit 1; \
-+ else true; \
-+ fi
-+ if test -d $(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/include; then \
-+ echo "Clearing stale header symlink directory"; \
-+ rm -rf $(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/include; \
-+ fi
-+ $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)
-+ sed 's/%VERSION%/'"`$(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import platform; print(platform.python_version())'`"'/g' < $(RESSRCDIR)/Info.plist > $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Info.plist
-+ $(INSTALL_SHARED) $(LDLIBRARY) $(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/$(LDLIBRARY)
-+ $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(BINDIR)
-+ for file in $(srcdir)/$(RESSRCDIR)/bin/* ; do \
-+ $(INSTALL) -m $(EXEMODE) $$file $(DESTDIR)$(BINDIR); \
-+ done
-+
- # This installs Mac/Lib into the framework
- # Install a number of symlinks to keep software that expects a normal unix
- # install (which includes python-config) happy.
-@@ -1828,6 +1931,19 @@
- frameworkinstallextras:
- cd Mac && $(MAKE) installextras DESTDIR="$(DESTDIR)"
-
-+# On iOS, bin/lib can't live inside the framework; include needs to be called
-+# "Headers", but *must* be in the framework, and *not* include the `python3.X`
-+# subdirectory. The install has put these folders in the same folder as
-+# Python.framework; Move the headers to their final framework-compatible home.
-+.PHONY: frameworkinstallmobileheaders
-+frameworkinstallmobileheaders: frameworkinstallunversionedstructure inclinstall
-+ if test -d $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Headers; then \
-+ echo "Removing old framework headers"; \
-+ rm -rf $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Headers; \
-+ fi
-+ mv "$(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/include/python$(LDVERSION)" "$(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Headers"
-+ $(LN) -fs "../$(PYTHONFRAMEWORKDIR)/Headers" "$(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/include/python$(LDVERSION)"
-+
- # Build the toplevel Makefile
- Makefile.pre: $(srcdir)/Makefile.pre.in config.status
- CONFIG_FILES=Makefile.pre CONFIG_HEADERS= $(SHELL) config.status
-@@ -1928,6 +2044,10 @@
- -find build -type f -a ! -name '*.gc??' -exec rm -f {} ';'
- -rm -f Include/pydtrace_probes.h
- -rm -f profile-gen-stamp
-+ -rm -rf iOS/testbed/Python.xcframework/ios-*/bin
-+ -rm -rf iOS/testbed/Python.xcframework/ios-*/lib
-+ -rm -rf iOS/testbed/Python.xcframework/ios-*/include
-+ -rm -rf iOS/testbed/Python.xcframework/ios-*/Python.framework
-
- profile-removal:
- find . -name '*.gc??' -exec rm -f {} ';'
-@@ -1949,6 +2069,8 @@
- config.cache config.log pyconfig.h Modules/config.c
- -rm -rf build platform
- -rm -rf $(PYTHONFRAMEWORKDIR)
-+ -rm -rf iOS/Frameworks
-+ -rm -rf iOSTestbed.*
- -rm -f python-config.py python-config
-
- # Make things extra clean, before making a distribution:
-@@ -2028,7 +2150,7 @@
- .PHONY: all build_all sharedmods check-clean-src oldsharedmods test quicktest
- .PHONY: install altinstall oldsharedinstall bininstall altbininstall
- .PHONY: maninstall libinstall inclinstall libainstall sharedinstall
--.PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure
-+.PHONY: frameworkinstall frameworkinstallframework
- .PHONY: frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools
- .PHONY: frameworkaltinstallunixtools recheck clean clobber distclean
- .PHONY: smelly funny patchcheck touch altmaninstall commoninstall
-diff --git a/Modules/getpath.c b/Modules/getpath.c
-index ef6dd59a084..e8f91831286 100644
---- a/Modules/getpath.c
-+++ b/Modules/getpath.c
-@@ -10,6 +10,7 @@
- #include
-
- #ifdef __APPLE__
-+# include "TargetConditionals.h"
- # include
- #endif
-
-@@ -1090,7 +1091,7 @@
- #endif /* HAVE_READLINK */
-
-
--#ifdef WITH_NEXT_FRAMEWORK
-+#if defined(WITH_NEXT_FRAMEWORK) && !defined(TARGET_OS_IPHONE)
- static PyStatus
- calculate_argv0_path_framework(PyCalculatePath *calculate, _PyPathConfig *pathconfig)
- {
-@@ -1184,7 +1185,7 @@
- return _PyStatus_NO_MEMORY();
- }
-
--#ifdef WITH_NEXT_FRAMEWORK
-+#if defined(WITH_NEXT_FRAMEWORK) && !defined(TARGET_OS_IPHONE)
- status = calculate_argv0_path_framework(calculate, pathconfig);
- if (_PyStatus_EXCEPTION(status)) {
- return status;
-diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
-index feffa43cfd0..50397b35207 100644
---- a/Modules/posixmodule.c
-+++ b/Modules/posixmodule.c
-@@ -332,8 +332,6 @@
- # else
- /* Unix functions that the configure script doesn't check for */
- # ifndef __VXWORKS__
--# define HAVE_EXECV 1
--# define HAVE_FORK 1
- # if defined(__USLC__) && defined(__SCO_VERSION__) /* SCO UDK Compiler */
- # define HAVE_FORK1 1
- # endif
-@@ -346,7 +344,6 @@
- # define HAVE_KILL 1
- # define HAVE_OPENDIR 1
- # define HAVE_PIPE 1
--# define HAVE_SYSTEM 1
- # define HAVE_WAIT 1
- # define HAVE_TTYNAME 1
- # endif /* _MSC_VER */
-diff --git a/Python/importlib_external.h b/Python/importlib_external.h
-index e77ca4c2194..724aefabdee 100644
---- a/Python/importlib_external.h
-+++ b/Python/importlib_external.h
-@@ -1,7 +1,7 @@
- /* Auto-generated by Programs/_freeze_importlib.c */
- const unsigned char _Py_M__importlib_bootstrap_external[] = {
- 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-- 0,5,0,0,0,64,0,0,0,115,250,2,0,0,100,0,
-+ 0,5,0,0,0,64,0,0,0,115,10,3,0,0,100,0,
- 90,0,100,1,97,1,100,2,100,1,108,2,90,2,100,2,
- 100,1,108,3,90,3,100,2,100,1,108,4,90,4,100,2,
- 100,1,108,5,90,5,100,2,100,1,108,6,90,6,101,4,
-@@ -21,21 +21,21 @@
- 132,0,90,30,100,28,100,29,132,0,90,31,100,30,100,31,
- 132,0,90,32,100,32,100,33,132,0,90,33,101,8,114,150,
- 100,34,100,35,132,0,90,34,110,4,100,36,100,35,132,0,
-- 90,34,100,112,100,38,100,39,132,1,90,35,101,36,101,35,
-+ 90,34,100,114,100,38,100,39,132,1,90,35,101,36,101,35,
- 106,37,131,1,90,38,100,40,160,39,100,41,100,42,161,2,
- 100,43,23,0,90,40,101,41,160,42,101,40,100,42,161,2,
- 90,43,100,44,90,44,100,45,90,45,100,46,103,1,90,46,
- 101,8,114,192,101,46,160,47,100,47,161,1,1,0,101,2,
- 160,48,161,0,90,49,100,48,103,1,90,50,101,50,4,0,
-- 90,51,90,52,100,113,100,1,100,49,156,1,100,50,100,51,
-+ 90,51,90,52,100,115,100,1,100,49,156,1,100,50,100,51,
- 132,3,90,53,100,52,100,53,132,0,90,54,100,54,100,55,
- 132,0,90,55,100,56,100,57,132,0,90,56,100,58,100,59,
- 132,0,90,57,100,60,100,61,132,0,90,58,100,62,100,63,
- 132,0,90,59,100,64,100,65,132,0,90,60,100,66,100,67,
-- 132,0,90,61,100,68,100,69,132,0,90,62,100,114,100,70,
-- 100,71,132,1,90,63,100,115,100,72,100,73,132,1,90,64,
-- 100,116,100,75,100,76,132,1,90,65,100,77,100,78,132,0,
-- 90,66,101,67,131,0,90,68,100,113,100,1,101,68,100,79,
-+ 132,0,90,61,100,68,100,69,132,0,90,62,100,116,100,70,
-+ 100,71,132,1,90,63,100,117,100,72,100,73,132,1,90,64,
-+ 100,118,100,75,100,76,132,1,90,65,100,77,100,78,132,0,
-+ 90,66,101,67,131,0,90,68,100,115,100,1,101,68,100,79,
- 156,2,100,80,100,81,132,3,90,69,71,0,100,82,100,83,
- 132,0,100,83,131,2,90,70,71,0,100,84,100,85,132,0,
- 100,85,131,2,90,71,71,0,100,86,100,87,132,0,100,87,
-@@ -47,9 +47,10 @@
- 132,0,100,97,131,2,90,77,71,0,100,98,100,99,132,0,
- 100,99,131,2,90,78,71,0,100,100,100,101,132,0,100,101,
- 131,2,90,79,71,0,100,102,100,103,132,0,100,103,131,2,
-- 90,80,100,113,100,104,100,105,132,1,90,81,100,106,100,107,
-- 132,0,90,82,100,108,100,109,132,0,90,83,100,110,100,111,
-- 132,0,90,84,100,1,83,0,41,117,97,94,1,0,0,67,
-+ 90,80,71,0,100,104,100,105,132,0,100,105,101,76,131,3,
-+ 90,81,100,115,100,106,100,107,132,1,90,82,100,108,100,109,
-+ 132,0,90,83,100,110,100,111,132,0,90,84,100,112,100,113,
-+ 132,0,90,85,100,1,83,0,41,119,97,94,1,0,0,67,
- 111,114,101,32,105,109,112,108,101,109,101,110,116,97,116,105,
- 111,110,32,111,102,32,112,97,116,104,45,98,97,115,101,100,
- 32,105,109,112,111,114,116,46,10,10,84,104,105,115,32,109,
-@@ -90,2569 +91,2629 @@
- 41,2,114,5,0,0,0,218,1,115,114,7,0,0,0,114,
- 7,0,0,0,114,8,0,0,0,218,9,60,115,101,116,99,
- 111,109,112,62,50,0,0,0,115,2,0,0,0,22,0,114,
-- 13,0,0,0,41,1,218,3,119,105,110,41,2,90,6,99,
-- 121,103,119,105,110,90,6,100,97,114,119,105,110,99,0,0,
-- 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,
-- 0,0,3,0,0,0,115,62,0,0,0,116,0,106,1,160,
-- 2,116,3,161,1,114,25,116,0,106,1,160,2,116,4,161,
-- 1,114,15,100,1,137,0,110,2,100,2,137,0,135,0,102,
-- 1,100,3,100,4,132,8,125,0,124,0,83,0,100,5,100,
-- 4,132,0,125,0,124,0,83,0,41,6,78,90,12,80,89,
-- 84,72,79,78,67,65,83,69,79,75,115,12,0,0,0,80,
-- 89,84,72,79,78,67,65,83,69,79,75,99,0,0,0,0,
-- 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,
-- 19,0,0,0,115,20,0,0,0,116,0,106,1,106,2,12,
-- 0,111,9,136,0,116,3,106,4,118,0,83,0,41,1,122,
-- 94,84,114,117,101,32,105,102,32,102,105,108,101,110,97,109,
-- 101,115,32,109,117,115,116,32,98,101,32,99,104,101,99,107,
-- 101,100,32,99,97,115,101,45,105,110,115,101,110,115,105,116,
-- 105,118,101,108,121,32,97,110,100,32,105,103,110,111,114,101,
-- 32,101,110,118,105,114,111,110,109,101,110,116,32,102,108,97,
-- 103,115,32,97,114,101,32,110,111,116,32,115,101,116,46,41,
-- 5,218,3,115,121,115,218,5,102,108,97,103,115,218,18,105,
-- 103,110,111,114,101,95,101,110,118,105,114,111,110,109,101,110,
-- 116,218,3,95,111,115,90,7,101,110,118,105,114,111,110,114,
-- 7,0,0,0,169,1,218,3,107,101,121,114,7,0,0,0,
-- 114,8,0,0,0,218,11,95,114,101,108,97,120,95,99,97,
-- 115,101,67,0,0,0,243,2,0,0,0,20,2,122,37,95,
-- 109,97,107,101,95,114,101,108,97,120,95,99,97,115,101,46,
-- 60,108,111,99,97,108,115,62,46,95,114,101,108,97,120,95,
-- 99,97,115,101,99,0,0,0,0,0,0,0,0,0,0,0,
-- 0,0,0,0,0,1,0,0,0,83,0,0,0,243,4,0,
-- 0,0,100,1,83,0,41,2,122,53,84,114,117,101,32,105,
-- 102,32,102,105,108,101,110,97,109,101,115,32,109,117,115,116,
-- 32,98,101,32,99,104,101,99,107,101,100,32,99,97,115,101,
-- 45,105,110,115,101,110,115,105,116,105,118,101,108,121,46,70,
-- 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
-- 7,0,0,0,114,8,0,0,0,114,21,0,0,0,71,0,
-- 0,0,243,2,0,0,0,4,2,41,5,114,15,0,0,0,
-- 218,8,112,108,97,116,102,111,114,109,218,10,115,116,97,114,
-- 116,115,119,105,116,104,218,27,95,67,65,83,69,95,73,78,
-- 83,69,78,83,73,84,73,86,69,95,80,76,65,84,70,79,
-- 82,77,83,218,35,95,67,65,83,69,95,73,78,83,69,78,
-- 83,73,84,73,86,69,95,80,76,65,84,70,79,82,77,83,
-- 95,83,84,82,95,75,69,89,41,1,114,21,0,0,0,114,
-- 7,0,0,0,114,19,0,0,0,114,8,0,0,0,218,16,
-- 95,109,97,107,101,95,114,101,108,97,120,95,99,97,115,101,
-- 60,0,0,0,115,16,0,0,0,12,1,12,1,6,1,4,
-- 2,12,2,4,7,8,253,4,3,114,29,0,0,0,99,1,
-- 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,
-- 0,0,0,67,0,0,0,115,20,0,0,0,116,0,124,0,
-- 131,1,100,1,64,0,160,1,100,2,100,3,161,2,83,0,
-- 41,4,122,42,67,111,110,118,101,114,116,32,97,32,51,50,
-- 45,98,105,116,32,105,110,116,101,103,101,114,32,116,111,32,
-- 108,105,116,116,108,101,45,101,110,100,105,97,110,46,236,3,
-- 0,0,0,255,127,255,127,3,0,233,4,0,0,0,218,6,
-- 108,105,116,116,108,101,41,2,218,3,105,110,116,218,8,116,
-- 111,95,98,121,116,101,115,41,1,218,1,120,114,7,0,0,
-- 0,114,7,0,0,0,114,8,0,0,0,218,12,95,112,97,
-- 99,107,95,117,105,110,116,51,50,79,0,0,0,114,22,0,
-- 0,0,114,36,0,0,0,99,1,0,0,0,0,0,0,0,
-- 0,0,0,0,1,0,0,0,4,0,0,0,67,0,0,0,
-- 243,28,0,0,0,116,0,124,0,131,1,100,1,107,2,115,
-- 8,74,0,130,1,116,1,160,2,124,0,100,2,161,2,83,
-- 0,41,3,122,47,67,111,110,118,101,114,116,32,52,32,98,
-+ 13,0,0,0,41,1,218,3,119,105,110,41,5,90,6,99,
-+ 121,103,119,105,110,90,6,100,97,114,119,105,110,218,3,105,
-+ 111,115,218,4,116,118,111,115,218,7,119,97,116,99,104,111,
-+ 115,99,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
-+ 0,0,3,0,0,0,3,0,0,0,115,62,0,0,0,116,
-+ 0,106,1,160,2,116,3,161,1,114,25,116,0,106,1,160,
-+ 2,116,4,161,1,114,15,100,1,137,0,110,2,100,2,137,
-+ 0,135,0,102,1,100,3,100,4,132,8,125,0,124,0,83,
-+ 0,100,5,100,4,132,0,125,0,124,0,83,0,41,6,78,
-+ 90,12,80,89,84,72,79,78,67,65,83,69,79,75,115,12,
-+ 0,0,0,80,89,84,72,79,78,67,65,83,69,79,75,99,
-+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-+ 2,0,0,0,19,0,0,0,115,20,0,0,0,116,0,106,
-+ 1,106,2,12,0,111,9,136,0,116,3,106,4,118,0,83,
-+ 0,41,1,122,94,84,114,117,101,32,105,102,32,102,105,108,
-+ 101,110,97,109,101,115,32,109,117,115,116,32,98,101,32,99,
-+ 104,101,99,107,101,100,32,99,97,115,101,45,105,110,115,101,
-+ 110,115,105,116,105,118,101,108,121,32,97,110,100,32,105,103,
-+ 110,111,114,101,32,101,110,118,105,114,111,110,109,101,110,116,
-+ 32,102,108,97,103,115,32,97,114,101,32,110,111,116,32,115,
-+ 101,116,46,41,5,218,3,115,121,115,218,5,102,108,97,103,
-+ 115,218,18,105,103,110,111,114,101,95,101,110,118,105,114,111,
-+ 110,109,101,110,116,218,3,95,111,115,90,7,101,110,118,105,
-+ 114,111,110,114,7,0,0,0,169,1,218,3,107,101,121,114,
-+ 7,0,0,0,114,8,0,0,0,218,11,95,114,101,108,97,
-+ 120,95,99,97,115,101,67,0,0,0,243,2,0,0,0,20,
-+ 2,122,37,95,109,97,107,101,95,114,101,108,97,120,95,99,
-+ 97,115,101,46,60,108,111,99,97,108,115,62,46,95,114,101,
-+ 108,97,120,95,99,97,115,101,99,0,0,0,0,0,0,0,
-+ 0,0,0,0,0,0,0,0,0,1,0,0,0,83,0,0,
-+ 0,243,4,0,0,0,100,1,83,0,41,2,122,53,84,114,
-+ 117,101,32,105,102,32,102,105,108,101,110,97,109,101,115,32,
-+ 109,117,115,116,32,98,101,32,99,104,101,99,107,101,100,32,
-+ 99,97,115,101,45,105,110,115,101,110,115,105,116,105,118,101,
-+ 108,121,46,70,114,7,0,0,0,114,7,0,0,0,114,7,
-+ 0,0,0,114,7,0,0,0,114,8,0,0,0,114,24,0,
-+ 0,0,71,0,0,0,243,2,0,0,0,4,2,41,5,114,
-+ 18,0,0,0,218,8,112,108,97,116,102,111,114,109,218,10,
-+ 115,116,97,114,116,115,119,105,116,104,218,27,95,67,65,83,
-+ 69,95,73,78,83,69,78,83,73,84,73,86,69,95,80,76,
-+ 65,84,70,79,82,77,83,218,35,95,67,65,83,69,95,73,
-+ 78,83,69,78,83,73,84,73,86,69,95,80,76,65,84,70,
-+ 79,82,77,83,95,83,84,82,95,75,69,89,41,1,114,24,
-+ 0,0,0,114,7,0,0,0,114,22,0,0,0,114,8,0,
-+ 0,0,218,16,95,109,97,107,101,95,114,101,108,97,120,95,
-+ 99,97,115,101,60,0,0,0,115,16,0,0,0,12,1,12,
-+ 1,6,1,4,2,12,2,4,7,8,253,4,3,114,32,0,
-+ 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,
-+ 0,0,0,4,0,0,0,67,0,0,0,115,20,0,0,0,
-+ 116,0,124,0,131,1,100,1,64,0,160,1,100,2,100,3,
-+ 161,2,83,0,41,4,122,42,67,111,110,118,101,114,116,32,
-+ 97,32,51,50,45,98,105,116,32,105,110,116,101,103,101,114,
-+ 32,116,111,32,108,105,116,116,108,101,45,101,110,100,105,97,
-+ 110,46,236,3,0,0,0,255,127,255,127,3,0,233,4,0,
-+ 0,0,218,6,108,105,116,116,108,101,41,2,218,3,105,110,
-+ 116,218,8,116,111,95,98,121,116,101,115,41,1,218,1,120,
-+ 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,
-+ 12,95,112,97,99,107,95,117,105,110,116,51,50,79,0,0,
-+ 0,114,25,0,0,0,114,39,0,0,0,99,1,0,0,0,
-+ 0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,
-+ 67,0,0,0,243,28,0,0,0,116,0,124,0,131,1,100,
-+ 1,107,2,115,8,74,0,130,1,116,1,160,2,124,0,100,
-+ 2,161,2,83,0,41,3,122,47,67,111,110,118,101,114,116,
-+ 32,52,32,98,121,116,101,115,32,105,110,32,108,105,116,116,
-+ 108,101,45,101,110,100,105,97,110,32,116,111,32,97,110,32,
-+ 105,110,116,101,103,101,114,46,114,34,0,0,0,114,35,0,
-+ 0,0,169,3,114,4,0,0,0,114,36,0,0,0,218,10,
-+ 102,114,111,109,95,98,121,116,101,115,169,1,218,4,100,97,
-+ 116,97,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-+ 0,218,14,95,117,110,112,97,99,107,95,117,105,110,116,51,
-+ 50,84,0,0,0,243,4,0,0,0,16,2,12,1,114,45,
-+ 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,
-+ 1,0,0,0,4,0,0,0,67,0,0,0,114,40,0,0,
-+ 0,41,3,122,47,67,111,110,118,101,114,116,32,50,32,98,
- 121,116,101,115,32,105,110,32,108,105,116,116,108,101,45,101,
- 110,100,105,97,110,32,116,111,32,97,110,32,105,110,116,101,
-- 103,101,114,46,114,31,0,0,0,114,32,0,0,0,169,3,
-- 114,4,0,0,0,114,33,0,0,0,218,10,102,114,111,109,
-- 95,98,121,116,101,115,169,1,218,4,100,97,116,97,114,7,
-- 0,0,0,114,7,0,0,0,114,8,0,0,0,218,14,95,
-- 117,110,112,97,99,107,95,117,105,110,116,51,50,84,0,0,
-- 0,243,4,0,0,0,16,2,12,1,114,42,0,0,0,99,
-- 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
-- 4,0,0,0,67,0,0,0,114,37,0,0,0,41,3,122,
-- 47,67,111,110,118,101,114,116,32,50,32,98,121,116,101,115,
-- 32,105,110,32,108,105,116,116,108,101,45,101,110,100,105,97,
-- 110,32,116,111,32,97,110,32,105,110,116,101,103,101,114,46,
-- 233,2,0,0,0,114,32,0,0,0,114,38,0,0,0,114,
-- 40,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-- 0,0,0,218,14,95,117,110,112,97,99,107,95,117,105,110,
-- 116,49,54,89,0,0,0,114,43,0,0,0,114,45,0,0,
-- 0,99,0,0,0,0,0,0,0,0,0,0,0,0,5,0,
-- 0,0,4,0,0,0,71,0,0,0,115,228,0,0,0,124,
-- 0,115,4,100,1,83,0,116,0,124,0,131,1,100,2,107,
-- 2,114,14,124,0,100,3,25,0,83,0,100,1,125,1,103,
-- 0,125,2,116,1,116,2,106,3,124,0,131,2,68,0,93,
-- 61,92,2,125,3,125,4,124,3,160,4,116,5,161,1,115,
-- 38,124,3,160,6,116,5,161,1,114,51,124,3,160,7,116,
-- 8,161,1,112,44,124,1,125,1,116,9,124,4,23,0,103,
-- 1,125,2,113,24,124,3,160,6,100,4,161,1,114,76,124,
-- 1,160,10,161,0,124,3,160,10,161,0,107,3,114,70,124,
-- 3,125,1,124,4,103,1,125,2,113,24,124,2,160,11,124,
-- 4,161,1,1,0,113,24,124,3,112,79,124,1,125,1,124,
-- 2,160,11,124,4,161,1,1,0,113,24,100,5,100,6,132,
-- 0,124,2,68,0,131,1,125,2,116,0,124,2,131,1,100,
-- 2,107,2,114,107,124,2,100,3,25,0,115,107,124,1,116,
-- 9,23,0,83,0,124,1,116,9,160,12,124,2,161,1,23,
-- 0,83,0,41,7,250,31,82,101,112,108,97,99,101,109,101,
-- 110,116,32,102,111,114,32,111,115,46,112,97,116,104,46,106,
-- 111,105,110,40,41,46,114,10,0,0,0,114,3,0,0,0,
-- 114,0,0,0,0,114,11,0,0,0,99,1,0,0,0,0,
-- 0,0,0,0,0,0,0,2,0,0,0,5,0,0,0,83,
-- 0,0,0,243,26,0,0,0,103,0,124,0,93,9,125,1,
-- 124,1,114,2,124,1,160,0,116,1,161,1,145,2,113,2,
-- 83,0,114,7,0,0,0,169,2,218,6,114,115,116,114,105,
-- 112,218,15,112,97,116,104,95,115,101,112,97,114,97,116,111,
-- 114,115,169,2,114,5,0,0,0,218,1,112,114,7,0,0,
-- 0,114,7,0,0,0,114,8,0,0,0,218,10,60,108,105,
-- 115,116,99,111,109,112,62,119,0,0,0,115,2,0,0,0,
-- 26,0,250,30,95,112,97,116,104,95,106,111,105,110,46,60,
-- 108,111,99,97,108,115,62,46,60,108,105,115,116,99,111,109,
-- 112,62,41,13,114,4,0,0,0,218,3,109,97,112,114,18,
-- 0,0,0,218,15,95,112,97,116,104,95,115,112,108,105,116,
-- 114,111,111,116,114,26,0,0,0,218,14,112,97,116,104,95,
-- 115,101,112,95,116,117,112,108,101,218,8,101,110,100,115,119,
-- 105,116,104,114,49,0,0,0,114,50,0,0,0,218,8,112,
-- 97,116,104,95,115,101,112,218,8,99,97,115,101,102,111,108,
-- 100,218,6,97,112,112,101,110,100,218,4,106,111,105,110,41,
-- 5,218,10,112,97,116,104,95,112,97,114,116,115,218,4,114,
-- 111,111,116,218,4,112,97,116,104,90,8,110,101,119,95,114,
-- 111,111,116,218,4,116,97,105,108,114,7,0,0,0,114,7,
-- 0,0,0,114,8,0,0,0,218,10,95,112,97,116,104,95,
-- 106,111,105,110,96,0,0,0,115,42,0,0,0,4,2,4,
-- 1,12,1,8,1,4,1,4,1,20,1,20,1,14,1,12,
-- 1,10,1,16,1,4,3,8,1,12,2,8,2,12,1,14,
-- 1,20,1,8,2,14,1,114,67,0,0,0,99,0,0,0,
-- 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,
-- 0,71,0,0,0,115,20,0,0,0,116,0,160,1,100,1,
-- 100,2,132,0,124,0,68,0,131,1,161,1,83,0,41,3,
-- 114,46,0,0,0,99,1,0,0,0,0,0,0,0,0,0,
-- 0,0,2,0,0,0,5,0,0,0,83,0,0,0,114,47,
-- 0,0,0,114,7,0,0,0,114,48,0,0,0,41,2,114,
-- 5,0,0,0,218,4,112,97,114,116,114,7,0,0,0,114,
-- 7,0,0,0,114,8,0,0,0,114,53,0,0,0,128,0,
-- 0,0,115,6,0,0,0,6,0,4,1,16,255,114,54,0,
-- 0,0,41,2,114,59,0,0,0,114,62,0,0,0,41,1,
-- 114,63,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
-- 8,0,0,0,114,67,0,0,0,126,0,0,0,115,6,0,
-- 0,0,10,2,2,1,8,255,99,1,0,0,0,0,0,0,
-- 0,0,0,0,0,2,0,0,0,4,0,0,0,3,0,0,
-- 0,115,66,0,0,0,116,0,135,0,102,1,100,1,100,2,
-- 132,8,116,1,68,0,131,1,131,1,125,1,124,1,100,3,
-- 107,0,114,19,100,4,136,0,102,2,83,0,136,0,100,5,
-- 124,1,133,2,25,0,136,0,124,1,100,6,23,0,100,5,
-- 133,2,25,0,102,2,83,0,41,7,122,32,82,101,112,108,
-- 97,99,101,109,101,110,116,32,102,111,114,32,111,115,46,112,
-- 97,116,104,46,115,112,108,105,116,40,41,46,99,1,0,0,
-- 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,
-- 0,51,0,0,0,115,26,0,0,0,129,0,124,0,93,8,
-- 125,1,136,0,160,0,124,1,161,1,86,0,1,0,113,2,
-- 100,0,83,0,169,1,78,41,1,218,5,114,102,105,110,100,
-- 114,51,0,0,0,169,1,114,65,0,0,0,114,7,0,0,
-- 0,114,8,0,0,0,114,9,0,0,0,134,0,0,0,115,
-- 4,0,0,0,2,128,24,0,122,30,95,112,97,116,104,95,
-- 115,112,108,105,116,46,60,108,111,99,97,108,115,62,46,60,
-- 103,101,110,101,120,112,114,62,114,0,0,0,0,114,10,0,
-- 0,0,78,114,3,0,0,0,41,2,218,3,109,97,120,114,
-- 50,0,0,0,41,2,114,65,0,0,0,218,1,105,114,7,
-- 0,0,0,114,71,0,0,0,114,8,0,0,0,218,11,95,
-- 112,97,116,104,95,115,112,108,105,116,132,0,0,0,115,8,
-- 0,0,0,22,2,8,1,8,1,28,1,114,74,0,0,0,
-- 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
-- 0,3,0,0,0,67,0,0,0,115,10,0,0,0,116,0,
-- 160,1,124,0,161,1,83,0,41,1,122,126,83,116,97,116,
-- 32,116,104,101,32,112,97,116,104,46,10,10,32,32,32,32,
-- 77,97,100,101,32,97,32,115,101,112,97,114,97,116,101,32,
-- 102,117,110,99,116,105,111,110,32,116,111,32,109,97,107,101,
-- 32,105,116,32,101,97,115,105,101,114,32,116,111,32,111,118,
-- 101,114,114,105,100,101,32,105,110,32,101,120,112,101,114,105,
-- 109,101,110,116,115,10,32,32,32,32,40,101,46,103,46,32,
-- 99,97,99,104,101,32,115,116,97,116,32,114,101,115,117,108,
-- 116,115,41,46,10,10,32,32,32,32,41,2,114,18,0,0,
-- 0,90,4,115,116,97,116,114,71,0,0,0,114,7,0,0,
-- 0,114,7,0,0,0,114,8,0,0,0,218,10,95,112,97,
-- 116,104,95,115,116,97,116,140,0,0,0,115,2,0,0,0,
-- 10,7,114,75,0,0,0,99,2,0,0,0,0,0,0,0,
-- 0,0,0,0,3,0,0,0,8,0,0,0,67,0,0,0,
-- 115,48,0,0,0,122,6,116,0,124,0,131,1,125,2,87,
-- 0,110,10,4,0,116,1,121,16,1,0,1,0,1,0,89,
-- 0,100,1,83,0,119,0,124,2,106,2,100,2,64,0,124,
-- 1,107,2,83,0,41,3,122,49,84,101,115,116,32,119,104,
-- 101,116,104,101,114,32,116,104,101,32,112,97,116,104,32,105,
-- 115,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,
-- 109,111,100,101,32,116,121,112,101,46,70,105,0,240,0,0,
-- 41,3,114,75,0,0,0,218,7,79,83,69,114,114,111,114,
-- 218,7,115,116,95,109,111,100,101,41,3,114,65,0,0,0,
-- 218,4,109,111,100,101,90,9,115,116,97,116,95,105,110,102,
-- 111,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-- 218,18,95,112,97,116,104,95,105,115,95,109,111,100,101,95,
-- 116,121,112,101,150,0,0,0,115,12,0,0,0,2,2,12,
-- 1,12,1,6,1,2,255,14,2,114,79,0,0,0,99,1,
-- 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,
-- 0,0,0,67,0,0,0,115,10,0,0,0,116,0,124,0,
-- 100,1,131,2,83,0,41,2,122,31,82,101,112,108,97,99,
-- 101,109,101,110,116,32,102,111,114,32,111,115,46,112,97,116,
-- 104,46,105,115,102,105,108,101,46,105,0,128,0,0,41,1,
-- 114,79,0,0,0,114,71,0,0,0,114,7,0,0,0,114,
-- 7,0,0,0,114,8,0,0,0,218,12,95,112,97,116,104,
-- 95,105,115,102,105,108,101,159,0,0,0,243,2,0,0,0,
-- 10,2,114,80,0,0,0,99,1,0,0,0,0,0,0,0,
-- 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,
-- 115,22,0,0,0,124,0,115,6,116,0,160,1,161,0,125,
-- 0,116,2,124,0,100,1,131,2,83,0,41,2,122,30,82,
-- 101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,111,
-- 115,46,112,97,116,104,46,105,115,100,105,114,46,105,0,64,
-- 0,0,41,3,114,18,0,0,0,218,6,103,101,116,99,119,
-- 100,114,79,0,0,0,114,71,0,0,0,114,7,0,0,0,
-- 114,7,0,0,0,114,8,0,0,0,218,11,95,112,97,116,
-- 104,95,105,115,100,105,114,164,0,0,0,115,6,0,0,0,
-- 4,2,8,1,10,1,114,83,0,0,0,99,1,0,0,0,
-- 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,
-- 67,0,0,0,115,62,0,0,0,124,0,115,4,100,1,83,
-- 0,116,0,160,1,124,0,161,1,100,2,25,0,160,2,100,
-- 3,100,4,161,2,125,1,116,3,124,1,131,1,100,5,107,
-- 4,111,30,124,1,160,4,100,6,161,1,112,30,124,1,160,
-- 5,100,4,161,1,83,0,41,7,250,30,82,101,112,108,97,
-+ 103,101,114,46,233,2,0,0,0,114,35,0,0,0,114,41,
-+ 0,0,0,114,43,0,0,0,114,7,0,0,0,114,7,0,
-+ 0,0,114,8,0,0,0,218,14,95,117,110,112,97,99,107,
-+ 95,117,105,110,116,49,54,89,0,0,0,114,46,0,0,0,
-+ 114,48,0,0,0,99,0,0,0,0,0,0,0,0,0,0,
-+ 0,0,5,0,0,0,4,0,0,0,71,0,0,0,115,228,
-+ 0,0,0,124,0,115,4,100,1,83,0,116,0,124,0,131,
-+ 1,100,2,107,2,114,14,124,0,100,3,25,0,83,0,100,
-+ 1,125,1,103,0,125,2,116,1,116,2,106,3,124,0,131,
-+ 2,68,0,93,61,92,2,125,3,125,4,124,3,160,4,116,
-+ 5,161,1,115,38,124,3,160,6,116,5,161,1,114,51,124,
-+ 3,160,7,116,8,161,1,112,44,124,1,125,1,116,9,124,
-+ 4,23,0,103,1,125,2,113,24,124,3,160,6,100,4,161,
-+ 1,114,76,124,1,160,10,161,0,124,3,160,10,161,0,107,
-+ 3,114,70,124,3,125,1,124,4,103,1,125,2,113,24,124,
-+ 2,160,11,124,4,161,1,1,0,113,24,124,3,112,79,124,
-+ 1,125,1,124,2,160,11,124,4,161,1,1,0,113,24,100,
-+ 5,100,6,132,0,124,2,68,0,131,1,125,2,116,0,124,
-+ 2,131,1,100,2,107,2,114,107,124,2,100,3,25,0,115,
-+ 107,124,1,116,9,23,0,83,0,124,1,116,9,160,12,124,
-+ 2,161,1,23,0,83,0,41,7,250,31,82,101,112,108,97,
- 99,101,109,101,110,116,32,102,111,114,32,111,115,46,112,97,
-- 116,104,46,105,115,97,98,115,46,70,114,0,0,0,0,114,
-- 2,0,0,0,114,1,0,0,0,114,3,0,0,0,122,2,
-- 92,92,41,6,114,18,0,0,0,114,56,0,0,0,218,7,
-- 114,101,112,108,97,99,101,114,4,0,0,0,114,26,0,0,
-- 0,114,58,0,0,0,41,2,114,65,0,0,0,114,64,0,
-- 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-- 0,218,11,95,112,97,116,104,95,105,115,97,98,115,172,0,
-- 0,0,115,8,0,0,0,4,2,4,1,22,1,32,1,114,
-- 86,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,
-- 0,1,0,0,0,3,0,0,0,67,0,0,0,115,10,0,
-- 0,0,124,0,160,0,116,1,161,1,83,0,41,1,114,84,
-- 0,0,0,41,2,114,26,0,0,0,114,50,0,0,0,114,
-- 71,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-- 0,0,0,114,86,0,0,0,180,0,0,0,114,81,0,0,
-- 0,233,182,1,0,0,99,3,0,0,0,0,0,0,0,0,
-- 0,0,0,6,0,0,0,11,0,0,0,67,0,0,0,115,
-- 170,0,0,0,100,1,160,0,124,0,116,1,124,0,131,1,
-- 161,2,125,3,116,2,160,3,124,3,116,2,106,4,116,2,
-- 106,5,66,0,116,2,106,6,66,0,124,2,100,2,64,0,
-- 161,3,125,4,122,36,116,7,160,8,124,4,100,3,161,2,
-- 143,13,125,5,124,5,160,9,124,1,161,1,1,0,87,0,
-- 100,4,4,0,4,0,131,3,1,0,110,8,49,0,115,47,
-- 119,1,1,0,1,0,1,0,89,0,1,0,116,2,160,10,
-- 124,3,124,0,161,2,1,0,87,0,100,4,83,0,4,0,
-- 116,11,121,84,1,0,1,0,1,0,122,7,116,2,160,12,
-- 124,3,161,1,1,0,87,0,130,0,4,0,116,11,121,83,
-- 1,0,1,0,1,0,89,0,130,0,119,0,119,0,41,5,
-- 122,162,66,101,115,116,45,101,102,102,111,114,116,32,102,117,
-- 110,99,116,105,111,110,32,116,111,32,119,114,105,116,101,32,
-- 100,97,116,97,32,116,111,32,97,32,112,97,116,104,32,97,
-- 116,111,109,105,99,97,108,108,121,46,10,32,32,32,32,66,
-- 101,32,112,114,101,112,97,114,101,100,32,116,111,32,104,97,
-- 110,100,108,101,32,97,32,70,105,108,101,69,120,105,115,116,
-- 115,69,114,114,111,114,32,105,102,32,99,111,110,99,117,114,
-- 114,101,110,116,32,119,114,105,116,105,110,103,32,111,102,32,
-- 116,104,101,10,32,32,32,32,116,101,109,112,111,114,97,114,
-- 121,32,102,105,108,101,32,105,115,32,97,116,116,101,109,112,
-- 116,101,100,46,250,5,123,125,46,123,125,114,87,0,0,0,
-- 90,2,119,98,78,41,13,218,6,102,111,114,109,97,116,218,
-- 2,105,100,114,18,0,0,0,90,4,111,112,101,110,90,6,
-- 79,95,69,88,67,76,90,7,79,95,67,82,69,65,84,90,
-- 8,79,95,87,82,79,78,76,89,218,3,95,105,111,218,6,
-- 70,105,108,101,73,79,218,5,119,114,105,116,101,114,85,0,
-- 0,0,114,76,0,0,0,90,6,117,110,108,105,110,107,41,
-- 6,114,65,0,0,0,114,41,0,0,0,114,78,0,0,0,
-- 90,8,112,97,116,104,95,116,109,112,90,2,102,100,218,4,
-- 102,105,108,101,114,7,0,0,0,114,7,0,0,0,114,8,
-- 0,0,0,218,13,95,119,114,105,116,101,95,97,116,111,109,
-- 105,99,185,0,0,0,115,36,0,0,0,16,5,6,1,22,
-- 1,4,255,2,2,14,3,12,1,28,255,18,2,12,1,2,
-- 1,12,1,2,3,12,254,2,1,2,1,2,254,2,253,114,
-- 95,0,0,0,105,111,13,0,0,114,44,0,0,0,114,32,
-- 0,0,0,115,2,0,0,0,13,10,90,11,95,95,112,121,
-- 99,97,99,104,101,95,95,122,4,111,112,116,45,122,3,46,
-- 112,121,122,4,46,112,121,119,122,4,46,112,121,99,41,1,
-- 218,12,111,112,116,105,109,105,122,97,116,105,111,110,99,2,
-- 0,0,0,0,0,0,0,1,0,0,0,12,0,0,0,5,
-- 0,0,0,67,0,0,0,115,80,1,0,0,124,1,100,1,
-- 117,1,114,26,116,0,160,1,100,2,116,2,161,2,1,0,
-- 124,2,100,1,117,1,114,20,100,3,125,3,116,3,124,3,
-- 131,1,130,1,124,1,114,24,100,4,110,1,100,5,125,2,
-- 116,4,160,5,124,0,161,1,125,0,116,6,124,0,131,1,
-- 92,2,125,4,125,5,124,5,160,7,100,6,161,1,92,3,
-- 125,6,125,7,125,8,116,8,106,9,106,10,125,9,124,9,
-- 100,1,117,0,114,57,116,11,100,7,131,1,130,1,100,4,
-- 160,12,124,6,114,63,124,6,110,1,124,8,124,7,124,9,
-- 103,3,161,1,125,10,124,2,100,1,117,0,114,86,116,8,
-- 106,13,106,14,100,8,107,2,114,82,100,4,125,2,110,4,
-- 116,8,106,13,106,14,125,2,116,15,124,2,131,1,125,2,
-- 124,2,100,4,107,3,114,112,124,2,160,16,161,0,115,105,
-- 116,17,100,9,160,18,124,2,161,1,131,1,130,1,100,10,
-- 160,18,124,10,116,19,124,2,161,3,125,10,124,10,116,20,
-- 100,8,25,0,23,0,125,11,116,8,106,21,100,1,117,1,
-- 114,162,116,22,124,4,131,1,115,134,116,23,116,4,160,24,
-- 161,0,124,4,131,2,125,4,124,4,100,5,25,0,100,11,
-- 107,2,114,152,124,4,100,8,25,0,116,25,118,1,114,152,
-- 124,4,100,12,100,1,133,2,25,0,125,4,116,23,116,8,
-- 106,21,124,4,160,26,116,25,161,1,124,11,131,3,83,0,
-- 116,23,124,4,116,27,124,11,131,3,83,0,41,13,97,254,
-- 2,0,0,71,105,118,101,110,32,116,104,101,32,112,97,116,
-- 104,32,116,111,32,97,32,46,112,121,32,102,105,108,101,44,
-- 32,114,101,116,117,114,110,32,116,104,101,32,112,97,116,104,
-- 32,116,111,32,105,116,115,32,46,112,121,99,32,102,105,108,
-- 101,46,10,10,32,32,32,32,84,104,101,32,46,112,121,32,
-- 102,105,108,101,32,100,111,101,115,32,110,111,116,32,110,101,
-- 101,100,32,116,111,32,101,120,105,115,116,59,32,116,104,105,
-- 115,32,115,105,109,112,108,121,32,114,101,116,117,114,110,115,
-- 32,116,104,101,32,112,97,116,104,32,116,111,32,116,104,101,
-- 10,32,32,32,32,46,112,121,99,32,102,105,108,101,32,99,
-- 97,108,99,117,108,97,116,101,100,32,97,115,32,105,102,32,
-- 116,104,101,32,46,112,121,32,102,105,108,101,32,119,101,114,
-- 101,32,105,109,112,111,114,116,101,100,46,10,10,32,32,32,
-- 32,84,104,101,32,39,111,112,116,105,109,105,122,97,116,105,
-- 111,110,39,32,112,97,114,97,109,101,116,101,114,32,99,111,
-- 110,116,114,111,108,115,32,116,104,101,32,112,114,101,115,117,
-- 109,101,100,32,111,112,116,105,109,105,122,97,116,105,111,110,
-- 32,108,101,118,101,108,32,111,102,10,32,32,32,32,116,104,
-- 101,32,98,121,116,101,99,111,100,101,32,102,105,108,101,46,
-- 32,73,102,32,39,111,112,116,105,109,105,122,97,116,105,111,
-- 110,39,32,105,115,32,110,111,116,32,78,111,110,101,44,32,
-- 116,104,101,32,115,116,114,105,110,103,32,114,101,112,114,101,
-- 115,101,110,116,97,116,105,111,110,10,32,32,32,32,111,102,
-- 32,116,104,101,32,97,114,103,117,109,101,110,116,32,105,115,
-- 32,116,97,107,101,110,32,97,110,100,32,118,101,114,105,102,
-- 105,101,100,32,116,111,32,98,101,32,97,108,112,104,97,110,
-- 117,109,101,114,105,99,32,40,101,108,115,101,32,86,97,108,
-- 117,101,69,114,114,111,114,10,32,32,32,32,105,115,32,114,
-- 97,105,115,101,100,41,46,10,10,32,32,32,32,84,104,101,
-- 32,100,101,98,117,103,95,111,118,101,114,114,105,100,101,32,
-- 112,97,114,97,109,101,116,101,114,32,105,115,32,100,101,112,
-- 114,101,99,97,116,101,100,46,32,73,102,32,100,101,98,117,
-- 103,95,111,118,101,114,114,105,100,101,32,105,115,32,110,111,
-- 116,32,78,111,110,101,44,10,32,32,32,32,97,32,84,114,
-- 117,101,32,118,97,108,117,101,32,105,115,32,116,104,101,32,
-- 115,97,109,101,32,97,115,32,115,101,116,116,105,110,103,32,
-- 39,111,112,116,105,109,105,122,97,116,105,111,110,39,32,116,
-- 111,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,
-- 110,103,10,32,32,32,32,119,104,105,108,101,32,97,32,70,
-- 97,108,115,101,32,118,97,108,117,101,32,105,115,32,101,113,
-- 117,105,118,97,108,101,110,116,32,116,111,32,115,101,116,116,
-- 105,110,103,32,39,111,112,116,105,109,105,122,97,116,105,111,
-- 110,39,32,116,111,32,39,49,39,46,10,10,32,32,32,32,
-- 73,102,32,115,121,115,46,105,109,112,108,101,109,101,110,116,
-- 97,116,105,111,110,46,99,97,99,104,101,95,116,97,103,32,
-- 105,115,32,78,111,110,101,32,116,104,101,110,32,78,111,116,
-- 73,109,112,108,101,109,101,110,116,101,100,69,114,114,111,114,
-- 32,105,115,32,114,97,105,115,101,100,46,10,10,32,32,32,
-- 32,78,122,70,116,104,101,32,100,101,98,117,103,95,111,118,
-- 101,114,114,105,100,101,32,112,97,114,97,109,101,116,101,114,
-- 32,105,115,32,100,101,112,114,101,99,97,116,101,100,59,32,
-- 117,115,101,32,39,111,112,116,105,109,105,122,97,116,105,111,
-- 110,39,32,105,110,115,116,101,97,100,122,50,100,101,98,117,
-- 103,95,111,118,101,114,114,105,100,101,32,111,114,32,111,112,
-- 116,105,109,105,122,97,116,105,111,110,32,109,117,115,116,32,
-- 98,101,32,115,101,116,32,116,111,32,78,111,110,101,114,10,
-- 0,0,0,114,3,0,0,0,218,1,46,250,36,115,121,115,
-- 46,105,109,112,108,101,109,101,110,116,97,116,105,111,110,46,
-- 99,97,99,104,101,95,116,97,103,32,105,115,32,78,111,110,
-- 101,114,0,0,0,0,122,24,123,33,114,125,32,105,115,32,
-- 110,111,116,32,97,108,112,104,97,110,117,109,101,114,105,99,
-- 122,7,123,125,46,123,125,123,125,114,11,0,0,0,114,44,
-- 0,0,0,41,28,218,9,95,119,97,114,110,105,110,103,115,
-- 218,4,119,97,114,110,218,18,68,101,112,114,101,99,97,116,
-- 105,111,110,87,97,114,110,105,110,103,218,9,84,121,112,101,
-- 69,114,114,111,114,114,18,0,0,0,218,6,102,115,112,97,
-- 116,104,114,74,0,0,0,218,10,114,112,97,114,116,105,116,
-- 105,111,110,114,15,0,0,0,218,14,105,109,112,108,101,109,
-- 101,110,116,97,116,105,111,110,218,9,99,97,99,104,101,95,
-- 116,97,103,218,19,78,111,116,73,109,112,108,101,109,101,110,
-- 116,101,100,69,114,114,111,114,114,62,0,0,0,114,16,0,
-- 0,0,218,8,111,112,116,105,109,105,122,101,218,3,115,116,
-- 114,218,7,105,115,97,108,110,117,109,218,10,86,97,108,117,
-- 101,69,114,114,111,114,114,89,0,0,0,218,4,95,79,80,
-- 84,218,17,66,89,84,69,67,79,68,69,95,83,85,70,70,
-- 73,88,69,83,218,14,112,121,99,97,99,104,101,95,112,114,
-- 101,102,105,120,114,86,0,0,0,114,67,0,0,0,114,82,
-- 0,0,0,114,50,0,0,0,218,6,108,115,116,114,105,112,
-- 218,8,95,80,89,67,65,67,72,69,41,12,114,65,0,0,
-- 0,90,14,100,101,98,117,103,95,111,118,101,114,114,105,100,
-- 101,114,96,0,0,0,218,7,109,101,115,115,97,103,101,218,
-- 4,104,101,97,100,114,66,0,0,0,90,4,98,97,115,101,
-- 114,6,0,0,0,218,4,114,101,115,116,90,3,116,97,103,
-- 90,15,97,108,109,111,115,116,95,102,105,108,101,110,97,109,
-- 101,218,8,102,105,108,101,110,97,109,101,114,7,0,0,0,
-- 114,7,0,0,0,114,8,0,0,0,218,17,99,97,99,104,
-- 101,95,102,114,111,109,95,115,111,117,114,99,101,124,1,0,
-- 0,115,72,0,0,0,8,18,6,1,2,1,4,255,8,2,
-- 4,1,8,1,12,1,10,1,12,1,16,1,8,1,8,1,
-- 8,1,24,1,8,1,12,1,6,1,8,2,8,1,8,1,
-- 8,1,14,1,14,1,12,1,10,1,8,9,14,1,24,5,
-- 12,1,2,4,4,1,8,1,2,1,4,253,12,5,114,121,
-- 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,
-- 10,0,0,0,5,0,0,0,67,0,0,0,115,40,1,0,
-- 0,116,0,106,1,106,2,100,1,117,0,114,10,116,3,100,
-- 2,131,1,130,1,116,4,160,5,124,0,161,1,125,0,116,
-- 6,124,0,131,1,92,2,125,1,125,2,100,3,125,3,116,
-- 0,106,7,100,1,117,1,114,51,116,0,106,7,160,8,116,
-- 9,161,1,125,4,124,1,160,10,124,4,116,11,23,0,161,
-- 1,114,51,124,1,116,12,124,4,131,1,100,1,133,2,25,
-- 0,125,1,100,4,125,3,124,3,115,72,116,6,124,1,131,
-- 1,92,2,125,1,125,5,124,5,116,13,107,3,114,72,116,
-- 14,116,13,155,0,100,5,124,0,155,2,157,3,131,1,130,
-- 1,124,2,160,15,100,6,161,1,125,6,124,6,100,7,118,
-- 1,114,88,116,14,100,8,124,2,155,2,157,2,131,1,130,
-- 1,124,6,100,9,107,2,114,132,124,2,160,16,100,6,100,
-- 10,161,2,100,11,25,0,125,7,124,7,160,10,116,17,161,
-- 1,115,112,116,14,100,12,116,17,155,2,157,2,131,1,130,
-- 1,124,7,116,12,116,17,131,1,100,1,133,2,25,0,125,
-- 8,124,8,160,18,161,0,115,132,116,14,100,13,124,7,155,
-- 2,100,14,157,3,131,1,130,1,124,2,160,19,100,6,161,
-- 1,100,15,25,0,125,9,116,20,124,1,124,9,116,21,100,
-- 15,25,0,23,0,131,2,83,0,41,16,97,110,1,0,0,
-- 71,105,118,101,110,32,116,104,101,32,112,97,116,104,32,116,
-- 111,32,97,32,46,112,121,99,46,32,102,105,108,101,44,32,
-- 114,101,116,117,114,110,32,116,104,101,32,112,97,116,104,32,
-- 116,111,32,105,116,115,32,46,112,121,32,102,105,108,101,46,
-- 10,10,32,32,32,32,84,104,101,32,46,112,121,99,32,102,
-- 105,108,101,32,100,111,101,115,32,110,111,116,32,110,101,101,
-- 100,32,116,111,32,101,120,105,115,116,59,32,116,104,105,115,
-- 32,115,105,109,112,108,121,32,114,101,116,117,114,110,115,32,
-- 116,104,101,32,112,97,116,104,32,116,111,10,32,32,32,32,
-- 116,104,101,32,46,112,121,32,102,105,108,101,32,99,97,108,
-- 99,117,108,97,116,101,100,32,116,111,32,99,111,114,114,101,
-- 115,112,111,110,100,32,116,111,32,116,104,101,32,46,112,121,
-- 99,32,102,105,108,101,46,32,32,73,102,32,112,97,116,104,
-- 32,100,111,101,115,10,32,32,32,32,110,111,116,32,99,111,
-- 110,102,111,114,109,32,116,111,32,80,69,80,32,51,49,52,
-- 55,47,52,56,56,32,102,111,114,109,97,116,44,32,86,97,
-- 108,117,101,69,114,114,111,114,32,119,105,108,108,32,98,101,
-- 32,114,97,105,115,101,100,46,32,73,102,10,32,32,32,32,
-- 115,121,115,46,105,109,112,108,101,109,101,110,116,97,116,105,
-- 111,110,46,99,97,99,104,101,95,116,97,103,32,105,115,32,
-- 78,111,110,101,32,116,104,101,110,32,78,111,116,73,109,112,
-- 108,101,109,101,110,116,101,100,69,114,114,111,114,32,105,115,
-- 32,114,97,105,115,101,100,46,10,10,32,32,32,32,78,114,
-- 98,0,0,0,70,84,122,31,32,110,111,116,32,98,111,116,
-- 116,111,109,45,108,101,118,101,108,32,100,105,114,101,99,116,
-- 111,114,121,32,105,110,32,114,97,0,0,0,62,2,0,0,
-- 0,114,44,0,0,0,233,3,0,0,0,122,29,101,120,112,
-- 101,99,116,101,100,32,111,110,108,121,32,50,32,111,114,32,
-- 51,32,100,111,116,115,32,105,110,32,114,122,0,0,0,114,
-- 44,0,0,0,233,254,255,255,255,122,53,111,112,116,105,109,
-- 105,122,97,116,105,111,110,32,112,111,114,116,105,111,110,32,
-- 111,102,32,102,105,108,101,110,97,109,101,32,100,111,101,115,
-- 32,110,111,116,32,115,116,97,114,116,32,119,105,116,104,32,
-- 122,19,111,112,116,105,109,105,122,97,116,105,111,110,32,108,
-- 101,118,101,108,32,122,29,32,105,115,32,110,111,116,32,97,
-- 110,32,97,108,112,104,97,110,117,109,101,114,105,99,32,118,
-- 97,108,117,101,114,0,0,0,0,41,22,114,15,0,0,0,
-- 114,105,0,0,0,114,106,0,0,0,114,107,0,0,0,114,
-- 18,0,0,0,114,103,0,0,0,114,74,0,0,0,114,114,
-- 0,0,0,114,49,0,0,0,114,50,0,0,0,114,26,0,
-- 0,0,114,59,0,0,0,114,4,0,0,0,114,116,0,0,
-- 0,114,111,0,0,0,218,5,99,111,117,110,116,218,6,114,
-- 115,112,108,105,116,114,112,0,0,0,114,110,0,0,0,218,
-- 9,112,97,114,116,105,116,105,111,110,114,67,0,0,0,218,
-- 15,83,79,85,82,67,69,95,83,85,70,70,73,88,69,83,
-- 41,10,114,65,0,0,0,114,118,0,0,0,90,16,112,121,
-- 99,97,99,104,101,95,102,105,108,101,110,97,109,101,90,23,
-- 102,111,117,110,100,95,105,110,95,112,121,99,97,99,104,101,
-- 95,112,114,101,102,105,120,90,13,115,116,114,105,112,112,101,
-- 100,95,112,97,116,104,90,7,112,121,99,97,99,104,101,90,
-- 9,100,111,116,95,99,111,117,110,116,114,96,0,0,0,90,
-- 9,111,112,116,95,108,101,118,101,108,90,13,98,97,115,101,
-- 95,102,105,108,101,110,97,109,101,114,7,0,0,0,114,7,
-- 0,0,0,114,8,0,0,0,218,17,115,111,117,114,99,101,
-- 95,102,114,111,109,95,99,97,99,104,101,195,1,0,0,115,
-- 60,0,0,0,12,9,8,1,10,1,12,1,4,1,10,1,
-- 12,1,14,1,16,1,4,1,4,1,12,1,8,1,8,1,
-- 2,1,8,255,10,2,8,1,14,1,8,1,16,1,10,1,
-- 4,1,2,1,8,255,16,2,8,1,16,1,14,2,18,1,
-- 114,128,0,0,0,99,1,0,0,0,0,0,0,0,0,0,
-- 0,0,5,0,0,0,9,0,0,0,67,0,0,0,115,124,
-- 0,0,0,116,0,124,0,131,1,100,1,107,2,114,8,100,
-- 2,83,0,124,0,160,1,100,3,161,1,92,3,125,1,125,
-- 2,125,3,124,1,114,28,124,3,160,2,161,0,100,4,100,
-- 5,133,2,25,0,100,6,107,3,114,30,124,0,83,0,122,
-- 6,116,3,124,0,131,1,125,4,87,0,110,17,4,0,116,
-- 4,116,5,102,2,121,53,1,0,1,0,1,0,124,0,100,
-- 2,100,5,133,2,25,0,125,4,89,0,110,1,119,0,116,
-- 6,124,4,131,1,114,60,124,4,83,0,124,0,83,0,41,
-- 7,122,188,67,111,110,118,101,114,116,32,97,32,98,121,116,
-- 101,99,111,100,101,32,102,105,108,101,32,112,97,116,104,32,
-- 116,111,32,97,32,115,111,117,114,99,101,32,112,97,116,104,
-- 32,40,105,102,32,112,111,115,115,105,98,108,101,41,46,10,
-- 10,32,32,32,32,84,104,105,115,32,102,117,110,99,116,105,
-- 111,110,32,101,120,105,115,116,115,32,112,117,114,101,108,121,
-- 32,102,111,114,32,98,97,99,107,119,97,114,100,115,45,99,
-- 111,109,112,97,116,105,98,105,108,105,116,121,32,102,111,114,
-- 10,32,32,32,32,80,121,73,109,112,111,114,116,95,69,120,
-- 101,99,67,111,100,101,77,111,100,117,108,101,87,105,116,104,
-- 70,105,108,101,110,97,109,101,115,40,41,32,105,110,32,116,
-- 104,101,32,67,32,65,80,73,46,10,10,32,32,32,32,114,
-- 0,0,0,0,78,114,97,0,0,0,233,253,255,255,255,233,
-- 255,255,255,255,90,2,112,121,41,7,114,4,0,0,0,114,
-- 104,0,0,0,218,5,108,111,119,101,114,114,128,0,0,0,
-- 114,107,0,0,0,114,111,0,0,0,114,80,0,0,0,41,
-- 5,218,13,98,121,116,101,99,111,100,101,95,112,97,116,104,
-- 114,119,0,0,0,218,1,95,90,9,101,120,116,101,110,115,
-- 105,111,110,218,11,115,111,117,114,99,101,95,112,97,116,104,
-+ 116,104,46,106,111,105,110,40,41,46,114,10,0,0,0,114,
-+ 3,0,0,0,114,0,0,0,0,114,11,0,0,0,99,1,
-+ 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,5,
-+ 0,0,0,83,0,0,0,243,26,0,0,0,103,0,124,0,
-+ 93,9,125,1,124,1,114,2,124,1,160,0,116,1,161,1,
-+ 145,2,113,2,83,0,114,7,0,0,0,169,2,218,6,114,
-+ 115,116,114,105,112,218,15,112,97,116,104,95,115,101,112,97,
-+ 114,97,116,111,114,115,169,2,114,5,0,0,0,218,1,112,
- 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,
-- 15,95,103,101,116,95,115,111,117,114,99,101,102,105,108,101,
-- 235,1,0,0,115,22,0,0,0,12,7,4,1,16,1,24,
-- 1,4,1,2,1,12,1,16,1,16,1,2,255,16,2,114,
-- 135,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,
-- 0,1,0,0,0,8,0,0,0,67,0,0,0,115,68,0,
-- 0,0,124,0,160,0,116,1,116,2,131,1,161,1,114,23,
-- 122,5,116,3,124,0,131,1,87,0,83,0,4,0,116,4,
-- 121,22,1,0,1,0,1,0,89,0,100,0,83,0,119,0,
-- 124,0,160,0,116,1,116,5,131,1,161,1,114,32,124,0,
-- 83,0,100,0,83,0,114,69,0,0,0,41,6,114,58,0,
-- 0,0,218,5,116,117,112,108,101,114,127,0,0,0,114,121,
-- 0,0,0,114,107,0,0,0,114,113,0,0,0,41,1,114,
-- 120,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-- 0,0,0,218,11,95,103,101,116,95,99,97,99,104,101,100,
-- 254,1,0,0,115,18,0,0,0,14,1,2,1,10,1,12,
-- 1,6,1,2,255,14,2,4,1,4,2,114,137,0,0,0,
-+ 10,60,108,105,115,116,99,111,109,112,62,119,0,0,0,115,
-+ 2,0,0,0,26,0,250,30,95,112,97,116,104,95,106,111,
-+ 105,110,46,60,108,111,99,97,108,115,62,46,60,108,105,115,
-+ 116,99,111,109,112,62,41,13,114,4,0,0,0,218,3,109,
-+ 97,112,114,21,0,0,0,218,15,95,112,97,116,104,95,115,
-+ 112,108,105,116,114,111,111,116,114,29,0,0,0,218,14,112,
-+ 97,116,104,95,115,101,112,95,116,117,112,108,101,218,8,101,
-+ 110,100,115,119,105,116,104,114,52,0,0,0,114,53,0,0,
-+ 0,218,8,112,97,116,104,95,115,101,112,218,8,99,97,115,
-+ 101,102,111,108,100,218,6,97,112,112,101,110,100,218,4,106,
-+ 111,105,110,41,5,218,10,112,97,116,104,95,112,97,114,116,
-+ 115,218,4,114,111,111,116,218,4,112,97,116,104,90,8,110,
-+ 101,119,95,114,111,111,116,218,4,116,97,105,108,114,7,0,
-+ 0,0,114,7,0,0,0,114,8,0,0,0,218,10,95,112,
-+ 97,116,104,95,106,111,105,110,96,0,0,0,115,42,0,0,
-+ 0,4,2,4,1,12,1,8,1,4,1,4,1,20,1,20,
-+ 1,14,1,12,1,10,1,16,1,4,3,8,1,12,2,8,
-+ 2,12,1,14,1,20,1,8,2,14,1,114,70,0,0,0,
-+ 99,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
-+ 0,4,0,0,0,71,0,0,0,115,20,0,0,0,116,0,
-+ 160,1,100,1,100,2,132,0,124,0,68,0,131,1,161,1,
-+ 83,0,41,3,114,49,0,0,0,99,1,0,0,0,0,0,
-+ 0,0,0,0,0,0,2,0,0,0,5,0,0,0,83,0,
-+ 0,0,114,50,0,0,0,114,7,0,0,0,114,51,0,0,
-+ 0,41,2,114,5,0,0,0,218,4,112,97,114,116,114,7,
-+ 0,0,0,114,7,0,0,0,114,8,0,0,0,114,56,0,
-+ 0,0,128,0,0,0,115,6,0,0,0,6,0,4,1,16,
-+ 255,114,57,0,0,0,41,2,114,62,0,0,0,114,65,0,
-+ 0,0,41,1,114,66,0,0,0,114,7,0,0,0,114,7,
-+ 0,0,0,114,8,0,0,0,114,70,0,0,0,126,0,0,
-+ 0,115,6,0,0,0,10,2,2,1,8,255,99,1,0,0,
-+ 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,
-+ 0,3,0,0,0,115,66,0,0,0,116,0,135,0,102,1,
-+ 100,1,100,2,132,8,116,1,68,0,131,1,131,1,125,1,
-+ 124,1,100,3,107,0,114,19,100,4,136,0,102,2,83,0,
-+ 136,0,100,5,124,1,133,2,25,0,136,0,124,1,100,6,
-+ 23,0,100,5,133,2,25,0,102,2,83,0,41,7,122,32,
-+ 82,101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,
-+ 111,115,46,112,97,116,104,46,115,112,108,105,116,40,41,46,
- 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
-- 0,8,0,0,0,67,0,0,0,115,50,0,0,0,122,7,
-- 116,0,124,0,131,1,106,1,125,1,87,0,110,11,4,0,
-- 116,2,121,18,1,0,1,0,1,0,100,1,125,1,89,0,
-- 110,1,119,0,124,1,100,2,79,0,125,1,124,1,83,0,
-- 41,3,122,51,67,97,108,99,117,108,97,116,101,32,116,104,
-- 101,32,109,111,100,101,32,112,101,114,109,105,115,115,105,111,
-- 110,115,32,102,111,114,32,97,32,98,121,116,101,99,111,100,
-- 101,32,102,105,108,101,46,114,87,0,0,0,233,128,0,0,
-- 0,41,3,114,75,0,0,0,114,77,0,0,0,114,76,0,
-- 0,0,41,2,114,65,0,0,0,114,78,0,0,0,114,7,
-- 0,0,0,114,7,0,0,0,114,8,0,0,0,218,10,95,
-- 99,97,108,99,95,109,111,100,101,10,2,0,0,115,14,0,
-- 0,0,2,2,14,1,12,1,8,1,2,255,8,4,4,1,
-- 114,139,0,0,0,99,1,0,0,0,0,0,0,0,0,0,
-- 0,0,3,0,0,0,4,0,0,0,3,0,0,0,115,52,
-- 0,0,0,100,6,135,0,102,1,100,2,100,3,132,9,125,
-- 1,116,0,100,1,117,1,114,15,116,0,106,1,125,2,110,
-- 4,100,4,100,5,132,0,125,2,124,2,124,1,136,0,131,
-- 2,1,0,124,1,83,0,41,7,122,252,68,101,99,111,114,
-- 97,116,111,114,32,116,111,32,118,101,114,105,102,121,32,116,
-- 104,97,116,32,116,104,101,32,109,111,100,117,108,101,32,98,
-- 101,105,110,103,32,114,101,113,117,101,115,116,101,100,32,109,
-- 97,116,99,104,101,115,32,116,104,101,32,111,110,101,32,116,
-- 104,101,10,32,32,32,32,108,111,97,100,101,114,32,99,97,
-- 110,32,104,97,110,100,108,101,46,10,10,32,32,32,32,84,
-- 104,101,32,102,105,114,115,116,32,97,114,103,117,109,101,110,
-- 116,32,40,115,101,108,102,41,32,109,117,115,116,32,100,101,
-- 102,105,110,101,32,95,110,97,109,101,32,119,104,105,99,104,
-- 32,116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,
-- 109,101,110,116,32,105,115,10,32,32,32,32,99,111,109,112,
-- 97,114,101,100,32,97,103,97,105,110,115,116,46,32,73,102,
-- 32,116,104,101,32,99,111,109,112,97,114,105,115,111,110,32,
-- 102,97,105,108,115,32,116,104,101,110,32,73,109,112,111,114,
-- 116,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100,
-- 46,10,10,32,32,32,32,78,99,2,0,0,0,0,0,0,
-- 0,0,0,0,0,4,0,0,0,4,0,0,0,31,0,0,
-- 0,115,72,0,0,0,124,1,100,0,117,0,114,8,124,0,
-- 106,0,125,1,110,16,124,0,106,0,124,1,107,3,114,24,
-- 116,1,100,1,124,0,106,0,124,1,102,2,22,0,124,1,
-- 100,2,141,2,130,1,136,0,124,0,124,1,103,2,124,2,
-- 162,1,82,0,105,0,124,3,164,1,142,1,83,0,41,3,
-- 78,122,30,108,111,97,100,101,114,32,102,111,114,32,37,115,
-- 32,99,97,110,110,111,116,32,104,97,110,100,108,101,32,37,
-- 115,169,1,218,4,110,97,109,101,41,2,114,141,0,0,0,
-- 218,11,73,109,112,111,114,116,69,114,114,111,114,41,4,218,
-- 4,115,101,108,102,114,141,0,0,0,218,4,97,114,103,115,
-- 218,6,107,119,97,114,103,115,169,1,218,6,109,101,116,104,
-- 111,100,114,7,0,0,0,114,8,0,0,0,218,19,95,99,
-- 104,101,99,107,95,110,97,109,101,95,119,114,97,112,112,101,
-- 114,30,2,0,0,115,18,0,0,0,8,1,8,1,10,1,
-- 4,1,8,1,2,255,2,1,6,255,24,2,122,40,95,99,
-- 104,101,99,107,95,110,97,109,101,46,60,108,111,99,97,108,
-- 115,62,46,95,99,104,101,99,107,95,110,97,109,101,95,119,
-- 114,97,112,112,101,114,99,2,0,0,0,0,0,0,0,0,
-- 0,0,0,3,0,0,0,7,0,0,0,83,0,0,0,115,
-- 56,0,0,0,100,1,68,0,93,16,125,2,116,0,124,1,
-- 124,2,131,2,114,18,116,1,124,0,124,2,116,2,124,1,
-- 124,2,131,2,131,3,1,0,113,2,124,0,106,3,160,4,
-- 124,1,106,3,161,1,1,0,100,0,83,0,41,2,78,41,
-- 4,218,10,95,95,109,111,100,117,108,101,95,95,218,8,95,
-- 95,110,97,109,101,95,95,218,12,95,95,113,117,97,108,110,
-- 97,109,101,95,95,218,7,95,95,100,111,99,95,95,41,5,
-- 218,7,104,97,115,97,116,116,114,218,7,115,101,116,97,116,
-- 116,114,218,7,103,101,116,97,116,116,114,218,8,95,95,100,
-- 105,99,116,95,95,218,6,117,112,100,97,116,101,41,3,90,
-- 3,110,101,119,90,3,111,108,100,114,85,0,0,0,114,7,
-- 0,0,0,114,7,0,0,0,114,8,0,0,0,218,5,95,
-- 119,114,97,112,43,2,0,0,115,10,0,0,0,8,1,10,
-- 1,18,1,2,128,18,1,122,26,95,99,104,101,99,107,95,
-- 110,97,109,101,46,60,108,111,99,97,108,115,62,46,95,119,
-- 114,97,112,114,69,0,0,0,41,2,218,10,95,98,111,111,
-- 116,115,116,114,97,112,114,158,0,0,0,41,3,114,147,0,
-- 0,0,114,148,0,0,0,114,158,0,0,0,114,7,0,0,
-- 0,114,146,0,0,0,114,8,0,0,0,218,11,95,99,104,
-- 101,99,107,95,110,97,109,101,22,2,0,0,115,12,0,0,
-- 0,14,8,8,10,8,1,8,2,10,6,4,1,114,160,0,
-- 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,5,
-- 0,0,0,6,0,0,0,67,0,0,0,115,72,0,0,0,
-- 116,0,160,1,100,1,116,2,161,2,1,0,124,0,160,3,
-- 124,1,161,1,92,2,125,2,125,3,124,2,100,2,117,0,
-- 114,34,116,4,124,3,131,1,114,34,100,3,125,4,116,0,
-- 160,1,124,4,160,5,124,3,100,4,25,0,161,1,116,6,
-- 161,2,1,0,124,2,83,0,41,5,122,155,84,114,121,32,
-- 116,111,32,102,105,110,100,32,97,32,108,111,97,100,101,114,
-- 32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,
-- 101,100,32,109,111,100,117,108,101,32,98,121,32,100,101,108,
-- 101,103,97,116,105,110,103,32,116,111,10,32,32,32,32,115,
-- 101,108,102,46,102,105,110,100,95,108,111,97,100,101,114,40,
-- 41,46,10,10,32,32,32,32,84,104,105,115,32,109,101,116,
-- 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,
-- 100,32,105,110,32,102,97,118,111,114,32,111,102,32,102,105,
-- 110,100,101,114,46,102,105,110,100,95,115,112,101,99,40,41,
-- 46,10,10,32,32,32,32,122,90,102,105,110,100,95,109,111,
-- 100,117,108,101,40,41,32,105,115,32,100,101,112,114,101,99,
-- 97,116,101,100,32,97,110,100,32,115,108,97,116,101,100,32,
-- 102,111,114,32,114,101,109,111,118,97,108,32,105,110,32,80,
-- 121,116,104,111,110,32,51,46,49,50,59,32,117,115,101,32,
-- 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,
-- 101,97,100,78,122,44,78,111,116,32,105,109,112,111,114,116,
-- 105,110,103,32,100,105,114,101,99,116,111,114,121,32,123,125,
-- 58,32,109,105,115,115,105,110,103,32,95,95,105,110,105,116,
-- 95,95,114,0,0,0,0,41,7,114,99,0,0,0,114,100,
-- 0,0,0,114,101,0,0,0,218,11,102,105,110,100,95,108,
-- 111,97,100,101,114,114,4,0,0,0,114,89,0,0,0,218,
-- 13,73,109,112,111,114,116,87,97,114,110,105,110,103,41,5,
-- 114,143,0,0,0,218,8,102,117,108,108,110,97,109,101,218,
-- 6,108,111,97,100,101,114,218,8,112,111,114,116,105,111,110,
-- 115,218,3,109,115,103,114,7,0,0,0,114,7,0,0,0,
-- 114,8,0,0,0,218,17,95,102,105,110,100,95,109,111,100,
-- 117,108,101,95,115,104,105,109,53,2,0,0,115,16,0,0,
-- 0,6,7,2,2,4,254,14,6,16,1,4,1,22,1,4,
-- 1,114,167,0,0,0,99,3,0,0,0,0,0,0,0,0,
-- 0,0,0,6,0,0,0,4,0,0,0,67,0,0,0,115,
-- 166,0,0,0,124,0,100,1,100,2,133,2,25,0,125,3,
-- 124,3,116,0,107,3,114,32,100,3,124,1,155,2,100,4,
-- 124,3,155,2,157,4,125,4,116,1,160,2,100,5,124,4,
-- 161,2,1,0,116,3,124,4,102,1,105,0,124,2,164,1,
-- 142,1,130,1,116,4,124,0,131,1,100,6,107,0,114,53,
-- 100,7,124,1,155,2,157,2,125,4,116,1,160,2,100,5,
-- 124,4,161,2,1,0,116,5,124,4,131,1,130,1,116,6,
-- 124,0,100,2,100,8,133,2,25,0,131,1,125,5,124,5,
-- 100,9,64,0,114,81,100,10,124,5,155,2,100,11,124,1,
-- 155,2,157,4,125,4,116,3,124,4,102,1,105,0,124,2,
-- 164,1,142,1,130,1,124,5,83,0,41,12,97,84,2,0,
-- 0,80,101,114,102,111,114,109,32,98,97,115,105,99,32,118,
-- 97,108,105,100,105,116,121,32,99,104,101,99,107,105,110,103,
-- 32,111,102,32,97,32,112,121,99,32,104,101,97,100,101,114,
-- 32,97,110,100,32,114,101,116,117,114,110,32,116,104,101,32,
-- 102,108,97,103,115,32,102,105,101,108,100,44,10,32,32,32,
-- 32,119,104,105,99,104,32,100,101,116,101,114,109,105,110,101,
-- 115,32,104,111,119,32,116,104,101,32,112,121,99,32,115,104,
-- 111,117,108,100,32,98,101,32,102,117,114,116,104,101,114,32,
-- 118,97,108,105,100,97,116,101,100,32,97,103,97,105,110,115,
-- 116,32,116,104,101,32,115,111,117,114,99,101,46,10,10,32,
-- 32,32,32,42,100,97,116,97,42,32,105,115,32,116,104,101,
-- 32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,
-- 32,112,121,99,32,102,105,108,101,46,32,40,79,110,108,121,
-- 32,116,104,101,32,102,105,114,115,116,32,49,54,32,98,121,
-- 116,101,115,32,97,114,101,10,32,32,32,32,114,101,113,117,
-- 105,114,101,100,44,32,116,104,111,117,103,104,46,41,10,10,
-- 32,32,32,32,42,110,97,109,101,42,32,105,115,32,116,104,
-- 101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111,
-- 100,117,108,101,32,98,101,105,110,103,32,105,109,112,111,114,
-- 116,101,100,46,32,73,116,32,105,115,32,117,115,101,100,32,
-- 102,111,114,32,108,111,103,103,105,110,103,46,10,10,32,32,
-- 32,32,42,101,120,99,95,100,101,116,97,105,108,115,42,32,
-- 105,115,32,97,32,100,105,99,116,105,111,110,97,114,121,32,
-- 112,97,115,115,101,100,32,116,111,32,73,109,112,111,114,116,
-- 69,114,114,111,114,32,105,102,32,105,116,32,114,97,105,115,
-- 101,100,32,102,111,114,10,32,32,32,32,105,109,112,114,111,
-- 118,101,100,32,100,101,98,117,103,103,105,110,103,46,10,10,
-- 32,32,32,32,73,109,112,111,114,116,69,114,114,111,114,32,
-- 105,115,32,114,97,105,115,101,100,32,119,104,101,110,32,116,
-- 104,101,32,109,97,103,105,99,32,110,117,109,98,101,114,32,
-- 105,115,32,105,110,99,111,114,114,101,99,116,32,111,114,32,
-- 119,104,101,110,32,116,104,101,32,102,108,97,103,115,10,32,
-- 32,32,32,102,105,101,108,100,32,105,115,32,105,110,118,97,
-- 108,105,100,46,32,69,79,70,69,114,114,111,114,32,105,115,
-- 32,114,97,105,115,101,100,32,119,104,101,110,32,116,104,101,
-- 32,100,97,116,97,32,105,115,32,102,111,117,110,100,32,116,
-- 111,32,98,101,32,116,114,117,110,99,97,116,101,100,46,10,
-- 10,32,32,32,32,78,114,31,0,0,0,122,20,98,97,100,
-- 32,109,97,103,105,99,32,110,117,109,98,101,114,32,105,110,
-- 32,122,2,58,32,250,2,123,125,233,16,0,0,0,122,40,
-- 114,101,97,99,104,101,100,32,69,79,70,32,119,104,105,108,
-- 101,32,114,101,97,100,105,110,103,32,112,121,99,32,104,101,
-- 97,100,101,114,32,111,102,32,233,8,0,0,0,233,252,255,
-- 255,255,122,14,105,110,118,97,108,105,100,32,102,108,97,103,
-- 115,32,122,4,32,105,110,32,41,7,218,12,77,65,71,73,
-- 67,95,78,85,77,66,69,82,114,159,0,0,0,218,16,95,
-- 118,101,114,98,111,115,101,95,109,101,115,115,97,103,101,114,
-- 142,0,0,0,114,4,0,0,0,218,8,69,79,70,69,114,
-- 114,111,114,114,42,0,0,0,41,6,114,41,0,0,0,114,
-- 141,0,0,0,218,11,101,120,99,95,100,101,116,97,105,108,
-- 115,90,5,109,97,103,105,99,114,117,0,0,0,114,16,0,
-+ 0,4,0,0,0,51,0,0,0,115,26,0,0,0,129,0,
-+ 124,0,93,8,125,1,136,0,160,0,124,1,161,1,86,0,
-+ 1,0,113,2,100,0,83,0,169,1,78,41,1,218,5,114,
-+ 102,105,110,100,114,54,0,0,0,169,1,114,68,0,0,0,
-+ 114,7,0,0,0,114,8,0,0,0,114,9,0,0,0,134,
-+ 0,0,0,115,4,0,0,0,2,128,24,0,122,30,95,112,
-+ 97,116,104,95,115,112,108,105,116,46,60,108,111,99,97,108,
-+ 115,62,46,60,103,101,110,101,120,112,114,62,114,0,0,0,
-+ 0,114,10,0,0,0,78,114,3,0,0,0,41,2,218,3,
-+ 109,97,120,114,53,0,0,0,41,2,114,68,0,0,0,218,
-+ 1,105,114,7,0,0,0,114,74,0,0,0,114,8,0,0,
-+ 0,218,11,95,112,97,116,104,95,115,112,108,105,116,132,0,
-+ 0,0,115,8,0,0,0,22,2,8,1,8,1,28,1,114,
-+ 77,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,
-+ 0,1,0,0,0,3,0,0,0,67,0,0,0,115,10,0,
-+ 0,0,116,0,160,1,124,0,161,1,83,0,41,1,122,126,
-+ 83,116,97,116,32,116,104,101,32,112,97,116,104,46,10,10,
-+ 32,32,32,32,77,97,100,101,32,97,32,115,101,112,97,114,
-+ 97,116,101,32,102,117,110,99,116,105,111,110,32,116,111,32,
-+ 109,97,107,101,32,105,116,32,101,97,115,105,101,114,32,116,
-+ 111,32,111,118,101,114,114,105,100,101,32,105,110,32,101,120,
-+ 112,101,114,105,109,101,110,116,115,10,32,32,32,32,40,101,
-+ 46,103,46,32,99,97,99,104,101,32,115,116,97,116,32,114,
-+ 101,115,117,108,116,115,41,46,10,10,32,32,32,32,41,2,
-+ 114,21,0,0,0,90,4,115,116,97,116,114,74,0,0,0,
-+ 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,
-+ 10,95,112,97,116,104,95,115,116,97,116,140,0,0,0,115,
-+ 2,0,0,0,10,7,114,78,0,0,0,99,2,0,0,0,
-+ 0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,
-+ 67,0,0,0,115,48,0,0,0,122,6,116,0,124,0,131,
-+ 1,125,2,87,0,110,10,4,0,116,1,121,16,1,0,1,
-+ 0,1,0,89,0,100,1,83,0,119,0,124,2,106,2,100,
-+ 2,64,0,124,1,107,2,83,0,41,3,122,49,84,101,115,
-+ 116,32,119,104,101,116,104,101,114,32,116,104,101,32,112,97,
-+ 116,104,32,105,115,32,116,104,101,32,115,112,101,99,105,102,
-+ 105,101,100,32,109,111,100,101,32,116,121,112,101,46,70,105,
-+ 0,240,0,0,41,3,114,78,0,0,0,218,7,79,83,69,
-+ 114,114,111,114,218,7,115,116,95,109,111,100,101,41,3,114,
-+ 68,0,0,0,218,4,109,111,100,101,90,9,115,116,97,116,
-+ 95,105,110,102,111,114,7,0,0,0,114,7,0,0,0,114,
-+ 8,0,0,0,218,18,95,112,97,116,104,95,105,115,95,109,
-+ 111,100,101,95,116,121,112,101,150,0,0,0,115,12,0,0,
-+ 0,2,2,12,1,12,1,6,1,2,255,14,2,114,82,0,
-+ 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,
-+ 0,0,0,3,0,0,0,67,0,0,0,115,10,0,0,0,
-+ 116,0,124,0,100,1,131,2,83,0,41,2,122,31,82,101,
-+ 112,108,97,99,101,109,101,110,116,32,102,111,114,32,111,115,
-+ 46,112,97,116,104,46,105,115,102,105,108,101,46,105,0,128,
-+ 0,0,41,1,114,82,0,0,0,114,74,0,0,0,114,7,
-+ 0,0,0,114,7,0,0,0,114,8,0,0,0,218,12,95,
-+ 112,97,116,104,95,105,115,102,105,108,101,159,0,0,0,243,
-+ 2,0,0,0,10,2,114,83,0,0,0,99,1,0,0,0,
-+ 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,
-+ 67,0,0,0,115,22,0,0,0,124,0,115,6,116,0,160,
-+ 1,161,0,125,0,116,2,124,0,100,1,131,2,83,0,41,
-+ 2,122,30,82,101,112,108,97,99,101,109,101,110,116,32,102,
-+ 111,114,32,111,115,46,112,97,116,104,46,105,115,100,105,114,
-+ 46,105,0,64,0,0,41,3,114,21,0,0,0,218,6,103,
-+ 101,116,99,119,100,114,82,0,0,0,114,74,0,0,0,114,
-+ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,
-+ 95,112,97,116,104,95,105,115,100,105,114,164,0,0,0,115,
-+ 6,0,0,0,4,2,8,1,10,1,114,86,0,0,0,99,
-+ 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,
-+ 4,0,0,0,67,0,0,0,115,62,0,0,0,124,0,115,
-+ 4,100,1,83,0,116,0,160,1,124,0,161,1,100,2,25,
-+ 0,160,2,100,3,100,4,161,2,125,1,116,3,124,1,131,
-+ 1,100,5,107,4,111,30,124,1,160,4,100,6,161,1,112,
-+ 30,124,1,160,5,100,4,161,1,83,0,41,7,250,30,82,
-+ 101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,111,
-+ 115,46,112,97,116,104,46,105,115,97,98,115,46,70,114,0,
-+ 0,0,0,114,2,0,0,0,114,1,0,0,0,114,3,0,
-+ 0,0,122,2,92,92,41,6,114,21,0,0,0,114,59,0,
-+ 0,0,218,7,114,101,112,108,97,99,101,114,4,0,0,0,
-+ 114,29,0,0,0,114,61,0,0,0,41,2,114,68,0,0,
-+ 0,114,67,0,0,0,114,7,0,0,0,114,7,0,0,0,
-+ 114,8,0,0,0,218,11,95,112,97,116,104,95,105,115,97,
-+ 98,115,172,0,0,0,115,8,0,0,0,4,2,4,1,22,
-+ 1,32,1,114,89,0,0,0,99,1,0,0,0,0,0,0,
-+ 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,
-+ 0,115,10,0,0,0,124,0,160,0,116,1,161,1,83,0,
-+ 41,1,114,87,0,0,0,41,2,114,29,0,0,0,114,53,
-+ 0,0,0,114,74,0,0,0,114,7,0,0,0,114,7,0,
-+ 0,0,114,8,0,0,0,114,89,0,0,0,180,0,0,0,
-+ 114,84,0,0,0,233,182,1,0,0,99,3,0,0,0,0,
-+ 0,0,0,0,0,0,0,6,0,0,0,11,0,0,0,67,
-+ 0,0,0,115,170,0,0,0,100,1,160,0,124,0,116,1,
-+ 124,0,131,1,161,2,125,3,116,2,160,3,124,3,116,2,
-+ 106,4,116,2,106,5,66,0,116,2,106,6,66,0,124,2,
-+ 100,2,64,0,161,3,125,4,122,36,116,7,160,8,124,4,
-+ 100,3,161,2,143,13,125,5,124,5,160,9,124,1,161,1,
-+ 1,0,87,0,100,4,4,0,4,0,131,3,1,0,110,8,
-+ 49,0,115,47,119,1,1,0,1,0,1,0,89,0,1,0,
-+ 116,2,160,10,124,3,124,0,161,2,1,0,87,0,100,4,
-+ 83,0,4,0,116,11,121,84,1,0,1,0,1,0,122,7,
-+ 116,2,160,12,124,3,161,1,1,0,87,0,130,0,4,0,
-+ 116,11,121,83,1,0,1,0,1,0,89,0,130,0,119,0,
-+ 119,0,41,5,122,162,66,101,115,116,45,101,102,102,111,114,
-+ 116,32,102,117,110,99,116,105,111,110,32,116,111,32,119,114,
-+ 105,116,101,32,100,97,116,97,32,116,111,32,97,32,112,97,
-+ 116,104,32,97,116,111,109,105,99,97,108,108,121,46,10,32,
-+ 32,32,32,66,101,32,112,114,101,112,97,114,101,100,32,116,
-+ 111,32,104,97,110,100,108,101,32,97,32,70,105,108,101,69,
-+ 120,105,115,116,115,69,114,114,111,114,32,105,102,32,99,111,
-+ 110,99,117,114,114,101,110,116,32,119,114,105,116,105,110,103,
-+ 32,111,102,32,116,104,101,10,32,32,32,32,116,101,109,112,
-+ 111,114,97,114,121,32,102,105,108,101,32,105,115,32,97,116,
-+ 116,101,109,112,116,101,100,46,250,5,123,125,46,123,125,114,
-+ 90,0,0,0,90,2,119,98,78,41,13,218,6,102,111,114,
-+ 109,97,116,218,2,105,100,114,21,0,0,0,90,4,111,112,
-+ 101,110,90,6,79,95,69,88,67,76,90,7,79,95,67,82,
-+ 69,65,84,90,8,79,95,87,82,79,78,76,89,218,3,95,
-+ 105,111,218,6,70,105,108,101,73,79,218,5,119,114,105,116,
-+ 101,114,88,0,0,0,114,79,0,0,0,90,6,117,110,108,
-+ 105,110,107,41,6,114,68,0,0,0,114,44,0,0,0,114,
-+ 81,0,0,0,90,8,112,97,116,104,95,116,109,112,90,2,
-+ 102,100,218,4,102,105,108,101,114,7,0,0,0,114,7,0,
-+ 0,0,114,8,0,0,0,218,13,95,119,114,105,116,101,95,
-+ 97,116,111,109,105,99,185,0,0,0,115,36,0,0,0,16,
-+ 5,6,1,22,1,4,255,2,2,14,3,12,1,28,255,18,
-+ 2,12,1,2,1,12,1,2,3,12,254,2,1,2,1,2,
-+ 254,2,253,114,98,0,0,0,105,111,13,0,0,114,47,0,
-+ 0,0,114,35,0,0,0,115,2,0,0,0,13,10,90,11,
-+ 95,95,112,121,99,97,99,104,101,95,95,122,4,111,112,116,
-+ 45,122,3,46,112,121,122,4,46,112,121,119,122,4,46,112,
-+ 121,99,41,1,218,12,111,112,116,105,109,105,122,97,116,105,
-+ 111,110,99,2,0,0,0,0,0,0,0,1,0,0,0,12,
-+ 0,0,0,5,0,0,0,67,0,0,0,115,80,1,0,0,
-+ 124,1,100,1,117,1,114,26,116,0,160,1,100,2,116,2,
-+ 161,2,1,0,124,2,100,1,117,1,114,20,100,3,125,3,
-+ 116,3,124,3,131,1,130,1,124,1,114,24,100,4,110,1,
-+ 100,5,125,2,116,4,160,5,124,0,161,1,125,0,116,6,
-+ 124,0,131,1,92,2,125,4,125,5,124,5,160,7,100,6,
-+ 161,1,92,3,125,6,125,7,125,8,116,8,106,9,106,10,
-+ 125,9,124,9,100,1,117,0,114,57,116,11,100,7,131,1,
-+ 130,1,100,4,160,12,124,6,114,63,124,6,110,1,124,8,
-+ 124,7,124,9,103,3,161,1,125,10,124,2,100,1,117,0,
-+ 114,86,116,8,106,13,106,14,100,8,107,2,114,82,100,4,
-+ 125,2,110,4,116,8,106,13,106,14,125,2,116,15,124,2,
-+ 131,1,125,2,124,2,100,4,107,3,114,112,124,2,160,16,
-+ 161,0,115,105,116,17,100,9,160,18,124,2,161,1,131,1,
-+ 130,1,100,10,160,18,124,10,116,19,124,2,161,3,125,10,
-+ 124,10,116,20,100,8,25,0,23,0,125,11,116,8,106,21,
-+ 100,1,117,1,114,162,116,22,124,4,131,1,115,134,116,23,
-+ 116,4,160,24,161,0,124,4,131,2,125,4,124,4,100,5,
-+ 25,0,100,11,107,2,114,152,124,4,100,8,25,0,116,25,
-+ 118,1,114,152,124,4,100,12,100,1,133,2,25,0,125,4,
-+ 116,23,116,8,106,21,124,4,160,26,116,25,161,1,124,11,
-+ 131,3,83,0,116,23,124,4,116,27,124,11,131,3,83,0,
-+ 41,13,97,254,2,0,0,71,105,118,101,110,32,116,104,101,
-+ 32,112,97,116,104,32,116,111,32,97,32,46,112,121,32,102,
-+ 105,108,101,44,32,114,101,116,117,114,110,32,116,104,101,32,
-+ 112,97,116,104,32,116,111,32,105,116,115,32,46,112,121,99,
-+ 32,102,105,108,101,46,10,10,32,32,32,32,84,104,101,32,
-+ 46,112,121,32,102,105,108,101,32,100,111,101,115,32,110,111,
-+ 116,32,110,101,101,100,32,116,111,32,101,120,105,115,116,59,
-+ 32,116,104,105,115,32,115,105,109,112,108,121,32,114,101,116,
-+ 117,114,110,115,32,116,104,101,32,112,97,116,104,32,116,111,
-+ 32,116,104,101,10,32,32,32,32,46,112,121,99,32,102,105,
-+ 108,101,32,99,97,108,99,117,108,97,116,101,100,32,97,115,
-+ 32,105,102,32,116,104,101,32,46,112,121,32,102,105,108,101,
-+ 32,119,101,114,101,32,105,109,112,111,114,116,101,100,46,10,
-+ 10,32,32,32,32,84,104,101,32,39,111,112,116,105,109,105,
-+ 122,97,116,105,111,110,39,32,112,97,114,97,109,101,116,101,
-+ 114,32,99,111,110,116,114,111,108,115,32,116,104,101,32,112,
-+ 114,101,115,117,109,101,100,32,111,112,116,105,109,105,122,97,
-+ 116,105,111,110,32,108,101,118,101,108,32,111,102,10,32,32,
-+ 32,32,116,104,101,32,98,121,116,101,99,111,100,101,32,102,
-+ 105,108,101,46,32,73,102,32,39,111,112,116,105,109,105,122,
-+ 97,116,105,111,110,39,32,105,115,32,110,111,116,32,78,111,
-+ 110,101,44,32,116,104,101,32,115,116,114,105,110,103,32,114,
-+ 101,112,114,101,115,101,110,116,97,116,105,111,110,10,32,32,
-+ 32,32,111,102,32,116,104,101,32,97,114,103,117,109,101,110,
-+ 116,32,105,115,32,116,97,107,101,110,32,97,110,100,32,118,
-+ 101,114,105,102,105,101,100,32,116,111,32,98,101,32,97,108,
-+ 112,104,97,110,117,109,101,114,105,99,32,40,101,108,115,101,
-+ 32,86,97,108,117,101,69,114,114,111,114,10,32,32,32,32,
-+ 105,115,32,114,97,105,115,101,100,41,46,10,10,32,32,32,
-+ 32,84,104,101,32,100,101,98,117,103,95,111,118,101,114,114,
-+ 105,100,101,32,112,97,114,97,109,101,116,101,114,32,105,115,
-+ 32,100,101,112,114,101,99,97,116,101,100,46,32,73,102,32,
-+ 100,101,98,117,103,95,111,118,101,114,114,105,100,101,32,105,
-+ 115,32,110,111,116,32,78,111,110,101,44,10,32,32,32,32,
-+ 97,32,84,114,117,101,32,118,97,108,117,101,32,105,115,32,
-+ 116,104,101,32,115,97,109,101,32,97,115,32,115,101,116,116,
-+ 105,110,103,32,39,111,112,116,105,109,105,122,97,116,105,111,
-+ 110,39,32,116,111,32,116,104,101,32,101,109,112,116,121,32,
-+ 115,116,114,105,110,103,10,32,32,32,32,119,104,105,108,101,
-+ 32,97,32,70,97,108,115,101,32,118,97,108,117,101,32,105,
-+ 115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,
-+ 115,101,116,116,105,110,103,32,39,111,112,116,105,109,105,122,
-+ 97,116,105,111,110,39,32,116,111,32,39,49,39,46,10,10,
-+ 32,32,32,32,73,102,32,115,121,115,46,105,109,112,108,101,
-+ 109,101,110,116,97,116,105,111,110,46,99,97,99,104,101,95,
-+ 116,97,103,32,105,115,32,78,111,110,101,32,116,104,101,110,
-+ 32,78,111,116,73,109,112,108,101,109,101,110,116,101,100,69,
-+ 114,114,111,114,32,105,115,32,114,97,105,115,101,100,46,10,
-+ 10,32,32,32,32,78,122,70,116,104,101,32,100,101,98,117,
-+ 103,95,111,118,101,114,114,105,100,101,32,112,97,114,97,109,
-+ 101,116,101,114,32,105,115,32,100,101,112,114,101,99,97,116,
-+ 101,100,59,32,117,115,101,32,39,111,112,116,105,109,105,122,
-+ 97,116,105,111,110,39,32,105,110,115,116,101,97,100,122,50,
-+ 100,101,98,117,103,95,111,118,101,114,114,105,100,101,32,111,
-+ 114,32,111,112,116,105,109,105,122,97,116,105,111,110,32,109,
-+ 117,115,116,32,98,101,32,115,101,116,32,116,111,32,78,111,
-+ 110,101,114,10,0,0,0,114,3,0,0,0,218,1,46,250,
-+ 36,115,121,115,46,105,109,112,108,101,109,101,110,116,97,116,
-+ 105,111,110,46,99,97,99,104,101,95,116,97,103,32,105,115,
-+ 32,78,111,110,101,114,0,0,0,0,122,24,123,33,114,125,
-+ 32,105,115,32,110,111,116,32,97,108,112,104,97,110,117,109,
-+ 101,114,105,99,122,7,123,125,46,123,125,123,125,114,11,0,
-+ 0,0,114,47,0,0,0,41,28,218,9,95,119,97,114,110,
-+ 105,110,103,115,218,4,119,97,114,110,218,18,68,101,112,114,
-+ 101,99,97,116,105,111,110,87,97,114,110,105,110,103,218,9,
-+ 84,121,112,101,69,114,114,111,114,114,21,0,0,0,218,6,
-+ 102,115,112,97,116,104,114,77,0,0,0,218,10,114,112,97,
-+ 114,116,105,116,105,111,110,114,18,0,0,0,218,14,105,109,
-+ 112,108,101,109,101,110,116,97,116,105,111,110,218,9,99,97,
-+ 99,104,101,95,116,97,103,218,19,78,111,116,73,109,112,108,
-+ 101,109,101,110,116,101,100,69,114,114,111,114,114,65,0,0,
-+ 0,114,19,0,0,0,218,8,111,112,116,105,109,105,122,101,
-+ 218,3,115,116,114,218,7,105,115,97,108,110,117,109,218,10,
-+ 86,97,108,117,101,69,114,114,111,114,114,92,0,0,0,218,
-+ 4,95,79,80,84,218,17,66,89,84,69,67,79,68,69,95,
-+ 83,85,70,70,73,88,69,83,218,14,112,121,99,97,99,104,
-+ 101,95,112,114,101,102,105,120,114,89,0,0,0,114,70,0,
-+ 0,0,114,85,0,0,0,114,53,0,0,0,218,6,108,115,
-+ 116,114,105,112,218,8,95,80,89,67,65,67,72,69,41,12,
-+ 114,68,0,0,0,90,14,100,101,98,117,103,95,111,118,101,
-+ 114,114,105,100,101,114,99,0,0,0,218,7,109,101,115,115,
-+ 97,103,101,218,4,104,101,97,100,114,69,0,0,0,90,4,
-+ 98,97,115,101,114,6,0,0,0,218,4,114,101,115,116,90,
-+ 3,116,97,103,90,15,97,108,109,111,115,116,95,102,105,108,
-+ 101,110,97,109,101,218,8,102,105,108,101,110,97,109,101,114,
-+ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,17,
-+ 99,97,99,104,101,95,102,114,111,109,95,115,111,117,114,99,
-+ 101,124,1,0,0,115,72,0,0,0,8,18,6,1,2,1,
-+ 4,255,8,2,4,1,8,1,12,1,10,1,12,1,16,1,
-+ 8,1,8,1,8,1,24,1,8,1,12,1,6,1,8,2,
-+ 8,1,8,1,8,1,14,1,14,1,12,1,10,1,8,9,
-+ 14,1,24,5,12,1,2,4,4,1,8,1,2,1,4,253,
-+ 12,5,114,124,0,0,0,99,1,0,0,0,0,0,0,0,
-+ 0,0,0,0,10,0,0,0,5,0,0,0,67,0,0,0,
-+ 115,40,1,0,0,116,0,106,1,106,2,100,1,117,0,114,
-+ 10,116,3,100,2,131,1,130,1,116,4,160,5,124,0,161,
-+ 1,125,0,116,6,124,0,131,1,92,2,125,1,125,2,100,
-+ 3,125,3,116,0,106,7,100,1,117,1,114,51,116,0,106,
-+ 7,160,8,116,9,161,1,125,4,124,1,160,10,124,4,116,
-+ 11,23,0,161,1,114,51,124,1,116,12,124,4,131,1,100,
-+ 1,133,2,25,0,125,1,100,4,125,3,124,3,115,72,116,
-+ 6,124,1,131,1,92,2,125,1,125,5,124,5,116,13,107,
-+ 3,114,72,116,14,116,13,155,0,100,5,124,0,155,2,157,
-+ 3,131,1,130,1,124,2,160,15,100,6,161,1,125,6,124,
-+ 6,100,7,118,1,114,88,116,14,100,8,124,2,155,2,157,
-+ 2,131,1,130,1,124,6,100,9,107,2,114,132,124,2,160,
-+ 16,100,6,100,10,161,2,100,11,25,0,125,7,124,7,160,
-+ 10,116,17,161,1,115,112,116,14,100,12,116,17,155,2,157,
-+ 2,131,1,130,1,124,7,116,12,116,17,131,1,100,1,133,
-+ 2,25,0,125,8,124,8,160,18,161,0,115,132,116,14,100,
-+ 13,124,7,155,2,100,14,157,3,131,1,130,1,124,2,160,
-+ 19,100,6,161,1,100,15,25,0,125,9,116,20,124,1,124,
-+ 9,116,21,100,15,25,0,23,0,131,2,83,0,41,16,97,
-+ 110,1,0,0,71,105,118,101,110,32,116,104,101,32,112,97,
-+ 116,104,32,116,111,32,97,32,46,112,121,99,46,32,102,105,
-+ 108,101,44,32,114,101,116,117,114,110,32,116,104,101,32,112,
-+ 97,116,104,32,116,111,32,105,116,115,32,46,112,121,32,102,
-+ 105,108,101,46,10,10,32,32,32,32,84,104,101,32,46,112,
-+ 121,99,32,102,105,108,101,32,100,111,101,115,32,110,111,116,
-+ 32,110,101,101,100,32,116,111,32,101,120,105,115,116,59,32,
-+ 116,104,105,115,32,115,105,109,112,108,121,32,114,101,116,117,
-+ 114,110,115,32,116,104,101,32,112,97,116,104,32,116,111,10,
-+ 32,32,32,32,116,104,101,32,46,112,121,32,102,105,108,101,
-+ 32,99,97,108,99,117,108,97,116,101,100,32,116,111,32,99,
-+ 111,114,114,101,115,112,111,110,100,32,116,111,32,116,104,101,
-+ 32,46,112,121,99,32,102,105,108,101,46,32,32,73,102,32,
-+ 112,97,116,104,32,100,111,101,115,10,32,32,32,32,110,111,
-+ 116,32,99,111,110,102,111,114,109,32,116,111,32,80,69,80,
-+ 32,51,49,52,55,47,52,56,56,32,102,111,114,109,97,116,
-+ 44,32,86,97,108,117,101,69,114,114,111,114,32,119,105,108,
-+ 108,32,98,101,32,114,97,105,115,101,100,46,32,73,102,10,
-+ 32,32,32,32,115,121,115,46,105,109,112,108,101,109,101,110,
-+ 116,97,116,105,111,110,46,99,97,99,104,101,95,116,97,103,
-+ 32,105,115,32,78,111,110,101,32,116,104,101,110,32,78,111,
-+ 116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,111,
-+ 114,32,105,115,32,114,97,105,115,101,100,46,10,10,32,32,
-+ 32,32,78,114,101,0,0,0,70,84,122,31,32,110,111,116,
-+ 32,98,111,116,116,111,109,45,108,101,118,101,108,32,100,105,
-+ 114,101,99,116,111,114,121,32,105,110,32,114,100,0,0,0,
-+ 62,2,0,0,0,114,47,0,0,0,233,3,0,0,0,122,
-+ 29,101,120,112,101,99,116,101,100,32,111,110,108,121,32,50,
-+ 32,111,114,32,51,32,100,111,116,115,32,105,110,32,114,125,
-+ 0,0,0,114,47,0,0,0,233,254,255,255,255,122,53,111,
-+ 112,116,105,109,105,122,97,116,105,111,110,32,112,111,114,116,
-+ 105,111,110,32,111,102,32,102,105,108,101,110,97,109,101,32,
-+ 100,111,101,115,32,110,111,116,32,115,116,97,114,116,32,119,
-+ 105,116,104,32,122,19,111,112,116,105,109,105,122,97,116,105,
-+ 111,110,32,108,101,118,101,108,32,122,29,32,105,115,32,110,
-+ 111,116,32,97,110,32,97,108,112,104,97,110,117,109,101,114,
-+ 105,99,32,118,97,108,117,101,114,0,0,0,0,41,22,114,
-+ 18,0,0,0,114,108,0,0,0,114,109,0,0,0,114,110,
-+ 0,0,0,114,21,0,0,0,114,106,0,0,0,114,77,0,
-+ 0,0,114,117,0,0,0,114,52,0,0,0,114,53,0,0,
-+ 0,114,29,0,0,0,114,62,0,0,0,114,4,0,0,0,
-+ 114,119,0,0,0,114,114,0,0,0,218,5,99,111,117,110,
-+ 116,218,6,114,115,112,108,105,116,114,115,0,0,0,114,113,
-+ 0,0,0,218,9,112,97,114,116,105,116,105,111,110,114,70,
-+ 0,0,0,218,15,83,79,85,82,67,69,95,83,85,70,70,
-+ 73,88,69,83,41,10,114,68,0,0,0,114,121,0,0,0,
-+ 90,16,112,121,99,97,99,104,101,95,102,105,108,101,110,97,
-+ 109,101,90,23,102,111,117,110,100,95,105,110,95,112,121,99,
-+ 97,99,104,101,95,112,114,101,102,105,120,90,13,115,116,114,
-+ 105,112,112,101,100,95,112,97,116,104,90,7,112,121,99,97,
-+ 99,104,101,90,9,100,111,116,95,99,111,117,110,116,114,99,
-+ 0,0,0,90,9,111,112,116,95,108,101,118,101,108,90,13,
-+ 98,97,115,101,95,102,105,108,101,110,97,109,101,114,7,0,
-+ 0,0,114,7,0,0,0,114,8,0,0,0,218,17,115,111,
-+ 117,114,99,101,95,102,114,111,109,95,99,97,99,104,101,195,
-+ 1,0,0,115,60,0,0,0,12,9,8,1,10,1,12,1,
-+ 4,1,10,1,12,1,14,1,16,1,4,1,4,1,12,1,
-+ 8,1,8,1,2,1,8,255,10,2,8,1,14,1,8,1,
-+ 16,1,10,1,4,1,2,1,8,255,16,2,8,1,16,1,
-+ 14,2,18,1,114,131,0,0,0,99,1,0,0,0,0,0,
-+ 0,0,0,0,0,0,5,0,0,0,9,0,0,0,67,0,
-+ 0,0,115,124,0,0,0,116,0,124,0,131,1,100,1,107,
-+ 2,114,8,100,2,83,0,124,0,160,1,100,3,161,1,92,
-+ 3,125,1,125,2,125,3,124,1,114,28,124,3,160,2,161,
-+ 0,100,4,100,5,133,2,25,0,100,6,107,3,114,30,124,
-+ 0,83,0,122,6,116,3,124,0,131,1,125,4,87,0,110,
-+ 17,4,0,116,4,116,5,102,2,121,53,1,0,1,0,1,
-+ 0,124,0,100,2,100,5,133,2,25,0,125,4,89,0,110,
-+ 1,119,0,116,6,124,4,131,1,114,60,124,4,83,0,124,
-+ 0,83,0,41,7,122,188,67,111,110,118,101,114,116,32,97,
-+ 32,98,121,116,101,99,111,100,101,32,102,105,108,101,32,112,
-+ 97,116,104,32,116,111,32,97,32,115,111,117,114,99,101,32,
-+ 112,97,116,104,32,40,105,102,32,112,111,115,115,105,98,108,
-+ 101,41,46,10,10,32,32,32,32,84,104,105,115,32,102,117,
-+ 110,99,116,105,111,110,32,101,120,105,115,116,115,32,112,117,
-+ 114,101,108,121,32,102,111,114,32,98,97,99,107,119,97,114,
-+ 100,115,45,99,111,109,112,97,116,105,98,105,108,105,116,121,
-+ 32,102,111,114,10,32,32,32,32,80,121,73,109,112,111,114,
-+ 116,95,69,120,101,99,67,111,100,101,77,111,100,117,108,101,
-+ 87,105,116,104,70,105,108,101,110,97,109,101,115,40,41,32,
-+ 105,110,32,116,104,101,32,67,32,65,80,73,46,10,10,32,
-+ 32,32,32,114,0,0,0,0,78,114,100,0,0,0,233,253,
-+ 255,255,255,233,255,255,255,255,90,2,112,121,41,7,114,4,
-+ 0,0,0,114,107,0,0,0,218,5,108,111,119,101,114,114,
-+ 131,0,0,0,114,110,0,0,0,114,114,0,0,0,114,83,
-+ 0,0,0,41,5,218,13,98,121,116,101,99,111,100,101,95,
-+ 112,97,116,104,114,122,0,0,0,218,1,95,90,9,101,120,
-+ 116,101,110,115,105,111,110,218,11,115,111,117,114,99,101,95,
-+ 112,97,116,104,114,7,0,0,0,114,7,0,0,0,114,8,
-+ 0,0,0,218,15,95,103,101,116,95,115,111,117,114,99,101,
-+ 102,105,108,101,235,1,0,0,115,22,0,0,0,12,7,4,
-+ 1,16,1,24,1,4,1,2,1,12,1,16,1,16,1,2,
-+ 255,16,2,114,138,0,0,0,99,1,0,0,0,0,0,0,
-+ 0,0,0,0,0,1,0,0,0,8,0,0,0,67,0,0,
-+ 0,115,68,0,0,0,124,0,160,0,116,1,116,2,131,1,
-+ 161,1,114,23,122,5,116,3,124,0,131,1,87,0,83,0,
-+ 4,0,116,4,121,22,1,0,1,0,1,0,89,0,100,0,
-+ 83,0,119,0,124,0,160,0,116,1,116,5,131,1,161,1,
-+ 114,32,124,0,83,0,100,0,83,0,114,72,0,0,0,41,
-+ 6,114,61,0,0,0,218,5,116,117,112,108,101,114,130,0,
-+ 0,0,114,124,0,0,0,114,110,0,0,0,114,116,0,0,
-+ 0,41,1,114,123,0,0,0,114,7,0,0,0,114,7,0,
-+ 0,0,114,8,0,0,0,218,11,95,103,101,116,95,99,97,
-+ 99,104,101,100,254,1,0,0,115,18,0,0,0,14,1,2,
-+ 1,10,1,12,1,6,1,2,255,14,2,4,1,4,2,114,
-+ 140,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,
-+ 0,2,0,0,0,8,0,0,0,67,0,0,0,115,50,0,
-+ 0,0,122,7,116,0,124,0,131,1,106,1,125,1,87,0,
-+ 110,11,4,0,116,2,121,18,1,0,1,0,1,0,100,1,
-+ 125,1,89,0,110,1,119,0,124,1,100,2,79,0,125,1,
-+ 124,1,83,0,41,3,122,51,67,97,108,99,117,108,97,116,
-+ 101,32,116,104,101,32,109,111,100,101,32,112,101,114,109,105,
-+ 115,115,105,111,110,115,32,102,111,114,32,97,32,98,121,116,
-+ 101,99,111,100,101,32,102,105,108,101,46,114,90,0,0,0,
-+ 233,128,0,0,0,41,3,114,78,0,0,0,114,80,0,0,
-+ 0,114,79,0,0,0,41,2,114,68,0,0,0,114,81,0,
-+ 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-+ 0,218,10,95,99,97,108,99,95,109,111,100,101,10,2,0,
-+ 0,115,14,0,0,0,2,2,14,1,12,1,8,1,2,255,
-+ 8,4,4,1,114,142,0,0,0,99,1,0,0,0,0,0,
-+ 0,0,0,0,0,0,3,0,0,0,4,0,0,0,3,0,
-+ 0,0,115,52,0,0,0,100,6,135,0,102,1,100,2,100,
-+ 3,132,9,125,1,116,0,100,1,117,1,114,15,116,0,106,
-+ 1,125,2,110,4,100,4,100,5,132,0,125,2,124,2,124,
-+ 1,136,0,131,2,1,0,124,1,83,0,41,7,122,252,68,
-+ 101,99,111,114,97,116,111,114,32,116,111,32,118,101,114,105,
-+ 102,121,32,116,104,97,116,32,116,104,101,32,109,111,100,117,
-+ 108,101,32,98,101,105,110,103,32,114,101,113,117,101,115,116,
-+ 101,100,32,109,97,116,99,104,101,115,32,116,104,101,32,111,
-+ 110,101,32,116,104,101,10,32,32,32,32,108,111,97,100,101,
-+ 114,32,99,97,110,32,104,97,110,100,108,101,46,10,10,32,
-+ 32,32,32,84,104,101,32,102,105,114,115,116,32,97,114,103,
-+ 117,109,101,110,116,32,40,115,101,108,102,41,32,109,117,115,
-+ 116,32,100,101,102,105,110,101,32,95,110,97,109,101,32,119,
-+ 104,105,99,104,32,116,104,101,32,115,101,99,111,110,100,32,
-+ 97,114,103,117,109,101,110,116,32,105,115,10,32,32,32,32,
-+ 99,111,109,112,97,114,101,100,32,97,103,97,105,110,115,116,
-+ 46,32,73,102,32,116,104,101,32,99,111,109,112,97,114,105,
-+ 115,111,110,32,102,97,105,108,115,32,116,104,101,110,32,73,
-+ 109,112,111,114,116,69,114,114,111,114,32,105,115,32,114,97,
-+ 105,115,101,100,46,10,10,32,32,32,32,78,99,2,0,0,
-+ 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,
-+ 0,31,0,0,0,115,72,0,0,0,124,1,100,0,117,0,
-+ 114,8,124,0,106,0,125,1,110,16,124,0,106,0,124,1,
-+ 107,3,114,24,116,1,100,1,124,0,106,0,124,1,102,2,
-+ 22,0,124,1,100,2,141,2,130,1,136,0,124,0,124,1,
-+ 103,2,124,2,162,1,82,0,105,0,124,3,164,1,142,1,
-+ 83,0,41,3,78,122,30,108,111,97,100,101,114,32,102,111,
-+ 114,32,37,115,32,99,97,110,110,111,116,32,104,97,110,100,
-+ 108,101,32,37,115,169,1,218,4,110,97,109,101,41,2,114,
-+ 144,0,0,0,218,11,73,109,112,111,114,116,69,114,114,111,
-+ 114,41,4,218,4,115,101,108,102,114,144,0,0,0,218,4,
-+ 97,114,103,115,218,6,107,119,97,114,103,115,169,1,218,6,
-+ 109,101,116,104,111,100,114,7,0,0,0,114,8,0,0,0,
-+ 218,19,95,99,104,101,99,107,95,110,97,109,101,95,119,114,
-+ 97,112,112,101,114,30,2,0,0,115,18,0,0,0,8,1,
-+ 8,1,10,1,4,1,8,1,2,255,2,1,6,255,24,2,
-+ 122,40,95,99,104,101,99,107,95,110,97,109,101,46,60,108,
-+ 111,99,97,108,115,62,46,95,99,104,101,99,107,95,110,97,
-+ 109,101,95,119,114,97,112,112,101,114,99,2,0,0,0,0,
-+ 0,0,0,0,0,0,0,3,0,0,0,7,0,0,0,83,
-+ 0,0,0,115,56,0,0,0,100,1,68,0,93,16,125,2,
-+ 116,0,124,1,124,2,131,2,114,18,116,1,124,0,124,2,
-+ 116,2,124,1,124,2,131,2,131,3,1,0,113,2,124,0,
-+ 106,3,160,4,124,1,106,3,161,1,1,0,100,0,83,0,
-+ 41,2,78,41,4,218,10,95,95,109,111,100,117,108,101,95,
-+ 95,218,8,95,95,110,97,109,101,95,95,218,12,95,95,113,
-+ 117,97,108,110,97,109,101,95,95,218,7,95,95,100,111,99,
-+ 95,95,41,5,218,7,104,97,115,97,116,116,114,218,7,115,
-+ 101,116,97,116,116,114,218,7,103,101,116,97,116,116,114,218,
-+ 8,95,95,100,105,99,116,95,95,218,6,117,112,100,97,116,
-+ 101,41,3,90,3,110,101,119,90,3,111,108,100,114,88,0,
- 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-- 0,218,13,95,99,108,97,115,115,105,102,121,95,112,121,99,
-- 73,2,0,0,115,28,0,0,0,12,16,8,1,16,1,12,
-- 1,16,1,12,1,10,1,12,1,8,1,16,1,8,2,16,
-- 1,16,1,4,1,114,176,0,0,0,99,5,0,0,0,0,
-+ 0,218,5,95,119,114,97,112,43,2,0,0,115,10,0,0,
-+ 0,8,1,10,1,18,1,2,128,18,1,122,26,95,99,104,
-+ 101,99,107,95,110,97,109,101,46,60,108,111,99,97,108,115,
-+ 62,46,95,119,114,97,112,114,72,0,0,0,41,2,218,10,
-+ 95,98,111,111,116,115,116,114,97,112,114,161,0,0,0,41,
-+ 3,114,150,0,0,0,114,151,0,0,0,114,161,0,0,0,
-+ 114,7,0,0,0,114,149,0,0,0,114,8,0,0,0,218,
-+ 11,95,99,104,101,99,107,95,110,97,109,101,22,2,0,0,
-+ 115,12,0,0,0,14,8,8,10,8,1,8,2,10,6,4,
-+ 1,114,163,0,0,0,99,2,0,0,0,0,0,0,0,0,
-+ 0,0,0,5,0,0,0,6,0,0,0,67,0,0,0,115,
-+ 72,0,0,0,116,0,160,1,100,1,116,2,161,2,1,0,
-+ 124,0,160,3,124,1,161,1,92,2,125,2,125,3,124,2,
-+ 100,2,117,0,114,34,116,4,124,3,131,1,114,34,100,3,
-+ 125,4,116,0,160,1,124,4,160,5,124,3,100,4,25,0,
-+ 161,1,116,6,161,2,1,0,124,2,83,0,41,5,122,155,
-+ 84,114,121,32,116,111,32,102,105,110,100,32,97,32,108,111,
-+ 97,100,101,114,32,102,111,114,32,116,104,101,32,115,112,101,
-+ 99,105,102,105,101,100,32,109,111,100,117,108,101,32,98,121,
-+ 32,100,101,108,101,103,97,116,105,110,103,32,116,111,10,32,
-+ 32,32,32,115,101,108,102,46,102,105,110,100,95,108,111,97,
-+ 100,101,114,40,41,46,10,10,32,32,32,32,84,104,105,115,
-+ 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,
-+ 99,97,116,101,100,32,105,110,32,102,97,118,111,114,32,111,
-+ 102,32,102,105,110,100,101,114,46,102,105,110,100,95,115,112,
-+ 101,99,40,41,46,10,10,32,32,32,32,122,90,102,105,110,
-+ 100,95,109,111,100,117,108,101,40,41,32,105,115,32,100,101,
-+ 112,114,101,99,97,116,101,100,32,97,110,100,32,115,108,97,
-+ 116,101,100,32,102,111,114,32,114,101,109,111,118,97,108,32,
-+ 105,110,32,80,121,116,104,111,110,32,51,46,49,50,59,32,
-+ 117,115,101,32,102,105,110,100,95,115,112,101,99,40,41,32,
-+ 105,110,115,116,101,97,100,78,122,44,78,111,116,32,105,109,
-+ 112,111,114,116,105,110,103,32,100,105,114,101,99,116,111,114,
-+ 121,32,123,125,58,32,109,105,115,115,105,110,103,32,95,95,
-+ 105,110,105,116,95,95,114,0,0,0,0,41,7,114,102,0,
-+ 0,0,114,103,0,0,0,114,104,0,0,0,218,11,102,105,
-+ 110,100,95,108,111,97,100,101,114,114,4,0,0,0,114,92,
-+ 0,0,0,218,13,73,109,112,111,114,116,87,97,114,110,105,
-+ 110,103,41,5,114,146,0,0,0,218,8,102,117,108,108,110,
-+ 97,109,101,218,6,108,111,97,100,101,114,218,8,112,111,114,
-+ 116,105,111,110,115,218,3,109,115,103,114,7,0,0,0,114,
-+ 7,0,0,0,114,8,0,0,0,218,17,95,102,105,110,100,
-+ 95,109,111,100,117,108,101,95,115,104,105,109,53,2,0,0,
-+ 115,16,0,0,0,6,7,2,2,4,254,14,6,16,1,4,
-+ 1,22,1,4,1,114,170,0,0,0,99,3,0,0,0,0,
- 0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,67,
-- 0,0,0,115,124,0,0,0,116,0,124,0,100,1,100,2,
-- 133,2,25,0,131,1,124,1,100,3,64,0,107,3,114,31,
-- 100,4,124,3,155,2,157,2,125,5,116,1,160,2,100,5,
-- 124,5,161,2,1,0,116,3,124,5,102,1,105,0,124,4,
-- 164,1,142,1,130,1,124,2,100,6,117,1,114,58,116,0,
-- 124,0,100,2,100,7,133,2,25,0,131,1,124,2,100,3,
-- 64,0,107,3,114,60,116,3,100,4,124,3,155,2,157,2,
-- 102,1,105,0,124,4,164,1,142,1,130,1,100,6,83,0,
-- 100,6,83,0,41,8,97,7,2,0,0,86,97,108,105,100,
-- 97,116,101,32,97,32,112,121,99,32,97,103,97,105,110,115,
-- 116,32,116,104,101,32,115,111,117,114,99,101,32,108,97,115,
-- 116,45,109,111,100,105,102,105,101,100,32,116,105,109,101,46,
-- 10,10,32,32,32,32,42,100,97,116,97,42,32,105,115,32,
-- 116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,
-- 116,104,101,32,112,121,99,32,102,105,108,101,46,32,40,79,
-- 110,108,121,32,116,104,101,32,102,105,114,115,116,32,49,54,
-- 32,98,121,116,101,115,32,97,114,101,10,32,32,32,32,114,
-- 101,113,117,105,114,101,100,46,41,10,10,32,32,32,32,42,
-- 115,111,117,114,99,101,95,109,116,105,109,101,42,32,105,115,
-- 32,116,104,101,32,108,97,115,116,32,109,111,100,105,102,105,
-- 101,100,32,116,105,109,101,115,116,97,109,112,32,111,102,32,
-- 116,104,101,32,115,111,117,114,99,101,32,102,105,108,101,46,
-- 10,10,32,32,32,32,42,115,111,117,114,99,101,95,115,105,
-- 122,101,42,32,105,115,32,78,111,110,101,32,111,114,32,116,
-- 104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,115,
-- 111,117,114,99,101,32,102,105,108,101,32,105,110,32,98,121,
-- 116,101,115,46,10,10,32,32,32,32,42,110,97,109,101,42,
-- 32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,
-- 116,104,101,32,109,111,100,117,108,101,32,98,101,105,110,103,
-- 32,105,109,112,111,114,116,101,100,46,32,73,116,32,105,115,
-- 32,117,115,101,100,32,102,111,114,32,108,111,103,103,105,110,
-- 103,46,10,10,32,32,32,32,42,101,120,99,95,100,101,116,
-- 97,105,108,115,42,32,105,115,32,97,32,100,105,99,116,105,
-- 111,110,97,114,121,32,112,97,115,115,101,100,32,116,111,32,
-- 73,109,112,111,114,116,69,114,114,111,114,32,105,102,32,105,
-- 116,32,114,97,105,115,101,100,32,102,111,114,10,32,32,32,
-- 32,105,109,112,114,111,118,101,100,32,100,101,98,117,103,103,
-- 105,110,103,46,10,10,32,32,32,32,65,110,32,73,109,112,
-- 111,114,116,69,114,114,111,114,32,105,115,32,114,97,105,115,
-- 101,100,32,105,102,32,116,104,101,32,98,121,116,101,99,111,
-- 100,101,32,105,115,32,115,116,97,108,101,46,10,10,32,32,
-- 32,32,114,170,0,0,0,233,12,0,0,0,114,30,0,0,
-- 0,122,22,98,121,116,101,99,111,100,101,32,105,115,32,115,
-- 116,97,108,101,32,102,111,114,32,114,168,0,0,0,78,114,
-- 169,0,0,0,41,4,114,42,0,0,0,114,159,0,0,0,
-- 114,173,0,0,0,114,142,0,0,0,41,6,114,41,0,0,
-- 0,218,12,115,111,117,114,99,101,95,109,116,105,109,101,218,
-- 11,115,111,117,114,99,101,95,115,105,122,101,114,141,0,0,
-- 0,114,175,0,0,0,114,117,0,0,0,114,7,0,0,0,
-- 114,7,0,0,0,114,8,0,0,0,218,23,95,118,97,108,
-- 105,100,97,116,101,95,116,105,109,101,115,116,97,109,112,95,
-- 112,121,99,106,2,0,0,115,18,0,0,0,24,19,10,1,
-- 12,1,16,1,8,1,24,1,22,1,4,254,4,1,114,180,
-- 0,0,0,99,4,0,0,0,0,0,0,0,0,0,0,0,
-- 4,0,0,0,4,0,0,0,67,0,0,0,115,42,0,0,
-- 0,124,0,100,1,100,2,133,2,25,0,124,1,107,3,114,
-- 19,116,0,100,3,124,2,155,2,157,2,102,1,105,0,124,
-- 3,164,1,142,1,130,1,100,4,83,0,41,5,97,243,1,
-- 0,0,86,97,108,105,100,97,116,101,32,97,32,104,97,115,
-- 104,45,98,97,115,101,100,32,112,121,99,32,98,121,32,99,
-- 104,101,99,107,105,110,103,32,116,104,101,32,114,101,97,108,
-- 32,115,111,117,114,99,101,32,104,97,115,104,32,97,103,97,
-- 105,110,115,116,32,116,104,101,32,111,110,101,32,105,110,10,
-- 32,32,32,32,116,104,101,32,112,121,99,32,104,101,97,100,
-- 101,114,46,10,10,32,32,32,32,42,100,97,116,97,42,32,
-- 105,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32,
-- 111,102,32,116,104,101,32,112,121,99,32,102,105,108,101,46,
-- 32,40,79,110,108,121,32,116,104,101,32,102,105,114,115,116,
-- 32,49,54,32,98,121,116,101,115,32,97,114,101,10,32,32,
-- 32,32,114,101,113,117,105,114,101,100,46,41,10,10,32,32,
-- 32,32,42,115,111,117,114,99,101,95,104,97,115,104,42,32,
-- 105,115,32,116,104,101,32,105,109,112,111,114,116,108,105,98,
-- 46,117,116,105,108,46,115,111,117,114,99,101,95,104,97,115,
-- 104,40,41,32,111,102,32,116,104,101,32,115,111,117,114,99,
-- 101,32,102,105,108,101,46,10,10,32,32,32,32,42,110,97,
-- 109,101,42,32,105,115,32,116,104,101,32,110,97,109,101,32,
-- 111,102,32,116,104,101,32,109,111,100,117,108,101,32,98,101,
-- 105,110,103,32,105,109,112,111,114,116,101,100,46,32,73,116,
-- 32,105,115,32,117,115,101,100,32,102,111,114,32,108,111,103,
-- 103,105,110,103,46,10,10,32,32,32,32,42,101,120,99,95,
-- 100,101,116,97,105,108,115,42,32,105,115,32,97,32,100,105,
-- 99,116,105,111,110,97,114,121,32,112,97,115,115,101,100,32,
-- 116,111,32,73,109,112,111,114,116,69,114,114,111,114,32,105,
-- 102,32,105,116,32,114,97,105,115,101,100,32,102,111,114,10,
-- 32,32,32,32,105,109,112,114,111,118,101,100,32,100,101,98,
-- 117,103,103,105,110,103,46,10,10,32,32,32,32,65,110,32,
-- 73,109,112,111,114,116,69,114,114,111,114,32,105,115,32,114,
-- 97,105,115,101,100,32,105,102,32,116,104,101,32,98,121,116,
-- 101,99,111,100,101,32,105,115,32,115,116,97,108,101,46,10,
-- 10,32,32,32,32,114,170,0,0,0,114,169,0,0,0,122,
-- 46,104,97,115,104,32,105,110,32,98,121,116,101,99,111,100,
-- 101,32,100,111,101,115,110,39,116,32,109,97,116,99,104,32,
-- 104,97,115,104,32,111,102,32,115,111,117,114,99,101,32,78,
-- 41,1,114,142,0,0,0,41,4,114,41,0,0,0,218,11,
-- 115,111,117,114,99,101,95,104,97,115,104,114,141,0,0,0,
-- 114,175,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
-- 8,0,0,0,218,18,95,118,97,108,105,100,97,116,101,95,
-- 104,97,115,104,95,112,121,99,134,2,0,0,115,14,0,0,
-- 0,16,17,2,1,8,1,4,255,2,2,6,254,4,255,114,
-- 182,0,0,0,99,4,0,0,0,0,0,0,0,0,0,0,
-- 0,5,0,0,0,5,0,0,0,67,0,0,0,115,76,0,
-- 0,0,116,0,160,1,124,0,161,1,125,4,116,2,124,4,
-- 116,3,131,2,114,28,116,4,160,5,100,1,124,2,161,2,
-- 1,0,124,3,100,2,117,1,114,26,116,6,160,7,124,4,
-- 124,3,161,2,1,0,124,4,83,0,116,8,100,3,160,9,
-- 124,2,161,1,124,1,124,2,100,4,141,3,130,1,41,5,
-- 122,35,67,111,109,112,105,108,101,32,98,121,116,101,99,111,
-- 100,101,32,97,115,32,102,111,117,110,100,32,105,110,32,97,
-- 32,112,121,99,46,122,21,99,111,100,101,32,111,98,106,101,
-- 99,116,32,102,114,111,109,32,123,33,114,125,78,122,23,78,
-- 111,110,45,99,111,100,101,32,111,98,106,101,99,116,32,105,
-- 110,32,123,33,114,125,169,2,114,141,0,0,0,114,65,0,
-- 0,0,41,10,218,7,109,97,114,115,104,97,108,90,5,108,
-- 111,97,100,115,218,10,105,115,105,110,115,116,97,110,99,101,
-- 218,10,95,99,111,100,101,95,116,121,112,101,114,159,0,0,
-- 0,114,173,0,0,0,218,4,95,105,109,112,90,16,95,102,
-- 105,120,95,99,111,95,102,105,108,101,110,97,109,101,114,142,
-- 0,0,0,114,89,0,0,0,41,5,114,41,0,0,0,114,
-- 141,0,0,0,114,132,0,0,0,114,134,0,0,0,218,4,
-- 99,111,100,101,114,7,0,0,0,114,7,0,0,0,114,8,
-- 0,0,0,218,17,95,99,111,109,112,105,108,101,95,98,121,
-- 116,101,99,111,100,101,158,2,0,0,115,18,0,0,0,10,
-- 2,10,1,12,1,8,1,12,1,4,1,10,2,4,1,6,
-- 255,114,189,0,0,0,99,3,0,0,0,0,0,0,0,0,
-- 0,0,0,4,0,0,0,5,0,0,0,67,0,0,0,115,
-- 70,0,0,0,116,0,116,1,131,1,125,3,124,3,160,2,
-- 116,3,100,1,131,1,161,1,1,0,124,3,160,2,116,3,
-- 124,1,131,1,161,1,1,0,124,3,160,2,116,3,124,2,
-- 131,1,161,1,1,0,124,3,160,2,116,4,160,5,124,0,
-- 161,1,161,1,1,0,124,3,83,0,41,2,122,43,80,114,
-- 111,100,117,99,101,32,116,104,101,32,100,97,116,97,32,102,
-- 111,114,32,97,32,116,105,109,101,115,116,97,109,112,45,98,
-- 97,115,101,100,32,112,121,99,46,114,0,0,0,0,41,6,
-- 218,9,98,121,116,101,97,114,114,97,121,114,172,0,0,0,
-- 218,6,101,120,116,101,110,100,114,36,0,0,0,114,184,0,
-- 0,0,218,5,100,117,109,112,115,41,4,114,188,0,0,0,
-- 218,5,109,116,105,109,101,114,179,0,0,0,114,41,0,0,
-+ 0,0,0,115,166,0,0,0,124,0,100,1,100,2,133,2,
-+ 25,0,125,3,124,3,116,0,107,3,114,32,100,3,124,1,
-+ 155,2,100,4,124,3,155,2,157,4,125,4,116,1,160,2,
-+ 100,5,124,4,161,2,1,0,116,3,124,4,102,1,105,0,
-+ 124,2,164,1,142,1,130,1,116,4,124,0,131,1,100,6,
-+ 107,0,114,53,100,7,124,1,155,2,157,2,125,4,116,1,
-+ 160,2,100,5,124,4,161,2,1,0,116,5,124,4,131,1,
-+ 130,1,116,6,124,0,100,2,100,8,133,2,25,0,131,1,
-+ 125,5,124,5,100,9,64,0,114,81,100,10,124,5,155,2,
-+ 100,11,124,1,155,2,157,4,125,4,116,3,124,4,102,1,
-+ 105,0,124,2,164,1,142,1,130,1,124,5,83,0,41,12,
-+ 97,84,2,0,0,80,101,114,102,111,114,109,32,98,97,115,
-+ 105,99,32,118,97,108,105,100,105,116,121,32,99,104,101,99,
-+ 107,105,110,103,32,111,102,32,97,32,112,121,99,32,104,101,
-+ 97,100,101,114,32,97,110,100,32,114,101,116,117,114,110,32,
-+ 116,104,101,32,102,108,97,103,115,32,102,105,101,108,100,44,
-+ 10,32,32,32,32,119,104,105,99,104,32,100,101,116,101,114,
-+ 109,105,110,101,115,32,104,111,119,32,116,104,101,32,112,121,
-+ 99,32,115,104,111,117,108,100,32,98,101,32,102,117,114,116,
-+ 104,101,114,32,118,97,108,105,100,97,116,101,100,32,97,103,
-+ 97,105,110,115,116,32,116,104,101,32,115,111,117,114,99,101,
-+ 46,10,10,32,32,32,32,42,100,97,116,97,42,32,105,115,
-+ 32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,
-+ 32,116,104,101,32,112,121,99,32,102,105,108,101,46,32,40,
-+ 79,110,108,121,32,116,104,101,32,102,105,114,115,116,32,49,
-+ 54,32,98,121,116,101,115,32,97,114,101,10,32,32,32,32,
-+ 114,101,113,117,105,114,101,100,44,32,116,104,111,117,103,104,
-+ 46,41,10,10,32,32,32,32,42,110,97,109,101,42,32,105,
-+ 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,
-+ 101,32,109,111,100,117,108,101,32,98,101,105,110,103,32,105,
-+ 109,112,111,114,116,101,100,46,32,73,116,32,105,115,32,117,
-+ 115,101,100,32,102,111,114,32,108,111,103,103,105,110,103,46,
-+ 10,10,32,32,32,32,42,101,120,99,95,100,101,116,97,105,
-+ 108,115,42,32,105,115,32,97,32,100,105,99,116,105,111,110,
-+ 97,114,121,32,112,97,115,115,101,100,32,116,111,32,73,109,
-+ 112,111,114,116,69,114,114,111,114,32,105,102,32,105,116,32,
-+ 114,97,105,115,101,100,32,102,111,114,10,32,32,32,32,105,
-+ 109,112,114,111,118,101,100,32,100,101,98,117,103,103,105,110,
-+ 103,46,10,10,32,32,32,32,73,109,112,111,114,116,69,114,
-+ 114,111,114,32,105,115,32,114,97,105,115,101,100,32,119,104,
-+ 101,110,32,116,104,101,32,109,97,103,105,99,32,110,117,109,
-+ 98,101,114,32,105,115,32,105,110,99,111,114,114,101,99,116,
-+ 32,111,114,32,119,104,101,110,32,116,104,101,32,102,108,97,
-+ 103,115,10,32,32,32,32,102,105,101,108,100,32,105,115,32,
-+ 105,110,118,97,108,105,100,46,32,69,79,70,69,114,114,111,
-+ 114,32,105,115,32,114,97,105,115,101,100,32,119,104,101,110,
-+ 32,116,104,101,32,100,97,116,97,32,105,115,32,102,111,117,
-+ 110,100,32,116,111,32,98,101,32,116,114,117,110,99,97,116,
-+ 101,100,46,10,10,32,32,32,32,78,114,34,0,0,0,122,
-+ 20,98,97,100,32,109,97,103,105,99,32,110,117,109,98,101,
-+ 114,32,105,110,32,122,2,58,32,250,2,123,125,233,16,0,
-+ 0,0,122,40,114,101,97,99,104,101,100,32,69,79,70,32,
-+ 119,104,105,108,101,32,114,101,97,100,105,110,103,32,112,121,
-+ 99,32,104,101,97,100,101,114,32,111,102,32,233,8,0,0,
-+ 0,233,252,255,255,255,122,14,105,110,118,97,108,105,100,32,
-+ 102,108,97,103,115,32,122,4,32,105,110,32,41,7,218,12,
-+ 77,65,71,73,67,95,78,85,77,66,69,82,114,162,0,0,
-+ 0,218,16,95,118,101,114,98,111,115,101,95,109,101,115,115,
-+ 97,103,101,114,145,0,0,0,114,4,0,0,0,218,8,69,
-+ 79,70,69,114,114,111,114,114,45,0,0,0,41,6,114,44,
-+ 0,0,0,114,144,0,0,0,218,11,101,120,99,95,100,101,
-+ 116,97,105,108,115,90,5,109,97,103,105,99,114,120,0,0,
-+ 0,114,19,0,0,0,114,7,0,0,0,114,7,0,0,0,
-+ 114,8,0,0,0,218,13,95,99,108,97,115,115,105,102,121,
-+ 95,112,121,99,73,2,0,0,115,28,0,0,0,12,16,8,
-+ 1,16,1,12,1,16,1,12,1,10,1,12,1,8,1,16,
-+ 1,8,2,16,1,16,1,4,1,114,179,0,0,0,99,5,
-+ 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,4,
-+ 0,0,0,67,0,0,0,115,124,0,0,0,116,0,124,0,
-+ 100,1,100,2,133,2,25,0,131,1,124,1,100,3,64,0,
-+ 107,3,114,31,100,4,124,3,155,2,157,2,125,5,116,1,
-+ 160,2,100,5,124,5,161,2,1,0,116,3,124,5,102,1,
-+ 105,0,124,4,164,1,142,1,130,1,124,2,100,6,117,1,
-+ 114,58,116,0,124,0,100,2,100,7,133,2,25,0,131,1,
-+ 124,2,100,3,64,0,107,3,114,60,116,3,100,4,124,3,
-+ 155,2,157,2,102,1,105,0,124,4,164,1,142,1,130,1,
-+ 100,6,83,0,100,6,83,0,41,8,97,7,2,0,0,86,
-+ 97,108,105,100,97,116,101,32,97,32,112,121,99,32,97,103,
-+ 97,105,110,115,116,32,116,104,101,32,115,111,117,114,99,101,
-+ 32,108,97,115,116,45,109,111,100,105,102,105,101,100,32,116,
-+ 105,109,101,46,10,10,32,32,32,32,42,100,97,116,97,42,
-+ 32,105,115,32,116,104,101,32,99,111,110,116,101,110,116,115,
-+ 32,111,102,32,116,104,101,32,112,121,99,32,102,105,108,101,
-+ 46,32,40,79,110,108,121,32,116,104,101,32,102,105,114,115,
-+ 116,32,49,54,32,98,121,116,101,115,32,97,114,101,10,32,
-+ 32,32,32,114,101,113,117,105,114,101,100,46,41,10,10,32,
-+ 32,32,32,42,115,111,117,114,99,101,95,109,116,105,109,101,
-+ 42,32,105,115,32,116,104,101,32,108,97,115,116,32,109,111,
-+ 100,105,102,105,101,100,32,116,105,109,101,115,116,97,109,112,
-+ 32,111,102,32,116,104,101,32,115,111,117,114,99,101,32,102,
-+ 105,108,101,46,10,10,32,32,32,32,42,115,111,117,114,99,
-+ 101,95,115,105,122,101,42,32,105,115,32,78,111,110,101,32,
-+ 111,114,32,116,104,101,32,115,105,122,101,32,111,102,32,116,
-+ 104,101,32,115,111,117,114,99,101,32,102,105,108,101,32,105,
-+ 110,32,98,121,116,101,115,46,10,10,32,32,32,32,42,110,
-+ 97,109,101,42,32,105,115,32,116,104,101,32,110,97,109,101,
-+ 32,111,102,32,116,104,101,32,109,111,100,117,108,101,32,98,
-+ 101,105,110,103,32,105,109,112,111,114,116,101,100,46,32,73,
-+ 116,32,105,115,32,117,115,101,100,32,102,111,114,32,108,111,
-+ 103,103,105,110,103,46,10,10,32,32,32,32,42,101,120,99,
-+ 95,100,101,116,97,105,108,115,42,32,105,115,32,97,32,100,
-+ 105,99,116,105,111,110,97,114,121,32,112,97,115,115,101,100,
-+ 32,116,111,32,73,109,112,111,114,116,69,114,114,111,114,32,
-+ 105,102,32,105,116,32,114,97,105,115,101,100,32,102,111,114,
-+ 10,32,32,32,32,105,109,112,114,111,118,101,100,32,100,101,
-+ 98,117,103,103,105,110,103,46,10,10,32,32,32,32,65,110,
-+ 32,73,109,112,111,114,116,69,114,114,111,114,32,105,115,32,
-+ 114,97,105,115,101,100,32,105,102,32,116,104,101,32,98,121,
-+ 116,101,99,111,100,101,32,105,115,32,115,116,97,108,101,46,
-+ 10,10,32,32,32,32,114,173,0,0,0,233,12,0,0,0,
-+ 114,33,0,0,0,122,22,98,121,116,101,99,111,100,101,32,
-+ 105,115,32,115,116,97,108,101,32,102,111,114,32,114,171,0,
-+ 0,0,78,114,172,0,0,0,41,4,114,45,0,0,0,114,
-+ 162,0,0,0,114,176,0,0,0,114,145,0,0,0,41,6,
-+ 114,44,0,0,0,218,12,115,111,117,114,99,101,95,109,116,
-+ 105,109,101,218,11,115,111,117,114,99,101,95,115,105,122,101,
-+ 114,144,0,0,0,114,178,0,0,0,114,120,0,0,0,114,
-+ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,23,
-+ 95,118,97,108,105,100,97,116,101,95,116,105,109,101,115,116,
-+ 97,109,112,95,112,121,99,106,2,0,0,115,18,0,0,0,
-+ 24,19,10,1,12,1,16,1,8,1,24,1,22,1,4,254,
-+ 4,1,114,183,0,0,0,99,4,0,0,0,0,0,0,0,
-+ 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,
-+ 115,42,0,0,0,124,0,100,1,100,2,133,2,25,0,124,
-+ 1,107,3,114,19,116,0,100,3,124,2,155,2,157,2,102,
-+ 1,105,0,124,3,164,1,142,1,130,1,100,4,83,0,41,
-+ 5,97,243,1,0,0,86,97,108,105,100,97,116,101,32,97,
-+ 32,104,97,115,104,45,98,97,115,101,100,32,112,121,99,32,
-+ 98,121,32,99,104,101,99,107,105,110,103,32,116,104,101,32,
-+ 114,101,97,108,32,115,111,117,114,99,101,32,104,97,115,104,
-+ 32,97,103,97,105,110,115,116,32,116,104,101,32,111,110,101,
-+ 32,105,110,10,32,32,32,32,116,104,101,32,112,121,99,32,
-+ 104,101,97,100,101,114,46,10,10,32,32,32,32,42,100,97,
-+ 116,97,42,32,105,115,32,116,104,101,32,99,111,110,116,101,
-+ 110,116,115,32,111,102,32,116,104,101,32,112,121,99,32,102,
-+ 105,108,101,46,32,40,79,110,108,121,32,116,104,101,32,102,
-+ 105,114,115,116,32,49,54,32,98,121,116,101,115,32,97,114,
-+ 101,10,32,32,32,32,114,101,113,117,105,114,101,100,46,41,
-+ 10,10,32,32,32,32,42,115,111,117,114,99,101,95,104,97,
-+ 115,104,42,32,105,115,32,116,104,101,32,105,109,112,111,114,
-+ 116,108,105,98,46,117,116,105,108,46,115,111,117,114,99,101,
-+ 95,104,97,115,104,40,41,32,111,102,32,116,104,101,32,115,
-+ 111,117,114,99,101,32,102,105,108,101,46,10,10,32,32,32,
-+ 32,42,110,97,109,101,42,32,105,115,32,116,104,101,32,110,
-+ 97,109,101,32,111,102,32,116,104,101,32,109,111,100,117,108,
-+ 101,32,98,101,105,110,103,32,105,109,112,111,114,116,101,100,
-+ 46,32,73,116,32,105,115,32,117,115,101,100,32,102,111,114,
-+ 32,108,111,103,103,105,110,103,46,10,10,32,32,32,32,42,
-+ 101,120,99,95,100,101,116,97,105,108,115,42,32,105,115,32,
-+ 97,32,100,105,99,116,105,111,110,97,114,121,32,112,97,115,
-+ 115,101,100,32,116,111,32,73,109,112,111,114,116,69,114,114,
-+ 111,114,32,105,102,32,105,116,32,114,97,105,115,101,100,32,
-+ 102,111,114,10,32,32,32,32,105,109,112,114,111,118,101,100,
-+ 32,100,101,98,117,103,103,105,110,103,46,10,10,32,32,32,
-+ 32,65,110,32,73,109,112,111,114,116,69,114,114,111,114,32,
-+ 105,115,32,114,97,105,115,101,100,32,105,102,32,116,104,101,
-+ 32,98,121,116,101,99,111,100,101,32,105,115,32,115,116,97,
-+ 108,101,46,10,10,32,32,32,32,114,173,0,0,0,114,172,
-+ 0,0,0,122,46,104,97,115,104,32,105,110,32,98,121,116,
-+ 101,99,111,100,101,32,100,111,101,115,110,39,116,32,109,97,
-+ 116,99,104,32,104,97,115,104,32,111,102,32,115,111,117,114,
-+ 99,101,32,78,41,1,114,145,0,0,0,41,4,114,44,0,
-+ 0,0,218,11,115,111,117,114,99,101,95,104,97,115,104,114,
-+ 144,0,0,0,114,178,0,0,0,114,7,0,0,0,114,7,
-+ 0,0,0,114,8,0,0,0,218,18,95,118,97,108,105,100,
-+ 97,116,101,95,104,97,115,104,95,112,121,99,134,2,0,0,
-+ 115,14,0,0,0,16,17,2,1,8,1,4,255,2,2,6,
-+ 254,4,255,114,185,0,0,0,99,4,0,0,0,0,0,0,
-+ 0,0,0,0,0,5,0,0,0,5,0,0,0,67,0,0,
-+ 0,115,76,0,0,0,116,0,160,1,124,0,161,1,125,4,
-+ 116,2,124,4,116,3,131,2,114,28,116,4,160,5,100,1,
-+ 124,2,161,2,1,0,124,3,100,2,117,1,114,26,116,6,
-+ 160,7,124,4,124,3,161,2,1,0,124,4,83,0,116,8,
-+ 100,3,160,9,124,2,161,1,124,1,124,2,100,4,141,3,
-+ 130,1,41,5,122,35,67,111,109,112,105,108,101,32,98,121,
-+ 116,101,99,111,100,101,32,97,115,32,102,111,117,110,100,32,
-+ 105,110,32,97,32,112,121,99,46,122,21,99,111,100,101,32,
-+ 111,98,106,101,99,116,32,102,114,111,109,32,123,33,114,125,
-+ 78,122,23,78,111,110,45,99,111,100,101,32,111,98,106,101,
-+ 99,116,32,105,110,32,123,33,114,125,169,2,114,144,0,0,
-+ 0,114,68,0,0,0,41,10,218,7,109,97,114,115,104,97,
-+ 108,90,5,108,111,97,100,115,218,10,105,115,105,110,115,116,
-+ 97,110,99,101,218,10,95,99,111,100,101,95,116,121,112,101,
-+ 114,162,0,0,0,114,176,0,0,0,218,4,95,105,109,112,
-+ 90,16,95,102,105,120,95,99,111,95,102,105,108,101,110,97,
-+ 109,101,114,145,0,0,0,114,92,0,0,0,41,5,114,44,
-+ 0,0,0,114,144,0,0,0,114,135,0,0,0,114,137,0,
-+ 0,0,218,4,99,111,100,101,114,7,0,0,0,114,7,0,
-+ 0,0,114,8,0,0,0,218,17,95,99,111,109,112,105,108,
-+ 101,95,98,121,116,101,99,111,100,101,158,2,0,0,115,18,
-+ 0,0,0,10,2,10,1,12,1,8,1,12,1,4,1,10,
-+ 2,4,1,6,255,114,192,0,0,0,99,3,0,0,0,0,
-+ 0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,67,
-+ 0,0,0,115,70,0,0,0,116,0,116,1,131,1,125,3,
-+ 124,3,160,2,116,3,100,1,131,1,161,1,1,0,124,3,
-+ 160,2,116,3,124,1,131,1,161,1,1,0,124,3,160,2,
-+ 116,3,124,2,131,1,161,1,1,0,124,3,160,2,116,4,
-+ 160,5,124,0,161,1,161,1,1,0,124,3,83,0,41,2,
-+ 122,43,80,114,111,100,117,99,101,32,116,104,101,32,100,97,
-+ 116,97,32,102,111,114,32,97,32,116,105,109,101,115,116,97,
-+ 109,112,45,98,97,115,101,100,32,112,121,99,46,114,0,0,
-+ 0,0,41,6,218,9,98,121,116,101,97,114,114,97,121,114,
-+ 175,0,0,0,218,6,101,120,116,101,110,100,114,39,0,0,
-+ 0,114,187,0,0,0,218,5,100,117,109,112,115,41,4,114,
-+ 191,0,0,0,218,5,109,116,105,109,101,114,182,0,0,0,
-+ 114,44,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
-+ 8,0,0,0,218,22,95,99,111,100,101,95,116,111,95,116,
-+ 105,109,101,115,116,97,109,112,95,112,121,99,171,2,0,0,
-+ 115,12,0,0,0,8,2,14,1,14,1,14,1,16,1,4,
-+ 1,114,197,0,0,0,84,99,3,0,0,0,0,0,0,0,
-+ 0,0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,
-+ 115,80,0,0,0,116,0,116,1,131,1,125,3,100,1,124,
-+ 2,100,1,62,0,66,0,125,4,124,3,160,2,116,3,124,
-+ 4,131,1,161,1,1,0,116,4,124,1,131,1,100,2,107,
-+ 2,115,25,74,0,130,1,124,3,160,2,124,1,161,1,1,
-+ 0,124,3,160,2,116,5,160,6,124,0,161,1,161,1,1,
-+ 0,124,3,83,0,41,3,122,38,80,114,111,100,117,99,101,
-+ 32,116,104,101,32,100,97,116,97,32,102,111,114,32,97,32,
-+ 104,97,115,104,45,98,97,115,101,100,32,112,121,99,46,114,
-+ 3,0,0,0,114,173,0,0,0,41,7,114,193,0,0,0,
-+ 114,175,0,0,0,114,194,0,0,0,114,39,0,0,0,114,
-+ 4,0,0,0,114,187,0,0,0,114,195,0,0,0,41,5,
-+ 114,191,0,0,0,114,184,0,0,0,90,7,99,104,101,99,
-+ 107,101,100,114,44,0,0,0,114,19,0,0,0,114,7,0,
-+ 0,0,114,7,0,0,0,114,8,0,0,0,218,17,95,99,
-+ 111,100,101,95,116,111,95,104,97,115,104,95,112,121,99,181,
-+ 2,0,0,115,14,0,0,0,8,2,12,1,14,1,16,1,
-+ 10,1,16,1,4,1,114,198,0,0,0,99,1,0,0,0,
-+ 0,0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,
-+ 67,0,0,0,115,62,0,0,0,100,1,100,2,108,0,125,
-+ 1,116,1,160,2,124,0,161,1,106,3,125,2,124,1,160,
-+ 4,124,2,161,1,125,3,116,1,160,5,100,2,100,3,161,
-+ 2,125,4,124,4,160,6,124,0,160,6,124,3,100,1,25,
-+ 0,161,1,161,1,83,0,41,4,122,121,68,101,99,111,100,
-+ 101,32,98,121,116,101,115,32,114,101,112,114,101,115,101,110,
-+ 116,105,110,103,32,115,111,117,114,99,101,32,99,111,100,101,
-+ 32,97,110,100,32,114,101,116,117,114,110,32,116,104,101,32,
-+ 115,116,114,105,110,103,46,10,10,32,32,32,32,85,110,105,
-+ 118,101,114,115,97,108,32,110,101,119,108,105,110,101,32,115,
-+ 117,112,112,111,114,116,32,105,115,32,117,115,101,100,32,105,
-+ 110,32,116,104,101,32,100,101,99,111,100,105,110,103,46,10,
-+ 32,32,32,32,114,0,0,0,0,78,84,41,7,218,8,116,
-+ 111,107,101,110,105,122,101,114,94,0,0,0,90,7,66,121,
-+ 116,101,115,73,79,90,8,114,101,97,100,108,105,110,101,90,
-+ 15,100,101,116,101,99,116,95,101,110,99,111,100,105,110,103,
-+ 90,25,73,110,99,114,101,109,101,110,116,97,108,78,101,119,
-+ 108,105,110,101,68,101,99,111,100,101,114,218,6,100,101,99,
-+ 111,100,101,41,5,218,12,115,111,117,114,99,101,95,98,121,
-+ 116,101,115,114,199,0,0,0,90,21,115,111,117,114,99,101,
-+ 95,98,121,116,101,115,95,114,101,97,100,108,105,110,101,218,
-+ 8,101,110,99,111,100,105,110,103,90,15,110,101,119,108,105,
-+ 110,101,95,100,101,99,111,100,101,114,114,7,0,0,0,114,
-+ 7,0,0,0,114,8,0,0,0,218,13,100,101,99,111,100,
-+ 101,95,115,111,117,114,99,101,192,2,0,0,115,10,0,0,
-+ 0,8,5,12,1,10,1,12,1,20,1,114,203,0,0,0,
-+ 169,2,114,167,0,0,0,218,26,115,117,98,109,111,100,117,
-+ 108,101,95,115,101,97,114,99,104,95,108,111,99,97,116,105,
-+ 111,110,115,99,2,0,0,0,0,0,0,0,2,0,0,0,
-+ 9,0,0,0,8,0,0,0,67,0,0,0,115,54,1,0,
-+ 0,124,1,100,1,117,0,114,29,100,2,125,1,116,0,124,
-+ 2,100,3,131,2,114,28,122,7,124,2,160,1,124,0,161,
-+ 1,125,1,87,0,110,38,4,0,116,2,121,27,1,0,1,
-+ 0,1,0,89,0,110,30,119,0,110,28,116,3,160,4,124,
-+ 1,161,1,125,1,116,5,124,1,131,1,115,57,122,9,116,
-+ 6,116,3,160,7,161,0,124,1,131,2,125,1,87,0,110,
-+ 9,4,0,116,8,121,56,1,0,1,0,1,0,89,0,110,
-+ 1,119,0,116,9,106,10,124,0,124,2,124,1,100,4,141,
-+ 3,125,4,100,5,124,4,95,11,124,2,100,1,117,0,114,
-+ 99,116,12,131,0,68,0,93,21,92,2,125,5,125,6,124,
-+ 1,160,13,116,14,124,6,131,1,161,1,114,96,124,5,124,
-+ 0,124,1,131,2,125,2,124,2,124,4,95,15,1,0,110,
-+ 3,113,75,100,1,83,0,124,3,116,16,117,0,114,131,116,
-+ 0,124,2,100,6,131,2,114,130,122,7,124,2,160,17,124,
-+ 0,161,1,125,7,87,0,110,9,4,0,116,2,121,124,1,
-+ 0,1,0,1,0,89,0,110,10,119,0,124,7,114,130,103,
-+ 0,124,4,95,18,110,3,124,3,124,4,95,18,124,4,106,
-+ 18,103,0,107,2,114,153,124,1,114,153,116,19,124,1,131,
-+ 1,100,7,25,0,125,8,124,4,106,18,160,20,124,8,161,
-+ 1,1,0,124,4,83,0,41,8,97,61,1,0,0,82,101,
-+ 116,117,114,110,32,97,32,109,111,100,117,108,101,32,115,112,
-+ 101,99,32,98,97,115,101,100,32,111,110,32,97,32,102,105,
-+ 108,101,32,108,111,99,97,116,105,111,110,46,10,10,32,32,
-+ 32,32,84,111,32,105,110,100,105,99,97,116,101,32,116,104,
-+ 97,116,32,116,104,101,32,109,111,100,117,108,101,32,105,115,
-+ 32,97,32,112,97,99,107,97,103,101,44,32,115,101,116,10,
-+ 32,32,32,32,115,117,98,109,111,100,117,108,101,95,115,101,
-+ 97,114,99,104,95,108,111,99,97,116,105,111,110,115,32,116,
-+ 111,32,97,32,108,105,115,116,32,111,102,32,100,105,114,101,
-+ 99,116,111,114,121,32,112,97,116,104,115,46,32,32,65,110,
-+ 10,32,32,32,32,101,109,112,116,121,32,108,105,115,116,32,
-+ 105,115,32,115,117,102,102,105,99,105,101,110,116,44,32,116,
-+ 104,111,117,103,104,32,105,116,115,32,110,111,116,32,111,116,
-+ 104,101,114,119,105,115,101,32,117,115,101,102,117,108,32,116,
-+ 111,32,116,104,101,10,32,32,32,32,105,109,112,111,114,116,
-+ 32,115,121,115,116,101,109,46,10,10,32,32,32,32,84,104,
-+ 101,32,108,111,97,100,101,114,32,109,117,115,116,32,116,97,
-+ 107,101,32,97,32,115,112,101,99,32,97,115,32,105,116,115,
-+ 32,111,110,108,121,32,95,95,105,110,105,116,95,95,40,41,
-+ 32,97,114,103,46,10,10,32,32,32,32,78,122,9,60,117,
-+ 110,107,110,111,119,110,62,218,12,103,101,116,95,102,105,108,
-+ 101,110,97,109,101,169,1,218,6,111,114,105,103,105,110,84,
-+ 218,10,105,115,95,112,97,99,107,97,103,101,114,0,0,0,
-+ 0,41,21,114,156,0,0,0,114,206,0,0,0,114,145,0,
-+ 0,0,114,21,0,0,0,114,106,0,0,0,114,89,0,0,
-+ 0,114,70,0,0,0,114,85,0,0,0,114,79,0,0,0,
-+ 114,162,0,0,0,218,10,77,111,100,117,108,101,83,112,101,
-+ 99,90,13,95,115,101,116,95,102,105,108,101,97,116,116,114,
-+ 218,27,95,103,101,116,95,115,117,112,112,111,114,116,101,100,
-+ 95,102,105,108,101,95,108,111,97,100,101,114,115,114,61,0,
-+ 0,0,114,139,0,0,0,114,167,0,0,0,218,9,95,80,
-+ 79,80,85,76,65,84,69,114,209,0,0,0,114,205,0,0,
-+ 0,114,77,0,0,0,114,64,0,0,0,41,9,114,144,0,
-+ 0,0,90,8,108,111,99,97,116,105,111,110,114,167,0,0,
-+ 0,114,205,0,0,0,218,4,115,112,101,99,218,12,108,111,
-+ 97,100,101,114,95,99,108,97,115,115,218,8,115,117,102,102,
-+ 105,120,101,115,114,209,0,0,0,90,7,100,105,114,110,97,
-+ 109,101,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-+ 0,218,23,115,112,101,99,95,102,114,111,109,95,102,105,108,
-+ 101,95,108,111,99,97,116,105,111,110,209,2,0,0,115,84,
-+ 0,0,0,8,12,4,4,10,1,2,2,14,1,12,1,4,
-+ 1,2,255,2,252,10,7,8,1,2,1,18,1,12,1,4,
-+ 1,2,255,16,9,6,1,8,3,14,1,14,1,10,1,6,
-+ 1,4,1,2,253,4,5,8,3,10,2,2,1,14,1,12,
-+ 1,4,1,2,255,4,3,6,1,2,128,6,2,10,1,4,
-+ 1,12,1,12,1,4,2,114,216,0,0,0,99,0,0,0,
-+ 0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
-+ 0,64,0,0,0,115,88,0,0,0,101,0,90,1,100,0,
-+ 90,2,100,1,90,3,100,2,90,4,100,3,90,5,101,6,
-+ 111,15,100,4,101,7,118,0,90,8,101,9,100,5,100,6,
-+ 132,0,131,1,90,10,101,11,100,7,100,8,132,0,131,1,
-+ 90,12,101,11,100,14,100,10,100,11,132,1,131,1,90,13,
-+ 101,11,100,15,100,12,100,13,132,1,131,1,90,14,100,9,
-+ 83,0,41,16,218,21,87,105,110,100,111,119,115,82,101,103,
-+ 105,115,116,114,121,70,105,110,100,101,114,122,62,77,101,116,
-+ 97,32,112,97,116,104,32,102,105,110,100,101,114,32,102,111,
-+ 114,32,109,111,100,117,108,101,115,32,100,101,99,108,97,114,
-+ 101,100,32,105,110,32,116,104,101,32,87,105,110,100,111,119,
-+ 115,32,114,101,103,105,115,116,114,121,46,122,59,83,111,102,
-+ 116,119,97,114,101,92,80,121,116,104,111,110,92,80,121,116,
-+ 104,111,110,67,111,114,101,92,123,115,121,115,95,118,101,114,
-+ 115,105,111,110,125,92,77,111,100,117,108,101,115,92,123,102,
-+ 117,108,108,110,97,109,101,125,122,65,83,111,102,116,119,97,
-+ 114,101,92,80,121,116,104,111,110,92,80,121,116,104,111,110,
-+ 67,111,114,101,92,123,115,121,115,95,118,101,114,115,105,111,
-+ 110,125,92,77,111,100,117,108,101,115,92,123,102,117,108,108,
-+ 110,97,109,101,125,92,68,101,98,117,103,122,6,95,100,46,
-+ 112,121,100,99,1,0,0,0,0,0,0,0,0,0,0,0,
-+ 1,0,0,0,8,0,0,0,67,0,0,0,115,50,0,0,
-+ 0,122,8,116,0,160,1,116,0,106,2,124,0,161,2,87,
-+ 0,83,0,4,0,116,3,121,24,1,0,1,0,1,0,116,
-+ 0,160,1,116,0,106,4,124,0,161,2,6,0,89,0,83,
-+ 0,119,0,114,72,0,0,0,41,5,218,6,119,105,110,114,
-+ 101,103,90,7,79,112,101,110,75,101,121,90,17,72,75,69,
-+ 89,95,67,85,82,82,69,78,84,95,85,83,69,82,114,79,
-+ 0,0,0,90,18,72,75,69,89,95,76,79,67,65,76,95,
-+ 77,65,67,72,73,78,69,114,22,0,0,0,114,7,0,0,
-+ 0,114,7,0,0,0,114,8,0,0,0,218,14,95,111,112,
-+ 101,110,95,114,101,103,105,115,116,114,121,38,3,0,0,115,
-+ 10,0,0,0,2,2,16,1,12,1,18,1,2,255,122,36,
-+ 87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,
-+ 105,110,100,101,114,46,95,111,112,101,110,95,114,101,103,105,
-+ 115,116,114,121,99,2,0,0,0,0,0,0,0,0,0,0,
-+ 0,6,0,0,0,8,0,0,0,67,0,0,0,115,134,0,
-+ 0,0,124,0,106,0,114,7,124,0,106,1,125,2,110,3,
-+ 124,0,106,2,125,2,124,2,106,3,124,1,100,1,116,4,
-+ 106,5,100,0,100,2,133,2,25,0,22,0,100,3,141,2,
-+ 125,3,122,32,124,0,160,6,124,3,161,1,143,16,125,4,
-+ 116,7,160,8,124,4,100,4,161,2,125,5,87,0,100,0,
-+ 4,0,4,0,131,3,1,0,87,0,124,5,83,0,49,0,
-+ 115,49,119,1,1,0,1,0,1,0,89,0,1,0,87,0,
-+ 124,5,83,0,4,0,116,9,121,66,1,0,1,0,1,0,
-+ 89,0,100,0,83,0,119,0,41,5,78,122,5,37,100,46,
-+ 37,100,114,47,0,0,0,41,2,114,166,0,0,0,90,11,
-+ 115,121,115,95,118,101,114,115,105,111,110,114,10,0,0,0,
-+ 41,10,218,11,68,69,66,85,71,95,66,85,73,76,68,218,
-+ 18,82,69,71,73,83,84,82,89,95,75,69,89,95,68,69,
-+ 66,85,71,218,12,82,69,71,73,83,84,82,89,95,75,69,
-+ 89,114,92,0,0,0,114,18,0,0,0,218,12,118,101,114,
-+ 115,105,111,110,95,105,110,102,111,114,219,0,0,0,114,218,
-+ 0,0,0,90,10,81,117,101,114,121,86,97,108,117,101,114,
-+ 79,0,0,0,41,6,218,3,99,108,115,114,166,0,0,0,
-+ 90,12,114,101,103,105,115,116,114,121,95,107,101,121,114,23,
-+ 0,0,0,90,4,104,107,101,121,218,8,102,105,108,101,112,
-+ 97,116,104,114,7,0,0,0,114,7,0,0,0,114,8,0,
-+ 0,0,218,16,95,115,101,97,114,99,104,95,114,101,103,105,
-+ 115,116,114,121,45,3,0,0,115,32,0,0,0,6,2,8,
-+ 1,6,2,6,1,16,1,6,255,2,2,12,1,14,1,12,
-+ 255,4,4,18,252,4,4,12,254,6,1,2,255,122,38,87,
-+ 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,
-+ 110,100,101,114,46,95,115,101,97,114,99,104,95,114,101,103,
-+ 105,115,116,114,121,78,99,4,0,0,0,0,0,0,0,0,
-+ 0,0,0,8,0,0,0,8,0,0,0,67,0,0,0,115,
-+ 120,0,0,0,124,0,160,0,124,1,161,1,125,4,124,4,
-+ 100,0,117,0,114,11,100,0,83,0,122,6,116,1,124,4,
-+ 131,1,1,0,87,0,110,10,4,0,116,2,121,27,1,0,
-+ 1,0,1,0,89,0,100,0,83,0,119,0,116,3,131,0,
-+ 68,0,93,26,92,2,125,5,125,6,124,4,160,4,116,5,
-+ 124,6,131,1,161,1,114,57,116,6,106,7,124,1,124,5,
-+ 124,1,124,4,131,2,124,4,100,1,141,3,125,7,124,7,
-+ 2,0,1,0,83,0,113,31,100,0,83,0,41,2,78,114,
-+ 207,0,0,0,41,8,114,226,0,0,0,114,78,0,0,0,
-+ 114,79,0,0,0,114,211,0,0,0,114,61,0,0,0,114,
-+ 139,0,0,0,114,162,0,0,0,218,16,115,112,101,99,95,
-+ 102,114,111,109,95,108,111,97,100,101,114,41,8,114,224,0,
-+ 0,0,114,166,0,0,0,114,68,0,0,0,218,6,116,97,
-+ 114,103,101,116,114,225,0,0,0,114,167,0,0,0,114,215,
-+ 0,0,0,114,213,0,0,0,114,7,0,0,0,114,7,0,
-+ 0,0,114,8,0,0,0,218,9,102,105,110,100,95,115,112,
-+ 101,99,60,3,0,0,115,34,0,0,0,10,2,8,1,4,
-+ 1,2,1,12,1,12,1,6,1,2,255,14,2,14,1,6,
-+ 1,8,1,2,1,6,254,8,3,2,252,4,255,122,31,87,
-+ 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,
-+ 110,100,101,114,46,102,105,110,100,95,115,112,101,99,99,3,
-+ 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,
-+ 0,0,0,67,0,0,0,115,42,0,0,0,116,0,160,1,
-+ 100,1,116,2,161,2,1,0,124,0,160,3,124,1,124,2,
-+ 161,2,125,3,124,3,100,2,117,1,114,19,124,3,106,4,
-+ 83,0,100,2,83,0,41,3,122,106,70,105,110,100,32,109,
-+ 111,100,117,108,101,32,110,97,109,101,100,32,105,110,32,116,
-+ 104,101,32,114,101,103,105,115,116,114,121,46,10,10,32,32,
-+ 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,
-+ 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,
-+ 32,32,85,115,101,32,102,105,110,100,95,115,112,101,99,40,
-+ 41,32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,
-+ 32,32,32,32,122,112,87,105,110,100,111,119,115,82,101,103,
-+ 105,115,116,114,121,70,105,110,100,101,114,46,102,105,110,100,
-+ 95,109,111,100,117,108,101,40,41,32,105,115,32,100,101,112,
-+ 114,101,99,97,116,101,100,32,97,110,100,32,115,108,97,116,
-+ 101,100,32,102,111,114,32,114,101,109,111,118,97,108,32,105,
-+ 110,32,80,121,116,104,111,110,32,51,46,49,50,59,32,117,
-+ 115,101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,
-+ 110,115,116,101,97,100,78,169,5,114,102,0,0,0,114,103,
-+ 0,0,0,114,104,0,0,0,114,229,0,0,0,114,167,0,
-+ 0,0,169,4,114,224,0,0,0,114,166,0,0,0,114,68,
-+ 0,0,0,114,213,0,0,0,114,7,0,0,0,114,7,0,
-+ 0,0,114,8,0,0,0,218,11,102,105,110,100,95,109,111,
-+ 100,117,108,101,76,3,0,0,115,14,0,0,0,6,7,2,
-+ 2,4,254,12,3,8,1,6,1,4,2,122,33,87,105,110,
-+ 100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,
-+ 101,114,46,102,105,110,100,95,109,111,100,117,108,101,169,2,
-+ 78,78,114,72,0,0,0,41,15,114,153,0,0,0,114,152,
-+ 0,0,0,114,154,0,0,0,114,155,0,0,0,114,222,0,
-+ 0,0,114,221,0,0,0,218,11,95,77,83,95,87,73,78,
-+ 68,79,87,83,218,18,69,88,84,69,78,83,73,79,78,95,
-+ 83,85,70,70,73,88,69,83,114,220,0,0,0,218,12,115,
-+ 116,97,116,105,99,109,101,116,104,111,100,114,219,0,0,0,
-+ 218,11,99,108,97,115,115,109,101,116,104,111,100,114,226,0,
-+ 0,0,114,229,0,0,0,114,232,0,0,0,114,7,0,0,
- 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-- 218,22,95,99,111,100,101,95,116,111,95,116,105,109,101,115,
-- 116,97,109,112,95,112,121,99,171,2,0,0,115,12,0,0,
-- 0,8,2,14,1,14,1,14,1,16,1,4,1,114,194,0,
-- 0,0,84,99,3,0,0,0,0,0,0,0,0,0,0,0,
-- 5,0,0,0,5,0,0,0,67,0,0,0,115,80,0,0,
-- 0,116,0,116,1,131,1,125,3,100,1,124,2,100,1,62,
-- 0,66,0,125,4,124,3,160,2,116,3,124,4,131,1,161,
-- 1,1,0,116,4,124,1,131,1,100,2,107,2,115,25,74,
-- 0,130,1,124,3,160,2,124,1,161,1,1,0,124,3,160,
-- 2,116,5,160,6,124,0,161,1,161,1,1,0,124,3,83,
-- 0,41,3,122,38,80,114,111,100,117,99,101,32,116,104,101,
-- 32,100,97,116,97,32,102,111,114,32,97,32,104,97,115,104,
-- 45,98,97,115,101,100,32,112,121,99,46,114,3,0,0,0,
-- 114,170,0,0,0,41,7,114,190,0,0,0,114,172,0,0,
-- 0,114,191,0,0,0,114,36,0,0,0,114,4,0,0,0,
-- 114,184,0,0,0,114,192,0,0,0,41,5,114,188,0,0,
-- 0,114,181,0,0,0,90,7,99,104,101,99,107,101,100,114,
-- 41,0,0,0,114,16,0,0,0,114,7,0,0,0,114,7,
-- 0,0,0,114,8,0,0,0,218,17,95,99,111,100,101,95,
-- 116,111,95,104,97,115,104,95,112,121,99,181,2,0,0,115,
-- 14,0,0,0,8,2,12,1,14,1,16,1,10,1,16,1,
-- 4,1,114,195,0,0,0,99,1,0,0,0,0,0,0,0,
-- 0,0,0,0,5,0,0,0,6,0,0,0,67,0,0,0,
-- 115,62,0,0,0,100,1,100,2,108,0,125,1,116,1,160,
-- 2,124,0,161,1,106,3,125,2,124,1,160,4,124,2,161,
-- 1,125,3,116,1,160,5,100,2,100,3,161,2,125,4,124,
-- 4,160,6,124,0,160,6,124,3,100,1,25,0,161,1,161,
-- 1,83,0,41,4,122,121,68,101,99,111,100,101,32,98,121,
-- 116,101,115,32,114,101,112,114,101,115,101,110,116,105,110,103,
-- 32,115,111,117,114,99,101,32,99,111,100,101,32,97,110,100,
-- 32,114,101,116,117,114,110,32,116,104,101,32,115,116,114,105,
-- 110,103,46,10,10,32,32,32,32,85,110,105,118,101,114,115,
-- 97,108,32,110,101,119,108,105,110,101,32,115,117,112,112,111,
-- 114,116,32,105,115,32,117,115,101,100,32,105,110,32,116,104,
-- 101,32,100,101,99,111,100,105,110,103,46,10,32,32,32,32,
-- 114,0,0,0,0,78,84,41,7,218,8,116,111,107,101,110,
-- 105,122,101,114,91,0,0,0,90,7,66,121,116,101,115,73,
-- 79,90,8,114,101,97,100,108,105,110,101,90,15,100,101,116,
-- 101,99,116,95,101,110,99,111,100,105,110,103,90,25,73,110,
-- 99,114,101,109,101,110,116,97,108,78,101,119,108,105,110,101,
-- 68,101,99,111,100,101,114,218,6,100,101,99,111,100,101,41,
-- 5,218,12,115,111,117,114,99,101,95,98,121,116,101,115,114,
-- 196,0,0,0,90,21,115,111,117,114,99,101,95,98,121,116,
-- 101,115,95,114,101,97,100,108,105,110,101,218,8,101,110,99,
-- 111,100,105,110,103,90,15,110,101,119,108,105,110,101,95,100,
-- 101,99,111,100,101,114,114,7,0,0,0,114,7,0,0,0,
-- 114,8,0,0,0,218,13,100,101,99,111,100,101,95,115,111,
-- 117,114,99,101,192,2,0,0,115,10,0,0,0,8,5,12,
-- 1,10,1,12,1,20,1,114,200,0,0,0,169,2,114,164,
-- 0,0,0,218,26,115,117,98,109,111,100,117,108,101,95,115,
-- 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,99,
-- 2,0,0,0,0,0,0,0,2,0,0,0,9,0,0,0,
-- 8,0,0,0,67,0,0,0,115,54,1,0,0,124,1,100,
-- 1,117,0,114,29,100,2,125,1,116,0,124,2,100,3,131,
-- 2,114,28,122,7,124,2,160,1,124,0,161,1,125,1,87,
-- 0,110,38,4,0,116,2,121,27,1,0,1,0,1,0,89,
-- 0,110,30,119,0,110,28,116,3,160,4,124,1,161,1,125,
-- 1,116,5,124,1,131,1,115,57,122,9,116,6,116,3,160,
-- 7,161,0,124,1,131,2,125,1,87,0,110,9,4,0,116,
-- 8,121,56,1,0,1,0,1,0,89,0,110,1,119,0,116,
-- 9,106,10,124,0,124,2,124,1,100,4,141,3,125,4,100,
-- 5,124,4,95,11,124,2,100,1,117,0,114,99,116,12,131,
-- 0,68,0,93,21,92,2,125,5,125,6,124,1,160,13,116,
-- 14,124,6,131,1,161,1,114,96,124,5,124,0,124,1,131,
-- 2,125,2,124,2,124,4,95,15,1,0,110,3,113,75,100,
-- 1,83,0,124,3,116,16,117,0,114,131,116,0,124,2,100,
-- 6,131,2,114,130,122,7,124,2,160,17,124,0,161,1,125,
-- 7,87,0,110,9,4,0,116,2,121,124,1,0,1,0,1,
-- 0,89,0,110,10,119,0,124,7,114,130,103,0,124,4,95,
-- 18,110,3,124,3,124,4,95,18,124,4,106,18,103,0,107,
-- 2,114,153,124,1,114,153,116,19,124,1,131,1,100,7,25,
-- 0,125,8,124,4,106,18,160,20,124,8,161,1,1,0,124,
-- 4,83,0,41,8,97,61,1,0,0,82,101,116,117,114,110,
-- 32,97,32,109,111,100,117,108,101,32,115,112,101,99,32,98,
-- 97,115,101,100,32,111,110,32,97,32,102,105,108,101,32,108,
-- 111,99,97,116,105,111,110,46,10,10,32,32,32,32,84,111,
-- 32,105,110,100,105,99,97,116,101,32,116,104,97,116,32,116,
-- 104,101,32,109,111,100,117,108,101,32,105,115,32,97,32,112,
-- 97,99,107,97,103,101,44,32,115,101,116,10,32,32,32,32,
-- 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104,
-- 95,108,111,99,97,116,105,111,110,115,32,116,111,32,97,32,
-- 108,105,115,116,32,111,102,32,100,105,114,101,99,116,111,114,
-- 121,32,112,97,116,104,115,46,32,32,65,110,10,32,32,32,
-- 32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,115,
-- 117,102,102,105,99,105,101,110,116,44,32,116,104,111,117,103,
-- 104,32,105,116,115,32,110,111,116,32,111,116,104,101,114,119,
-- 105,115,101,32,117,115,101,102,117,108,32,116,111,32,116,104,
-- 101,10,32,32,32,32,105,109,112,111,114,116,32,115,121,115,
-- 116,101,109,46,10,10,32,32,32,32,84,104,101,32,108,111,
-- 97,100,101,114,32,109,117,115,116,32,116,97,107,101,32,97,
-- 32,115,112,101,99,32,97,115,32,105,116,115,32,111,110,108,
-- 121,32,95,95,105,110,105,116,95,95,40,41,32,97,114,103,
-- 46,10,10,32,32,32,32,78,122,9,60,117,110,107,110,111,
-- 119,110,62,218,12,103,101,116,95,102,105,108,101,110,97,109,
-- 101,169,1,218,6,111,114,105,103,105,110,84,218,10,105,115,
-- 95,112,97,99,107,97,103,101,114,0,0,0,0,41,21,114,
-- 153,0,0,0,114,203,0,0,0,114,142,0,0,0,114,18,
-- 0,0,0,114,103,0,0,0,114,86,0,0,0,114,67,0,
-- 0,0,114,82,0,0,0,114,76,0,0,0,114,159,0,0,
-- 0,218,10,77,111,100,117,108,101,83,112,101,99,90,13,95,
-- 115,101,116,95,102,105,108,101,97,116,116,114,218,27,95,103,
-- 101,116,95,115,117,112,112,111,114,116,101,100,95,102,105,108,
-- 101,95,108,111,97,100,101,114,115,114,58,0,0,0,114,136,
-- 0,0,0,114,164,0,0,0,218,9,95,80,79,80,85,76,
-- 65,84,69,114,206,0,0,0,114,202,0,0,0,114,74,0,
-- 0,0,114,61,0,0,0,41,9,114,141,0,0,0,90,8,
-- 108,111,99,97,116,105,111,110,114,164,0,0,0,114,202,0,
-- 0,0,218,4,115,112,101,99,218,12,108,111,97,100,101,114,
-- 95,99,108,97,115,115,218,8,115,117,102,102,105,120,101,115,
-- 114,206,0,0,0,90,7,100,105,114,110,97,109,101,114,7,
-- 0,0,0,114,7,0,0,0,114,8,0,0,0,218,23,115,
-- 112,101,99,95,102,114,111,109,95,102,105,108,101,95,108,111,
-- 99,97,116,105,111,110,209,2,0,0,115,84,0,0,0,8,
-- 12,4,4,10,1,2,2,14,1,12,1,4,1,2,255,2,
-- 252,10,7,8,1,2,1,18,1,12,1,4,1,2,255,16,
-- 9,6,1,8,3,14,1,14,1,10,1,6,1,4,1,2,
-- 253,4,5,8,3,10,2,2,1,14,1,12,1,4,1,2,
-- 255,4,3,6,1,2,128,6,2,10,1,4,1,12,1,12,
-- 1,4,2,114,213,0,0,0,99,0,0,0,0,0,0,0,
-- 0,0,0,0,0,0,0,0,0,4,0,0,0,64,0,0,
-- 0,115,88,0,0,0,101,0,90,1,100,0,90,2,100,1,
-- 90,3,100,2,90,4,100,3,90,5,101,6,111,15,100,4,
-- 101,7,118,0,90,8,101,9,100,5,100,6,132,0,131,1,
-- 90,10,101,11,100,7,100,8,132,0,131,1,90,12,101,11,
-- 100,14,100,10,100,11,132,1,131,1,90,13,101,11,100,15,
-- 100,12,100,13,132,1,131,1,90,14,100,9,83,0,41,16,
-- 218,21,87,105,110,100,111,119,115,82,101,103,105,115,116,114,
-- 121,70,105,110,100,101,114,122,62,77,101,116,97,32,112,97,
-- 116,104,32,102,105,110,100,101,114,32,102,111,114,32,109,111,
-- 100,117,108,101,115,32,100,101,99,108,97,114,101,100,32,105,
-- 110,32,116,104,101,32,87,105,110,100,111,119,115,32,114,101,
-- 103,105,115,116,114,121,46,122,59,83,111,102,116,119,97,114,
-- 101,92,80,121,116,104,111,110,92,80,121,116,104,111,110,67,
-- 111,114,101,92,123,115,121,115,95,118,101,114,115,105,111,110,
-- 125,92,77,111,100,117,108,101,115,92,123,102,117,108,108,110,
-- 97,109,101,125,122,65,83,111,102,116,119,97,114,101,92,80,
-- 121,116,104,111,110,92,80,121,116,104,111,110,67,111,114,101,
-- 92,123,115,121,115,95,118,101,114,115,105,111,110,125,92,77,
-- 111,100,117,108,101,115,92,123,102,117,108,108,110,97,109,101,
-- 125,92,68,101,98,117,103,122,6,95,100,46,112,121,100,99,
-- 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
-- 8,0,0,0,67,0,0,0,115,50,0,0,0,122,8,116,
-- 0,160,1,116,0,106,2,124,0,161,2,87,0,83,0,4,
-- 0,116,3,121,24,1,0,1,0,1,0,116,0,160,1,116,
-- 0,106,4,124,0,161,2,6,0,89,0,83,0,119,0,114,
-- 69,0,0,0,41,5,218,6,119,105,110,114,101,103,90,7,
-- 79,112,101,110,75,101,121,90,17,72,75,69,89,95,67,85,
-- 82,82,69,78,84,95,85,83,69,82,114,76,0,0,0,90,
-- 18,72,75,69,89,95,76,79,67,65,76,95,77,65,67,72,
-- 73,78,69,114,19,0,0,0,114,7,0,0,0,114,7,0,
-- 0,0,114,8,0,0,0,218,14,95,111,112,101,110,95,114,
-- 101,103,105,115,116,114,121,38,3,0,0,115,10,0,0,0,
-- 2,2,16,1,12,1,18,1,2,255,122,36,87,105,110,100,
-- 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,
-- 114,46,95,111,112,101,110,95,114,101,103,105,115,116,114,121,
-- 99,2,0,0,0,0,0,0,0,0,0,0,0,6,0,0,
-- 0,8,0,0,0,67,0,0,0,115,134,0,0,0,124,0,
-- 106,0,114,7,124,0,106,1,125,2,110,3,124,0,106,2,
-- 125,2,124,2,106,3,124,1,100,1,116,4,106,5,100,0,
-- 100,2,133,2,25,0,22,0,100,3,141,2,125,3,122,32,
-- 124,0,160,6,124,3,161,1,143,16,125,4,116,7,160,8,
-- 124,4,100,4,161,2,125,5,87,0,100,0,4,0,4,0,
-- 131,3,1,0,87,0,124,5,83,0,49,0,115,49,119,1,
-- 1,0,1,0,1,0,89,0,1,0,87,0,124,5,83,0,
-- 4,0,116,9,121,66,1,0,1,0,1,0,89,0,100,0,
-- 83,0,119,0,41,5,78,122,5,37,100,46,37,100,114,44,
-- 0,0,0,41,2,114,163,0,0,0,90,11,115,121,115,95,
-- 118,101,114,115,105,111,110,114,10,0,0,0,41,10,218,11,
-- 68,69,66,85,71,95,66,85,73,76,68,218,18,82,69,71,
-- 73,83,84,82,89,95,75,69,89,95,68,69,66,85,71,218,
-- 12,82,69,71,73,83,84,82,89,95,75,69,89,114,89,0,
-- 0,0,114,15,0,0,0,218,12,118,101,114,115,105,111,110,
-- 95,105,110,102,111,114,216,0,0,0,114,215,0,0,0,90,
-- 10,81,117,101,114,121,86,97,108,117,101,114,76,0,0,0,
-- 41,6,218,3,99,108,115,114,163,0,0,0,90,12,114,101,
-- 103,105,115,116,114,121,95,107,101,121,114,20,0,0,0,90,
-- 4,104,107,101,121,218,8,102,105,108,101,112,97,116,104,114,
-- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,16,
-- 95,115,101,97,114,99,104,95,114,101,103,105,115,116,114,121,
-- 45,3,0,0,115,32,0,0,0,6,2,8,1,6,2,6,
-- 1,16,1,6,255,2,2,12,1,14,1,12,255,4,4,18,
-- 252,4,4,12,254,6,1,2,255,122,38,87,105,110,100,111,
-- 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,
-- 46,95,115,101,97,114,99,104,95,114,101,103,105,115,116,114,
-- 121,78,99,4,0,0,0,0,0,0,0,0,0,0,0,8,
-- 0,0,0,8,0,0,0,67,0,0,0,115,120,0,0,0,
-- 124,0,160,0,124,1,161,1,125,4,124,4,100,0,117,0,
-- 114,11,100,0,83,0,122,6,116,1,124,4,131,1,1,0,
-- 87,0,110,10,4,0,116,2,121,27,1,0,1,0,1,0,
-- 89,0,100,0,83,0,119,0,116,3,131,0,68,0,93,26,
-- 92,2,125,5,125,6,124,4,160,4,116,5,124,6,131,1,
-- 161,1,114,57,116,6,106,7,124,1,124,5,124,1,124,4,
-- 131,2,124,4,100,1,141,3,125,7,124,7,2,0,1,0,
-- 83,0,113,31,100,0,83,0,41,2,78,114,204,0,0,0,
-- 41,8,114,223,0,0,0,114,75,0,0,0,114,76,0,0,
-- 0,114,208,0,0,0,114,58,0,0,0,114,136,0,0,0,
-- 114,159,0,0,0,218,16,115,112,101,99,95,102,114,111,109,
-- 95,108,111,97,100,101,114,41,8,114,221,0,0,0,114,163,
-- 0,0,0,114,65,0,0,0,218,6,116,97,114,103,101,116,
-- 114,222,0,0,0,114,164,0,0,0,114,212,0,0,0,114,
-- 210,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-- 0,0,0,218,9,102,105,110,100,95,115,112,101,99,60,3,
-- 0,0,115,34,0,0,0,10,2,8,1,4,1,2,1,12,
-- 1,12,1,6,1,2,255,14,2,14,1,6,1,8,1,2,
-- 1,6,254,8,3,2,252,4,255,122,31,87,105,110,100,111,
-- 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,
-- 46,102,105,110,100,95,115,112,101,99,99,3,0,0,0,0,
-- 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67,
-- 0,0,0,115,42,0,0,0,116,0,160,1,100,1,116,2,
-- 161,2,1,0,124,0,160,3,124,1,124,2,161,2,125,3,
-- 124,3,100,2,117,1,114,19,124,3,106,4,83,0,100,2,
-- 83,0,41,3,122,106,70,105,110,100,32,109,111,100,117,108,
-- 101,32,110,97,109,101,100,32,105,110,32,116,104,101,32,114,
-- 101,103,105,115,116,114,121,46,10,10,32,32,32,32,32,32,
-- 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,
-- 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,
-- 101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,
-- 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,
-- 122,112,87,105,110,100,111,119,115,82,101,103,105,115,116,114,
-- 121,70,105,110,100,101,114,46,102,105,110,100,95,109,111,100,
-- 117,108,101,40,41,32,105,115,32,100,101,112,114,101,99,97,
-- 116,101,100,32,97,110,100,32,115,108,97,116,101,100,32,102,
-- 111,114,32,114,101,109,111,118,97,108,32,105,110,32,80,121,
-- 116,104,111,110,32,51,46,49,50,59,32,117,115,101,32,102,
-- 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101,
-- 97,100,78,169,5,114,99,0,0,0,114,100,0,0,0,114,
-- 101,0,0,0,114,226,0,0,0,114,164,0,0,0,169,4,
-- 114,221,0,0,0,114,163,0,0,0,114,65,0,0,0,114,
-- 210,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-- 0,0,0,218,11,102,105,110,100,95,109,111,100,117,108,101,
-- 76,3,0,0,115,14,0,0,0,6,7,2,2,4,254,12,
-- 3,8,1,6,1,4,2,122,33,87,105,110,100,111,119,115,
-- 82,101,103,105,115,116,114,121,70,105,110,100,101,114,46,102,
-- 105,110,100,95,109,111,100,117,108,101,169,2,78,78,114,69,
-- 0,0,0,41,15,114,150,0,0,0,114,149,0,0,0,114,
-- 151,0,0,0,114,152,0,0,0,114,219,0,0,0,114,218,
-- 0,0,0,218,11,95,77,83,95,87,73,78,68,79,87,83,
-- 218,18,69,88,84,69,78,83,73,79,78,95,83,85,70,70,
-- 73,88,69,83,114,217,0,0,0,218,12,115,116,97,116,105,
-- 99,109,101,116,104,111,100,114,216,0,0,0,218,11,99,108,
-- 97,115,115,109,101,116,104,111,100,114,223,0,0,0,114,226,
-- 0,0,0,114,229,0,0,0,114,7,0,0,0,114,7,0,
-- 0,0,114,7,0,0,0,114,8,0,0,0,114,214,0,0,
-- 0,26,3,0,0,115,30,0,0,0,8,0,4,2,2,3,
-- 2,255,2,4,2,255,12,3,2,2,10,1,2,6,10,1,
-- 2,14,12,1,2,15,16,1,114,214,0,0,0,99,0,0,
-- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
-- 0,0,64,0,0,0,115,48,0,0,0,101,0,90,1,100,
-- 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,
-- 4,100,5,132,0,90,5,100,6,100,7,132,0,90,6,100,
-- 8,100,9,132,0,90,7,100,10,83,0,41,11,218,13,95,
-- 76,111,97,100,101,114,66,97,115,105,99,115,122,83,66,97,
-- 115,101,32,99,108,97,115,115,32,111,102,32,99,111,109,109,
-- 111,110,32,99,111,100,101,32,110,101,101,100,101,100,32,98,
-- 121,32,98,111,116,104,32,83,111,117,114,99,101,76,111,97,
-- 100,101,114,32,97,110,100,10,32,32,32,32,83,111,117,114,
-- 99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114,
-- 46,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0,
-- 0,0,4,0,0,0,67,0,0,0,115,64,0,0,0,116,
-- 0,124,0,160,1,124,1,161,1,131,1,100,1,25,0,125,
-- 2,124,2,160,2,100,2,100,1,161,2,100,3,25,0,125,
-- 3,124,1,160,3,100,2,161,1,100,4,25,0,125,4,124,
-- 3,100,5,107,2,111,31,124,4,100,5,107,3,83,0,41,
-- 6,122,141,67,111,110,99,114,101,116,101,32,105,109,112,108,
-- 101,109,101,110,116,97,116,105,111,110,32,111,102,32,73,110,
-- 115,112,101,99,116,76,111,97,100,101,114,46,105,115,95,112,
-- 97,99,107,97,103,101,32,98,121,32,99,104,101,99,107,105,
-- 110,103,32,105,102,10,32,32,32,32,32,32,32,32,116,104,
-- 101,32,112,97,116,104,32,114,101,116,117,114,110,101,100,32,
-- 98,121,32,103,101,116,95,102,105,108,101,110,97,109,101,32,
-- 104,97,115,32,97,32,102,105,108,101,110,97,109,101,32,111,
-- 102,32,39,95,95,105,110,105,116,95,95,46,112,121,39,46,
-- 114,3,0,0,0,114,97,0,0,0,114,0,0,0,0,114,
-- 44,0,0,0,218,8,95,95,105,110,105,116,95,95,41,4,
-- 114,74,0,0,0,114,203,0,0,0,114,125,0,0,0,114,
-- 104,0,0,0,41,5,114,143,0,0,0,114,163,0,0,0,
-- 114,120,0,0,0,90,13,102,105,108,101,110,97,109,101,95,
-- 98,97,115,101,90,9,116,97,105,108,95,110,97,109,101,114,
-- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,206,
-- 0,0,0,98,3,0,0,115,8,0,0,0,18,3,16,1,
-- 14,1,16,1,122,24,95,76,111,97,100,101,114,66,97,115,
-- 105,99,115,46,105,115,95,112,97,99,107,97,103,101,99,2,
-- 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,
-- 0,0,0,67,0,0,0,114,23,0,0,0,169,2,122,42,
-- 85,115,101,32,100,101,102,97,117,108,116,32,115,101,109,97,
-- 110,116,105,99,115,32,102,111,114,32,109,111,100,117,108,101,
-- 32,99,114,101,97,116,105,111,110,46,78,114,7,0,0,0,
-- 169,2,114,143,0,0,0,114,210,0,0,0,114,7,0,0,
-- 0,114,7,0,0,0,114,8,0,0,0,218,13,99,114,101,
-- 97,116,101,95,109,111,100,117,108,101,106,3,0,0,243,2,
-- 0,0,0,4,0,122,27,95,76,111,97,100,101,114,66,97,
-- 115,105,99,115,46,99,114,101,97,116,101,95,109,111,100,117,
-- 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,3,
-- 0,0,0,5,0,0,0,67,0,0,0,115,56,0,0,0,
-- 124,0,160,0,124,1,106,1,161,1,125,2,124,2,100,1,
-- 117,0,114,18,116,2,100,2,160,3,124,1,106,1,161,1,
-- 131,1,130,1,116,4,160,5,116,6,124,2,124,1,106,7,
-- 161,3,1,0,100,1,83,0,41,3,122,19,69,120,101,99,
-- 117,116,101,32,116,104,101,32,109,111,100,117,108,101,46,78,
-- 122,52,99,97,110,110,111,116,32,108,111,97,100,32,109,111,
-- 100,117,108,101,32,123,33,114,125,32,119,104,101,110,32,103,
-- 101,116,95,99,111,100,101,40,41,32,114,101,116,117,114,110,
-- 115,32,78,111,110,101,41,8,218,8,103,101,116,95,99,111,
-- 100,101,114,150,0,0,0,114,142,0,0,0,114,89,0,0,
-- 0,114,159,0,0,0,218,25,95,99,97,108,108,95,119,105,
-- 116,104,95,102,114,97,109,101,115,95,114,101,109,111,118,101,
-- 100,218,4,101,120,101,99,114,156,0,0,0,41,3,114,143,
-- 0,0,0,218,6,109,111,100,117,108,101,114,188,0,0,0,
-+ 114,217,0,0,0,26,3,0,0,115,30,0,0,0,8,0,
-+ 4,2,2,3,2,255,2,4,2,255,12,3,2,2,10,1,
-+ 2,6,10,1,2,14,12,1,2,15,16,1,114,217,0,0,
-+ 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-+ 0,0,2,0,0,0,64,0,0,0,115,48,0,0,0,101,
-+ 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,
-+ 0,90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,
-+ 0,90,6,100,8,100,9,132,0,90,7,100,10,83,0,41,
-+ 11,218,13,95,76,111,97,100,101,114,66,97,115,105,99,115,
-+ 122,83,66,97,115,101,32,99,108,97,115,115,32,111,102,32,
-+ 99,111,109,109,111,110,32,99,111,100,101,32,110,101,101,100,
-+ 101,100,32,98,121,32,98,111,116,104,32,83,111,117,114,99,
-+ 101,76,111,97,100,101,114,32,97,110,100,10,32,32,32,32,
-+ 83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,
-+ 97,100,101,114,46,99,2,0,0,0,0,0,0,0,0,0,
-+ 0,0,5,0,0,0,4,0,0,0,67,0,0,0,115,64,
-+ 0,0,0,116,0,124,0,160,1,124,1,161,1,131,1,100,
-+ 1,25,0,125,2,124,2,160,2,100,2,100,1,161,2,100,
-+ 3,25,0,125,3,124,1,160,3,100,2,161,1,100,4,25,
-+ 0,125,4,124,3,100,5,107,2,111,31,124,4,100,5,107,
-+ 3,83,0,41,6,122,141,67,111,110,99,114,101,116,101,32,
-+ 105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,
-+ 102,32,73,110,115,112,101,99,116,76,111,97,100,101,114,46,
-+ 105,115,95,112,97,99,107,97,103,101,32,98,121,32,99,104,
-+ 101,99,107,105,110,103,32,105,102,10,32,32,32,32,32,32,
-+ 32,32,116,104,101,32,112,97,116,104,32,114,101,116,117,114,
-+ 110,101,100,32,98,121,32,103,101,116,95,102,105,108,101,110,
-+ 97,109,101,32,104,97,115,32,97,32,102,105,108,101,110,97,
-+ 109,101,32,111,102,32,39,95,95,105,110,105,116,95,95,46,
-+ 112,121,39,46,114,3,0,0,0,114,100,0,0,0,114,0,
-+ 0,0,0,114,47,0,0,0,218,8,95,95,105,110,105,116,
-+ 95,95,41,4,114,77,0,0,0,114,206,0,0,0,114,128,
-+ 0,0,0,114,107,0,0,0,41,5,114,146,0,0,0,114,
-+ 166,0,0,0,114,123,0,0,0,90,13,102,105,108,101,110,
-+ 97,109,101,95,98,97,115,101,90,9,116,97,105,108,95,110,
-+ 97,109,101,114,7,0,0,0,114,7,0,0,0,114,8,0,
-+ 0,0,114,209,0,0,0,98,3,0,0,115,8,0,0,0,
-+ 18,3,16,1,14,1,16,1,122,24,95,76,111,97,100,101,
-+ 114,66,97,115,105,99,115,46,105,115,95,112,97,99,107,97,
-+ 103,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
-+ 0,0,0,1,0,0,0,67,0,0,0,114,26,0,0,0,
-+ 169,2,122,42,85,115,101,32,100,101,102,97,117,108,116,32,
-+ 115,101,109,97,110,116,105,99,115,32,102,111,114,32,109,111,
-+ 100,117,108,101,32,99,114,101,97,116,105,111,110,46,78,114,
-+ 7,0,0,0,169,2,114,146,0,0,0,114,213,0,0,0,
- 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,
-- 11,101,120,101,99,95,109,111,100,117,108,101,109,3,0,0,
-- 115,12,0,0,0,12,2,8,1,4,1,8,1,4,255,20,
-- 2,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115,
-- 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0,
-- 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,
-- 0,67,0,0,0,115,12,0,0,0,116,0,160,1,124,0,
-- 124,1,161,2,83,0,41,1,122,26,84,104,105,115,32,109,
-- 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,
-- 116,101,100,46,41,2,114,159,0,0,0,218,17,95,108,111,
-- 97,100,95,109,111,100,117,108,101,95,115,104,105,109,169,2,
-- 114,143,0,0,0,114,163,0,0,0,114,7,0,0,0,114,
-- 7,0,0,0,114,8,0,0,0,218,11,108,111,97,100,95,
-- 109,111,100,117,108,101,117,3,0,0,115,2,0,0,0,12,
-- 3,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115,
-- 46,108,111,97,100,95,109,111,100,117,108,101,78,41,8,114,
-- 150,0,0,0,114,149,0,0,0,114,151,0,0,0,114,152,
-- 0,0,0,114,206,0,0,0,114,239,0,0,0,114,245,0,
-- 0,0,114,248,0,0,0,114,7,0,0,0,114,7,0,0,
-- 0,114,7,0,0,0,114,8,0,0,0,114,235,0,0,0,
-- 93,3,0,0,115,12,0,0,0,8,0,4,2,8,3,8,
-- 8,8,3,12,8,114,235,0,0,0,99,0,0,0,0,0,
-- 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64,
-- 0,0,0,115,74,0,0,0,101,0,90,1,100,0,90,2,
-- 100,1,100,2,132,0,90,3,100,3,100,4,132,0,90,4,
-- 100,5,100,6,132,0,90,5,100,7,100,8,132,0,90,6,
-- 100,9,100,10,132,0,90,7,100,11,100,12,156,1,100,13,
-- 100,14,132,2,90,8,100,15,100,16,132,0,90,9,100,17,
-- 83,0,41,18,218,12,83,111,117,114,99,101,76,111,97,100,
-- 101,114,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
-- 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,
-- 116,0,130,1,41,1,122,165,79,112,116,105,111,110,97,108,
-- 32,109,101,116,104,111,100,32,116,104,97,116,32,114,101,116,
-- 117,114,110,115,32,116,104,101,32,109,111,100,105,102,105,99,
-- 97,116,105,111,110,32,116,105,109,101,32,40,97,110,32,105,
-- 110,116,41,32,102,111,114,32,116,104,101,10,32,32,32,32,
-- 32,32,32,32,115,112,101,99,105,102,105,101,100,32,112,97,
-- 116,104,32,40,97,32,115,116,114,41,46,10,10,32,32,32,
-- 32,32,32,32,32,82,97,105,115,101,115,32,79,83,69,114,
-- 114,111,114,32,119,104,101,110,32,116,104,101,32,112,97,116,
-- 104,32,99,97,110,110,111,116,32,98,101,32,104,97,110,100,
-- 108,101,100,46,10,32,32,32,32,32,32,32,32,41,1,114,
-- 76,0,0,0,169,2,114,143,0,0,0,114,65,0,0,0,
-- 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,
-- 10,112,97,116,104,95,109,116,105,109,101,125,3,0,0,115,
-- 2,0,0,0,4,6,122,23,83,111,117,114,99,101,76,111,
-- 97,100,101,114,46,112,97,116,104,95,109,116,105,109,101,99,
-- 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,
-- 4,0,0,0,67,0,0,0,115,14,0,0,0,100,1,124,
-- 0,160,0,124,1,161,1,105,1,83,0,41,2,97,158,1,
-- 0,0,79,112,116,105,111,110,97,108,32,109,101,116,104,111,
-- 100,32,114,101,116,117,114,110,105,110,103,32,97,32,109,101,
-- 116,97,100,97,116,97,32,100,105,99,116,32,102,111,114,32,
-- 116,104,101,32,115,112,101,99,105,102,105,101,100,10,32,32,
-- 32,32,32,32,32,32,112,97,116,104,32,40,97,32,115,116,
-- 114,41,46,10,10,32,32,32,32,32,32,32,32,80,111,115,
-- 115,105,98,108,101,32,107,101,121,115,58,10,32,32,32,32,
-- 32,32,32,32,45,32,39,109,116,105,109,101,39,32,40,109,
-- 97,110,100,97,116,111,114,121,41,32,105,115,32,116,104,101,
-- 32,110,117,109,101,114,105,99,32,116,105,109,101,115,116,97,
-- 109,112,32,111,102,32,108,97,115,116,32,115,111,117,114,99,
-- 101,10,32,32,32,32,32,32,32,32,32,32,99,111,100,101,
-- 32,109,111,100,105,102,105,99,97,116,105,111,110,59,10,32,
-- 32,32,32,32,32,32,32,45,32,39,115,105,122,101,39,32,
-- 40,111,112,116,105,111,110,97,108,41,32,105,115,32,116,104,
-- 101,32,115,105,122,101,32,105,110,32,98,121,116,101,115,32,
-- 111,102,32,116,104,101,32,115,111,117,114,99,101,32,99,111,
-- 100,101,46,10,10,32,32,32,32,32,32,32,32,73,109,112,
-- 108,101,109,101,110,116,105,110,103,32,116,104,105,115,32,109,
-- 101,116,104,111,100,32,97,108,108,111,119,115,32,116,104,101,
-- 32,108,111,97,100,101,114,32,116,111,32,114,101,97,100,32,
-- 98,121,116,101,99,111,100,101,32,102,105,108,101,115,46,10,
-- 32,32,32,32,32,32,32,32,82,97,105,115,101,115,32,79,
-- 83,69,114,114,111,114,32,119,104,101,110,32,116,104,101,32,
-- 112,97,116,104,32,99,97,110,110,111,116,32,98,101,32,104,
-- 97,110,100,108,101,100,46,10,32,32,32,32,32,32,32,32,
-- 114,193,0,0,0,41,1,114,251,0,0,0,114,250,0,0,
-- 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-- 218,10,112,97,116,104,95,115,116,97,116,115,133,3,0,0,
-- 115,2,0,0,0,14,12,122,23,83,111,117,114,99,101,76,
-- 111,97,100,101,114,46,112,97,116,104,95,115,116,97,116,115,
-- 99,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
-- 0,4,0,0,0,67,0,0,0,115,12,0,0,0,124,0,
-- 160,0,124,2,124,3,161,2,83,0,41,1,122,228,79,112,
-- 116,105,111,110,97,108,32,109,101,116,104,111,100,32,119,104,
-- 105,99,104,32,119,114,105,116,101,115,32,100,97,116,97,32,
-- 40,98,121,116,101,115,41,32,116,111,32,97,32,102,105,108,
-- 101,32,112,97,116,104,32,40,97,32,115,116,114,41,46,10,
-- 10,32,32,32,32,32,32,32,32,73,109,112,108,101,109,101,
-- 110,116,105,110,103,32,116,104,105,115,32,109,101,116,104,111,
-- 100,32,97,108,108,111,119,115,32,102,111,114,32,116,104,101,
-- 32,119,114,105,116,105,110,103,32,111,102,32,98,121,116,101,
-- 99,111,100,101,32,102,105,108,101,115,46,10,10,32,32,32,
-- 32,32,32,32,32,84,104,101,32,115,111,117,114,99,101,32,
-- 112,97,116,104,32,105,115,32,110,101,101,100,101,100,32,105,
-- 110,32,111,114,100,101,114,32,116,111,32,99,111,114,114,101,
-- 99,116,108,121,32,116,114,97,110,115,102,101,114,32,112,101,
-- 114,109,105,115,115,105,111,110,115,10,32,32,32,32,32,32,
-- 32,32,41,1,218,8,115,101,116,95,100,97,116,97,41,4,
-- 114,143,0,0,0,114,134,0,0,0,90,10,99,97,99,104,
-- 101,95,112,97,116,104,114,41,0,0,0,114,7,0,0,0,
-- 114,7,0,0,0,114,8,0,0,0,218,15,95,99,97,99,
-- 104,101,95,98,121,116,101,99,111,100,101,147,3,0,0,115,
-- 2,0,0,0,12,8,122,28,83,111,117,114,99,101,76,111,
-- 97,100,101,114,46,95,99,97,99,104,101,95,98,121,116,101,
-- 99,111,100,101,99,3,0,0,0,0,0,0,0,0,0,0,
-- 0,3,0,0,0,1,0,0,0,67,0,0,0,114,23,0,
-- 0,0,41,2,122,150,79,112,116,105,111,110,97,108,32,109,
-- 101,116,104,111,100,32,119,104,105,99,104,32,119,114,105,116,
-- 101,115,32,100,97,116,97,32,40,98,121,116,101,115,41,32,
-- 116,111,32,97,32,102,105,108,101,32,112,97,116,104,32,40,
-+ 13,99,114,101,97,116,101,95,109,111,100,117,108,101,106,3,
-+ 0,0,243,2,0,0,0,4,0,122,27,95,76,111,97,100,
-+ 101,114,66,97,115,105,99,115,46,99,114,101,97,116,101,95,
-+ 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,
-+ 0,0,0,3,0,0,0,5,0,0,0,67,0,0,0,115,
-+ 56,0,0,0,124,0,160,0,124,1,106,1,161,1,125,2,
-+ 124,2,100,1,117,0,114,18,116,2,100,2,160,3,124,1,
-+ 106,1,161,1,131,1,130,1,116,4,160,5,116,6,124,2,
-+ 124,1,106,7,161,3,1,0,100,1,83,0,41,3,122,19,
-+ 69,120,101,99,117,116,101,32,116,104,101,32,109,111,100,117,
-+ 108,101,46,78,122,52,99,97,110,110,111,116,32,108,111,97,
-+ 100,32,109,111,100,117,108,101,32,123,33,114,125,32,119,104,
-+ 101,110,32,103,101,116,95,99,111,100,101,40,41,32,114,101,
-+ 116,117,114,110,115,32,78,111,110,101,41,8,218,8,103,101,
-+ 116,95,99,111,100,101,114,153,0,0,0,114,145,0,0,0,
-+ 114,92,0,0,0,114,162,0,0,0,218,25,95,99,97,108,
-+ 108,95,119,105,116,104,95,102,114,97,109,101,115,95,114,101,
-+ 109,111,118,101,100,218,4,101,120,101,99,114,159,0,0,0,
-+ 41,3,114,146,0,0,0,218,6,109,111,100,117,108,101,114,
-+ 191,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-+ 0,0,0,218,11,101,120,101,99,95,109,111,100,117,108,101,
-+ 109,3,0,0,115,12,0,0,0,12,2,8,1,4,1,8,
-+ 1,4,255,20,2,122,25,95,76,111,97,100,101,114,66,97,
-+ 115,105,99,115,46,101,120,101,99,95,109,111,100,117,108,101,
-+ 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
-+ 0,4,0,0,0,67,0,0,0,115,12,0,0,0,116,0,
-+ 160,1,124,0,124,1,161,2,83,0,41,1,122,26,84,104,
-+ 105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,
-+ 114,101,99,97,116,101,100,46,41,2,114,162,0,0,0,218,
-+ 17,95,108,111,97,100,95,109,111,100,117,108,101,95,115,104,
-+ 105,109,169,2,114,146,0,0,0,114,166,0,0,0,114,7,
-+ 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,108,
-+ 111,97,100,95,109,111,100,117,108,101,117,3,0,0,115,2,
-+ 0,0,0,12,3,122,25,95,76,111,97,100,101,114,66,97,
-+ 115,105,99,115,46,108,111,97,100,95,109,111,100,117,108,101,
-+ 78,41,8,114,153,0,0,0,114,152,0,0,0,114,154,0,
-+ 0,0,114,155,0,0,0,114,209,0,0,0,114,242,0,0,
-+ 0,114,248,0,0,0,114,251,0,0,0,114,7,0,0,0,
-+ 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
-+ 238,0,0,0,93,3,0,0,115,12,0,0,0,8,0,4,
-+ 2,8,3,8,8,8,3,12,8,114,238,0,0,0,99,0,
-+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,
-+ 0,0,0,64,0,0,0,115,74,0,0,0,101,0,90,1,
-+ 100,0,90,2,100,1,100,2,132,0,90,3,100,3,100,4,
-+ 132,0,90,4,100,5,100,6,132,0,90,5,100,7,100,8,
-+ 132,0,90,6,100,9,100,10,132,0,90,7,100,11,100,12,
-+ 156,1,100,13,100,14,132,2,90,8,100,15,100,16,132,0,
-+ 90,9,100,17,83,0,41,18,218,12,83,111,117,114,99,101,
-+ 76,111,97,100,101,114,99,2,0,0,0,0,0,0,0,0,
-+ 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,
-+ 4,0,0,0,116,0,130,1,41,1,122,165,79,112,116,105,
-+ 111,110,97,108,32,109,101,116,104,111,100,32,116,104,97,116,
-+ 32,114,101,116,117,114,110,115,32,116,104,101,32,109,111,100,
-+ 105,102,105,99,97,116,105,111,110,32,116,105,109,101,32,40,
-+ 97,110,32,105,110,116,41,32,102,111,114,32,116,104,101,10,
-+ 32,32,32,32,32,32,32,32,115,112,101,99,105,102,105,101,
-+ 100,32,112,97,116,104,32,40,97,32,115,116,114,41,46,10,
-+ 10,32,32,32,32,32,32,32,32,82,97,105,115,101,115,32,
-+ 79,83,69,114,114,111,114,32,119,104,101,110,32,116,104,101,
-+ 32,112,97,116,104,32,99,97,110,110,111,116,32,98,101,32,
-+ 104,97,110,100,108,101,100,46,10,32,32,32,32,32,32,32,
-+ 32,41,1,114,79,0,0,0,169,2,114,146,0,0,0,114,
-+ 68,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-+ 0,0,0,218,10,112,97,116,104,95,109,116,105,109,101,125,
-+ 3,0,0,115,2,0,0,0,4,6,122,23,83,111,117,114,
-+ 99,101,76,111,97,100,101,114,46,112,97,116,104,95,109,116,
-+ 105,109,101,99,2,0,0,0,0,0,0,0,0,0,0,0,
-+ 2,0,0,0,4,0,0,0,67,0,0,0,115,14,0,0,
-+ 0,100,1,124,0,160,0,124,1,161,1,105,1,83,0,41,
-+ 2,97,158,1,0,0,79,112,116,105,111,110,97,108,32,109,
-+ 101,116,104,111,100,32,114,101,116,117,114,110,105,110,103,32,
-+ 97,32,109,101,116,97,100,97,116,97,32,100,105,99,116,32,
-+ 102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,
-+ 100,10,32,32,32,32,32,32,32,32,112,97,116,104,32,40,
- 97,32,115,116,114,41,46,10,10,32,32,32,32,32,32,32,
-+ 32,80,111,115,115,105,98,108,101,32,107,101,121,115,58,10,
-+ 32,32,32,32,32,32,32,32,45,32,39,109,116,105,109,101,
-+ 39,32,40,109,97,110,100,97,116,111,114,121,41,32,105,115,
-+ 32,116,104,101,32,110,117,109,101,114,105,99,32,116,105,109,
-+ 101,115,116,97,109,112,32,111,102,32,108,97,115,116,32,115,
-+ 111,117,114,99,101,10,32,32,32,32,32,32,32,32,32,32,
-+ 99,111,100,101,32,109,111,100,105,102,105,99,97,116,105,111,
-+ 110,59,10,32,32,32,32,32,32,32,32,45,32,39,115,105,
-+ 122,101,39,32,40,111,112,116,105,111,110,97,108,41,32,105,
-+ 115,32,116,104,101,32,115,105,122,101,32,105,110,32,98,121,
-+ 116,101,115,32,111,102,32,116,104,101,32,115,111,117,114,99,
-+ 101,32,99,111,100,101,46,10,10,32,32,32,32,32,32,32,
- 32,73,109,112,108,101,109,101,110,116,105,110,103,32,116,104,
- 105,115,32,109,101,116,104,111,100,32,97,108,108,111,119,115,
-- 32,102,111,114,32,116,104,101,32,119,114,105,116,105,110,103,
-- 32,111,102,32,98,121,116,101,99,111,100,101,32,102,105,108,
-- 101,115,46,10,32,32,32,32,32,32,32,32,78,114,7,0,
-- 0,0,41,3,114,143,0,0,0,114,65,0,0,0,114,41,
-- 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-- 0,0,114,253,0,0,0,157,3,0,0,114,240,0,0,0,
-- 122,21,83,111,117,114,99,101,76,111,97,100,101,114,46,115,
-- 101,116,95,100,97,116,97,99,2,0,0,0,0,0,0,0,
-- 0,0,0,0,5,0,0,0,10,0,0,0,67,0,0,0,
-- 115,70,0,0,0,124,0,160,0,124,1,161,1,125,2,122,
-- 10,124,0,160,1,124,2,161,1,125,3,87,0,116,4,124,
-- 3,131,1,83,0,4,0,116,2,121,34,1,0,125,4,1,
-- 0,122,7,116,3,100,1,124,1,100,2,141,2,124,4,130,
-- 2,100,3,125,4,126,4,119,1,119,0,41,4,122,52,67,
-- 111,110,99,114,101,116,101,32,105,109,112,108,101,109,101,110,
-- 116,97,116,105,111,110,32,111,102,32,73,110,115,112,101,99,
-- 116,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,
-- 99,101,46,122,39,115,111,117,114,99,101,32,110,111,116,32,
-- 97,118,97,105,108,97,98,108,101,32,116,104,114,111,117,103,
-- 104,32,103,101,116,95,100,97,116,97,40,41,114,140,0,0,
-- 0,78,41,5,114,203,0,0,0,218,8,103,101,116,95,100,
-- 97,116,97,114,76,0,0,0,114,142,0,0,0,114,200,0,
-- 0,0,41,5,114,143,0,0,0,114,163,0,0,0,114,65,
-- 0,0,0,114,198,0,0,0,218,3,101,120,99,114,7,0,
-- 0,0,114,7,0,0,0,114,8,0,0,0,218,10,103,101,
-- 116,95,115,111,117,114,99,101,164,3,0,0,115,24,0,0,
-- 0,10,2,2,1,12,1,8,4,14,253,4,1,2,1,4,
-- 255,2,1,2,255,8,128,2,255,122,23,83,111,117,114,99,
-- 101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,
-- 99,101,114,130,0,0,0,41,1,218,9,95,111,112,116,105,
-- 109,105,122,101,99,3,0,0,0,0,0,0,0,1,0,0,
-- 0,4,0,0,0,8,0,0,0,67,0,0,0,115,22,0,
-- 0,0,116,0,106,1,116,2,124,1,124,2,100,1,100,2,
-- 124,3,100,3,141,6,83,0,41,4,122,130,82,101,116,117,
-- 114,110,32,116,104,101,32,99,111,100,101,32,111,98,106,101,
-- 99,116,32,99,111,109,112,105,108,101,100,32,102,114,111,109,
-- 32,115,111,117,114,99,101,46,10,10,32,32,32,32,32,32,
-- 32,32,84,104,101,32,39,100,97,116,97,39,32,97,114,103,
-- 117,109,101,110,116,32,99,97,110,32,98,101,32,97,110,121,
-- 32,111,98,106,101,99,116,32,116,121,112,101,32,116,104,97,
-- 116,32,99,111,109,112,105,108,101,40,41,32,115,117,112,112,
-- 111,114,116,115,46,10,32,32,32,32,32,32,32,32,114,243,
-- 0,0,0,84,41,2,218,12,100,111,110,116,95,105,110,104,
-- 101,114,105,116,114,108,0,0,0,41,3,114,159,0,0,0,
-- 114,242,0,0,0,218,7,99,111,109,112,105,108,101,41,4,
-- 114,143,0,0,0,114,41,0,0,0,114,65,0,0,0,114,
-- 2,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-- 0,0,0,218,14,115,111,117,114,99,101,95,116,111,95,99,
-- 111,100,101,174,3,0,0,115,6,0,0,0,12,5,4,1,
-- 6,255,122,27,83,111,117,114,99,101,76,111,97,100,101,114,
-- 46,115,111,117,114,99,101,95,116,111,95,99,111,100,101,99,
-- 2,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,
-- 9,0,0,0,67,0,0,0,115,2,2,0,0,124,0,160,
-- 0,124,1,161,1,125,2,100,1,125,3,100,1,125,4,100,
-- 1,125,5,100,2,125,6,100,3,125,7,122,6,116,1,124,
-- 2,131,1,125,8,87,0,110,11,4,0,116,2,121,32,1,
-- 0,1,0,1,0,100,1,125,8,89,0,110,144,119,0,122,
-- 7,124,0,160,3,124,2,161,1,125,9,87,0,110,9,4,
-- 0,116,4,121,49,1,0,1,0,1,0,89,0,110,127,119,
-- 0,116,5,124,9,100,4,25,0,131,1,125,3,122,7,124,
-- 0,160,6,124,8,161,1,125,10,87,0,110,9,4,0,116,
-- 4,121,72,1,0,1,0,1,0,89,0,110,104,119,0,124,
-- 1,124,8,100,5,156,2,125,11,122,71,116,7,124,10,124,
-- 1,124,11,131,3,125,12,116,8,124,10,131,1,100,6,100,
-- 1,133,2,25,0,125,13,124,12,100,7,64,0,100,8,107,
-- 3,125,6,124,6,114,138,124,12,100,9,64,0,100,8,107,
-- 3,125,7,116,9,106,10,100,10,107,3,114,137,124,7,115,
-- 119,116,9,106,10,100,11,107,2,114,137,124,0,160,6,124,
-- 2,161,1,125,4,116,9,160,11,116,12,124,4,161,2,125,
-- 5,116,13,124,10,124,5,124,1,124,11,131,4,1,0,110,
-- 10,116,14,124,10,124,3,124,9,100,12,25,0,124,1,124,
-- 11,131,5,1,0,87,0,110,11,4,0,116,15,116,16,102,
-- 2,121,160,1,0,1,0,1,0,89,0,110,16,119,0,116,
-- 17,160,18,100,13,124,8,124,2,161,3,1,0,116,19,124,
-- 13,124,1,124,8,124,2,100,14,141,4,83,0,124,4,100,
-- 1,117,0,114,185,124,0,160,6,124,2,161,1,125,4,124,
-- 0,160,20,124,4,124,2,161,2,125,14,116,17,160,18,100,
-- 15,124,2,161,2,1,0,116,21,106,22,115,255,124,8,100,
-- 1,117,1,114,255,124,3,100,1,117,1,114,255,124,6,114,
-- 226,124,5,100,1,117,0,114,219,116,9,160,11,124,4,161,
-- 1,125,5,116,23,124,14,124,5,124,7,131,3,125,10,110,
-- 8,116,24,124,14,124,3,116,25,124,4,131,1,131,3,125,
-- 10,122,10,124,0,160,26,124,2,124,8,124,10,161,3,1,
-- 0,87,0,124,14,83,0,4,0,116,2,121,254,1,0,1,
-- 0,1,0,89,0,124,14,83,0,119,0,124,14,83,0,41,
-- 16,122,190,67,111,110,99,114,101,116,101,32,105,109,112,108,
-+ 32,116,104,101,32,108,111,97,100,101,114,32,116,111,32,114,
-+ 101,97,100,32,98,121,116,101,99,111,100,101,32,102,105,108,
-+ 101,115,46,10,32,32,32,32,32,32,32,32,82,97,105,115,
-+ 101,115,32,79,83,69,114,114,111,114,32,119,104,101,110,32,
-+ 116,104,101,32,112,97,116,104,32,99,97,110,110,111,116,32,
-+ 98,101,32,104,97,110,100,108,101,100,46,10,32,32,32,32,
-+ 32,32,32,32,114,196,0,0,0,41,1,114,254,0,0,0,
-+ 114,253,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
-+ 8,0,0,0,218,10,112,97,116,104,95,115,116,97,116,115,
-+ 133,3,0,0,115,2,0,0,0,14,12,122,23,83,111,117,
-+ 114,99,101,76,111,97,100,101,114,46,112,97,116,104,95,115,
-+ 116,97,116,115,99,4,0,0,0,0,0,0,0,0,0,0,
-+ 0,4,0,0,0,4,0,0,0,67,0,0,0,115,12,0,
-+ 0,0,124,0,160,0,124,2,124,3,161,2,83,0,41,1,
-+ 122,228,79,112,116,105,111,110,97,108,32,109,101,116,104,111,
-+ 100,32,119,104,105,99,104,32,119,114,105,116,101,115,32,100,
-+ 97,116,97,32,40,98,121,116,101,115,41,32,116,111,32,97,
-+ 32,102,105,108,101,32,112,97,116,104,32,40,97,32,115,116,
-+ 114,41,46,10,10,32,32,32,32,32,32,32,32,73,109,112,
-+ 108,101,109,101,110,116,105,110,103,32,116,104,105,115,32,109,
-+ 101,116,104,111,100,32,97,108,108,111,119,115,32,102,111,114,
-+ 32,116,104,101,32,119,114,105,116,105,110,103,32,111,102,32,
-+ 98,121,116,101,99,111,100,101,32,102,105,108,101,115,46,10,
-+ 10,32,32,32,32,32,32,32,32,84,104,101,32,115,111,117,
-+ 114,99,101,32,112,97,116,104,32,105,115,32,110,101,101,100,
-+ 101,100,32,105,110,32,111,114,100,101,114,32,116,111,32,99,
-+ 111,114,114,101,99,116,108,121,32,116,114,97,110,115,102,101,
-+ 114,32,112,101,114,109,105,115,115,105,111,110,115,10,32,32,
-+ 32,32,32,32,32,32,41,1,218,8,115,101,116,95,100,97,
-+ 116,97,41,4,114,146,0,0,0,114,137,0,0,0,90,10,
-+ 99,97,99,104,101,95,112,97,116,104,114,44,0,0,0,114,
-+ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,15,
-+ 95,99,97,99,104,101,95,98,121,116,101,99,111,100,101,147,
-+ 3,0,0,115,2,0,0,0,12,8,122,28,83,111,117,114,
-+ 99,101,76,111,97,100,101,114,46,95,99,97,99,104,101,95,
-+ 98,121,116,101,99,111,100,101,99,3,0,0,0,0,0,0,
-+ 0,0,0,0,0,3,0,0,0,1,0,0,0,67,0,0,
-+ 0,114,26,0,0,0,41,2,122,150,79,112,116,105,111,110,
-+ 97,108,32,109,101,116,104,111,100,32,119,104,105,99,104,32,
-+ 119,114,105,116,101,115,32,100,97,116,97,32,40,98,121,116,
-+ 101,115,41,32,116,111,32,97,32,102,105,108,101,32,112,97,
-+ 116,104,32,40,97,32,115,116,114,41,46,10,10,32,32,32,
-+ 32,32,32,32,32,73,109,112,108,101,109,101,110,116,105,110,
-+ 103,32,116,104,105,115,32,109,101,116,104,111,100,32,97,108,
-+ 108,111,119,115,32,102,111,114,32,116,104,101,32,119,114,105,
-+ 116,105,110,103,32,111,102,32,98,121,116,101,99,111,100,101,
-+ 32,102,105,108,101,115,46,10,32,32,32,32,32,32,32,32,
-+ 78,114,7,0,0,0,41,3,114,146,0,0,0,114,68,0,
-+ 0,0,114,44,0,0,0,114,7,0,0,0,114,7,0,0,
-+ 0,114,8,0,0,0,114,0,1,0,0,157,3,0,0,114,
-+ 243,0,0,0,122,21,83,111,117,114,99,101,76,111,97,100,
-+ 101,114,46,115,101,116,95,100,97,116,97,99,2,0,0,0,
-+ 0,0,0,0,0,0,0,0,5,0,0,0,10,0,0,0,
-+ 67,0,0,0,115,70,0,0,0,124,0,160,0,124,1,161,
-+ 1,125,2,122,10,124,0,160,1,124,2,161,1,125,3,87,
-+ 0,116,4,124,3,131,1,83,0,4,0,116,2,121,34,1,
-+ 0,125,4,1,0,122,7,116,3,100,1,124,1,100,2,141,
-+ 2,124,4,130,2,100,3,125,4,126,4,119,1,119,0,41,
-+ 4,122,52,67,111,110,99,114,101,116,101,32,105,109,112,108,
- 101,109,101,110,116,97,116,105,111,110,32,111,102,32,73,110,
- 115,112,101,99,116,76,111,97,100,101,114,46,103,101,116,95,
-- 99,111,100,101,46,10,10,32,32,32,32,32,32,32,32,82,
-- 101,97,100,105,110,103,32,111,102,32,98,121,116,101,99,111,
-- 100,101,32,114,101,113,117,105,114,101,115,32,112,97,116,104,
-- 95,115,116,97,116,115,32,116,111,32,98,101,32,105,109,112,
-- 108,101,109,101,110,116,101,100,46,32,84,111,32,119,114,105,
-- 116,101,10,32,32,32,32,32,32,32,32,98,121,116,101,99,
-- 111,100,101,44,32,115,101,116,95,100,97,116,97,32,109,117,
-- 115,116,32,97,108,115,111,32,98,101,32,105,109,112,108,101,
-- 109,101,110,116,101,100,46,10,10,32,32,32,32,32,32,32,
-- 32,78,70,84,114,193,0,0,0,114,183,0,0,0,114,169,
-- 0,0,0,114,3,0,0,0,114,0,0,0,0,114,44,0,
-- 0,0,90,5,110,101,118,101,114,90,6,97,108,119,97,121,
-- 115,218,4,115,105,122,101,122,13,123,125,32,109,97,116,99,
-- 104,101,115,32,123,125,41,3,114,141,0,0,0,114,132,0,
-- 0,0,114,134,0,0,0,122,19,99,111,100,101,32,111,98,
-- 106,101,99,116,32,102,114,111,109,32,123,125,41,27,114,203,
-- 0,0,0,114,121,0,0,0,114,107,0,0,0,114,252,0,
-- 0,0,114,76,0,0,0,114,33,0,0,0,114,255,0,0,
-- 0,114,176,0,0,0,218,10,109,101,109,111,114,121,118,105,
-- 101,119,114,187,0,0,0,90,21,99,104,101,99,107,95,104,
-- 97,115,104,95,98,97,115,101,100,95,112,121,99,115,114,181,
-- 0,0,0,218,17,95,82,65,87,95,77,65,71,73,67,95,
-- 78,85,77,66,69,82,114,182,0,0,0,114,180,0,0,0,
-- 114,142,0,0,0,114,174,0,0,0,114,159,0,0,0,114,
-- 173,0,0,0,114,189,0,0,0,114,5,1,0,0,114,15,
-- 0,0,0,218,19,100,111,110,116,95,119,114,105,116,101,95,
-- 98,121,116,101,99,111,100,101,114,195,0,0,0,114,194,0,
-- 0,0,114,4,0,0,0,114,254,0,0,0,41,15,114,143,
-- 0,0,0,114,163,0,0,0,114,134,0,0,0,114,178,0,
-- 0,0,114,198,0,0,0,114,181,0,0,0,90,10,104,97,
-- 115,104,95,98,97,115,101,100,90,12,99,104,101,99,107,95,
-- 115,111,117,114,99,101,114,132,0,0,0,218,2,115,116,114,
-- 41,0,0,0,114,175,0,0,0,114,16,0,0,0,90,10,
-- 98,121,116,101,115,95,100,97,116,97,90,11,99,111,100,101,
-- 95,111,98,106,101,99,116,114,7,0,0,0,114,7,0,0,
-- 0,114,8,0,0,0,114,241,0,0,0,182,3,0,0,115,
-- 166,0,0,0,10,7,4,1,4,1,4,1,4,1,4,1,
-- 2,1,12,1,12,1,8,1,2,255,2,3,14,1,12,1,
-- 4,1,2,255,12,3,2,1,14,1,12,1,4,1,2,255,
-- 2,4,2,1,6,254,2,4,12,1,16,1,12,1,4,1,
-- 12,1,10,1,2,1,2,255,10,2,10,1,4,1,2,1,
-- 2,1,4,254,8,4,2,1,4,255,2,128,2,3,2,1,
-- 2,1,6,1,2,1,2,1,4,251,4,128,16,7,4,1,
-- 2,255,8,3,2,1,4,255,6,2,2,1,2,1,6,254,
-- 8,3,10,1,12,1,12,1,14,1,8,1,4,1,8,1,
-- 10,1,14,1,6,2,6,1,4,255,2,2,16,1,4,3,
-- 12,254,2,1,4,1,2,254,4,2,122,21,83,111,117,114,
-- 99,101,76,111,97,100,101,114,46,103,101,116,95,99,111,100,
-- 101,78,41,10,114,150,0,0,0,114,149,0,0,0,114,151,
-- 0,0,0,114,251,0,0,0,114,252,0,0,0,114,254,0,
-- 0,0,114,253,0,0,0,114,1,1,0,0,114,5,1,0,
-- 0,114,241,0,0,0,114,7,0,0,0,114,7,0,0,0,
-- 114,7,0,0,0,114,8,0,0,0,114,249,0,0,0,123,
-- 3,0,0,115,16,0,0,0,8,0,8,2,8,8,8,14,
-- 8,10,8,7,14,10,12,8,114,249,0,0,0,99,0,0,
-- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,
-- 0,0,0,0,0,0,115,92,0,0,0,101,0,90,1,100,
-- 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,
-- 4,100,5,132,0,90,5,100,6,100,7,132,0,90,6,101,
-- 7,135,0,102,1,100,8,100,9,132,8,131,1,90,8,101,
-- 7,100,10,100,11,132,0,131,1,90,9,100,12,100,13,132,
-- 0,90,10,101,7,100,14,100,15,132,0,131,1,90,11,135,
-- 0,4,0,90,12,83,0,41,16,218,10,70,105,108,101,76,
-- 111,97,100,101,114,122,103,66,97,115,101,32,102,105,108,101,
-- 32,108,111,97,100,101,114,32,99,108,97,115,115,32,119,104,
-- 105,99,104,32,105,109,112,108,101,109,101,110,116,115,32,116,
-- 104,101,32,108,111,97,100,101,114,32,112,114,111,116,111,99,
-- 111,108,32,109,101,116,104,111,100,115,32,116,104,97,116,10,
-- 32,32,32,32,114,101,113,117,105,114,101,32,102,105,108,101,
-- 32,115,121,115,116,101,109,32,117,115,97,103,101,46,99,3,
-- 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,
-- 0,0,0,67,0,0,0,115,16,0,0,0,124,1,124,0,
-- 95,0,124,2,124,0,95,1,100,1,83,0,41,2,122,75,
-- 67,97,99,104,101,32,116,104,101,32,109,111,100,117,108,101,
-- 32,110,97,109,101,32,97,110,100,32,116,104,101,32,112,97,
-- 116,104,32,116,111,32,116,104,101,32,102,105,108,101,32,102,
-- 111,117,110,100,32,98,121,32,116,104,101,10,32,32,32,32,
-- 32,32,32,32,102,105,110,100,101,114,46,78,114,183,0,0,
-- 0,41,3,114,143,0,0,0,114,163,0,0,0,114,65,0,
-- 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-- 0,114,236,0,0,0,16,4,0,0,115,4,0,0,0,6,
-- 3,10,1,122,19,70,105,108,101,76,111,97,100,101,114,46,
-- 95,95,105,110,105,116,95,95,99,2,0,0,0,0,0,0,
-- 0,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,
-- 0,243,24,0,0,0,124,0,106,0,124,1,106,0,107,2,
-- 111,11,124,0,106,1,124,1,106,1,107,2,83,0,114,69,
-- 0,0,0,169,2,218,9,95,95,99,108,97,115,115,95,95,
-- 114,156,0,0,0,169,2,114,143,0,0,0,90,5,111,116,
-- 104,101,114,114,7,0,0,0,114,7,0,0,0,114,8,0,
-- 0,0,218,6,95,95,101,113,95,95,22,4,0,0,243,6,
-- 0,0,0,12,1,10,1,2,255,122,17,70,105,108,101,76,
-- 111,97,100,101,114,46,95,95,101,113,95,95,99,1,0,0,
-- 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,
-- 0,67,0,0,0,243,20,0,0,0,116,0,124,0,106,1,
-- 131,1,116,0,124,0,106,2,131,1,65,0,83,0,114,69,
-- 0,0,0,169,3,218,4,104,97,115,104,114,141,0,0,0,
-- 114,65,0,0,0,169,1,114,143,0,0,0,114,7,0,0,
-- 0,114,7,0,0,0,114,8,0,0,0,218,8,95,95,104,
-- 97,115,104,95,95,26,4,0,0,243,2,0,0,0,20,1,
-- 122,19,70,105,108,101,76,111,97,100,101,114,46,95,95,104,
-- 97,115,104,95,95,99,2,0,0,0,0,0,0,0,0,0,
-- 0,0,2,0,0,0,3,0,0,0,3,0,0,0,115,16,
-- 0,0,0,116,0,116,1,124,0,131,2,160,2,124,1,161,
-- 1,83,0,41,1,122,100,76,111,97,100,32,97,32,109,111,
-- 100,117,108,101,32,102,114,111,109,32,97,32,102,105,108,101,
-- 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,
-- 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,
-- 97,116,101,100,46,32,32,85,115,101,32,101,120,101,99,95,
-- 109,111,100,117,108,101,40,41,32,105,110,115,116,101,97,100,
-- 46,10,10,32,32,32,32,32,32,32,32,41,3,218,5,115,
-- 117,112,101,114,114,11,1,0,0,114,248,0,0,0,114,247,
-- 0,0,0,169,1,114,14,1,0,0,114,7,0,0,0,114,
-- 8,0,0,0,114,248,0,0,0,29,4,0,0,115,2,0,
-- 0,0,16,10,122,22,70,105,108,101,76,111,97,100,101,114,
-- 46,108,111,97,100,95,109,111,100,117,108,101,99,2,0,0,
-- 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,
-- 0,67,0,0,0,243,6,0,0,0,124,0,106,0,83,0,
-- 169,1,122,58,82,101,116,117,114,110,32,116,104,101,32,112,
-- 97,116,104,32,116,111,32,116,104,101,32,115,111,117,114,99,
-- 101,32,102,105,108,101,32,97,115,32,102,111,117,110,100,32,
-- 98,121,32,116,104,101,32,102,105,110,100,101,114,46,114,71,
-- 0,0,0,114,247,0,0,0,114,7,0,0,0,114,7,0,
-- 0,0,114,8,0,0,0,114,203,0,0,0,41,4,0,0,
-- 243,2,0,0,0,6,3,122,23,70,105,108,101,76,111,97,
-- 100,101,114,46,103,101,116,95,102,105,108,101,110,97,109,101,
-- 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
-- 0,8,0,0,0,67,0,0,0,115,128,0,0,0,116,0,
-- 124,0,116,1,116,2,102,2,131,2,114,36,116,3,160,4,
-- 116,5,124,1,131,1,161,1,143,12,125,2,124,2,160,6,
-- 161,0,87,0,2,0,100,1,4,0,4,0,131,3,1,0,
-- 83,0,49,0,115,29,119,1,1,0,1,0,1,0,89,0,
-- 1,0,100,1,83,0,116,3,160,7,124,1,100,2,161,2,
-- 143,12,125,2,124,2,160,6,161,0,87,0,2,0,100,1,
-- 4,0,4,0,131,3,1,0,83,0,49,0,115,57,119,1,
-- 1,0,1,0,1,0,89,0,1,0,100,1,83,0,41,3,
-- 122,39,82,101,116,117,114,110,32,116,104,101,32,100,97,116,
-- 97,32,102,114,111,109,32,112,97,116,104,32,97,115,32,114,
-- 97,119,32,98,121,116,101,115,46,78,218,1,114,41,8,114,
-- 185,0,0,0,114,249,0,0,0,218,19,69,120,116,101,110,
-- 115,105,111,110,70,105,108,101,76,111,97,100,101,114,114,91,
-- 0,0,0,90,9,111,112,101,110,95,99,111,100,101,114,109,
-- 0,0,0,90,4,114,101,97,100,114,92,0,0,0,41,3,
-- 114,143,0,0,0,114,65,0,0,0,114,94,0,0,0,114,
-- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,255,
-- 0,0,0,46,4,0,0,115,14,0,0,0,14,2,16,1,
-- 6,1,36,255,14,3,6,1,36,255,122,19,70,105,108,101,
-- 76,111,97,100,101,114,46,103,101,116,95,100,97,116,97,99,
-- 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,
-- 2,0,0,0,67,0,0,0,115,20,0,0,0,100,1,100,
-- 2,108,0,109,1,125,2,1,0,124,2,124,0,131,1,83,
-- 0,41,3,78,114,0,0,0,0,41,1,218,10,70,105,108,
-- 101,82,101,97,100,101,114,41,2,218,17,105,109,112,111,114,
-- 116,108,105,98,46,114,101,97,100,101,114,115,114,31,1,0,
-- 0,41,3,114,143,0,0,0,114,244,0,0,0,114,31,1,
-- 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-- 0,218,19,103,101,116,95,114,101,115,111,117,114,99,101,95,
-- 114,101,97,100,101,114,55,4,0,0,115,4,0,0,0,12,
-- 2,8,1,122,30,70,105,108,101,76,111,97,100,101,114,46,
-- 103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,
-- 100,101,114,41,13,114,150,0,0,0,114,149,0,0,0,114,
-- 151,0,0,0,114,152,0,0,0,114,236,0,0,0,114,16,
-- 1,0,0,114,22,1,0,0,114,160,0,0,0,114,248,0,
-- 0,0,114,203,0,0,0,114,255,0,0,0,114,33,1,0,
-- 0,90,13,95,95,99,108,97,115,115,99,101,108,108,95,95,
-- 114,7,0,0,0,114,7,0,0,0,114,25,1,0,0,114,
-- 8,0,0,0,114,11,1,0,0,11,4,0,0,115,24,0,
-- 0,0,8,0,4,2,8,3,8,6,8,4,2,3,14,1,
-- 2,11,10,1,8,4,2,9,18,1,114,11,1,0,0,99,
-- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-- 3,0,0,0,64,0,0,0,115,46,0,0,0,101,0,90,
-- 1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,
-- 4,100,4,100,5,132,0,90,5,100,6,100,7,156,1,100,
-- 8,100,9,132,2,90,6,100,10,83,0,41,11,218,16,83,
-- 111,117,114,99,101,70,105,108,101,76,111,97,100,101,114,122,
-- 62,67,111,110,99,114,101,116,101,32,105,109,112,108,101,109,
-- 101,110,116,97,116,105,111,110,32,111,102,32,83,111,117,114,
-- 99,101,76,111,97,100,101,114,32,117,115,105,110,103,32,116,
-- 104,101,32,102,105,108,101,32,115,121,115,116,101,109,46,99,
-- 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,
-- 3,0,0,0,67,0,0,0,115,22,0,0,0,116,0,124,
-- 1,131,1,125,2,124,2,106,1,124,2,106,2,100,1,156,
-- 2,83,0,41,2,122,33,82,101,116,117,114,110,32,116,104,
-- 101,32,109,101,116,97,100,97,116,97,32,102,111,114,32,116,
-- 104,101,32,112,97,116,104,46,41,2,114,193,0,0,0,114,
-- 6,1,0,0,41,3,114,75,0,0,0,218,8,115,116,95,
-- 109,116,105,109,101,90,7,115,116,95,115,105,122,101,41,3,
-- 114,143,0,0,0,114,65,0,0,0,114,10,1,0,0,114,
-+ 115,111,117,114,99,101,46,122,39,115,111,117,114,99,101,32,
-+ 110,111,116,32,97,118,97,105,108,97,98,108,101,32,116,104,
-+ 114,111,117,103,104,32,103,101,116,95,100,97,116,97,40,41,
-+ 114,143,0,0,0,78,41,5,114,206,0,0,0,218,8,103,
-+ 101,116,95,100,97,116,97,114,79,0,0,0,114,145,0,0,
-+ 0,114,203,0,0,0,41,5,114,146,0,0,0,114,166,0,
-+ 0,0,114,68,0,0,0,114,201,0,0,0,218,3,101,120,
-+ 99,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-+ 218,10,103,101,116,95,115,111,117,114,99,101,164,3,0,0,
-+ 115,24,0,0,0,10,2,2,1,12,1,8,4,14,253,4,
-+ 1,2,1,4,255,2,1,2,255,8,128,2,255,122,23,83,
-+ 111,117,114,99,101,76,111,97,100,101,114,46,103,101,116,95,
-+ 115,111,117,114,99,101,114,133,0,0,0,41,1,218,9,95,
-+ 111,112,116,105,109,105,122,101,99,3,0,0,0,0,0,0,
-+ 0,1,0,0,0,4,0,0,0,8,0,0,0,67,0,0,
-+ 0,115,22,0,0,0,116,0,106,1,116,2,124,1,124,2,
-+ 100,1,100,2,124,3,100,3,141,6,83,0,41,4,122,130,
-+ 82,101,116,117,114,110,32,116,104,101,32,99,111,100,101,32,
-+ 111,98,106,101,99,116,32,99,111,109,112,105,108,101,100,32,
-+ 102,114,111,109,32,115,111,117,114,99,101,46,10,10,32,32,
-+ 32,32,32,32,32,32,84,104,101,32,39,100,97,116,97,39,
-+ 32,97,114,103,117,109,101,110,116,32,99,97,110,32,98,101,
-+ 32,97,110,121,32,111,98,106,101,99,116,32,116,121,112,101,
-+ 32,116,104,97,116,32,99,111,109,112,105,108,101,40,41,32,
-+ 115,117,112,112,111,114,116,115,46,10,32,32,32,32,32,32,
-+ 32,32,114,246,0,0,0,84,41,2,218,12,100,111,110,116,
-+ 95,105,110,104,101,114,105,116,114,111,0,0,0,41,3,114,
-+ 162,0,0,0,114,245,0,0,0,218,7,99,111,109,112,105,
-+ 108,101,41,4,114,146,0,0,0,114,44,0,0,0,114,68,
-+ 0,0,0,114,5,1,0,0,114,7,0,0,0,114,7,0,
-+ 0,0,114,8,0,0,0,218,14,115,111,117,114,99,101,95,
-+ 116,111,95,99,111,100,101,174,3,0,0,115,6,0,0,0,
-+ 12,5,4,1,6,255,122,27,83,111,117,114,99,101,76,111,
-+ 97,100,101,114,46,115,111,117,114,99,101,95,116,111,95,99,
-+ 111,100,101,99,2,0,0,0,0,0,0,0,0,0,0,0,
-+ 15,0,0,0,9,0,0,0,67,0,0,0,115,2,2,0,
-+ 0,124,0,160,0,124,1,161,1,125,2,100,1,125,3,100,
-+ 1,125,4,100,1,125,5,100,2,125,6,100,3,125,7,122,
-+ 6,116,1,124,2,131,1,125,8,87,0,110,11,4,0,116,
-+ 2,121,32,1,0,1,0,1,0,100,1,125,8,89,0,110,
-+ 144,119,0,122,7,124,0,160,3,124,2,161,1,125,9,87,
-+ 0,110,9,4,0,116,4,121,49,1,0,1,0,1,0,89,
-+ 0,110,127,119,0,116,5,124,9,100,4,25,0,131,1,125,
-+ 3,122,7,124,0,160,6,124,8,161,1,125,10,87,0,110,
-+ 9,4,0,116,4,121,72,1,0,1,0,1,0,89,0,110,
-+ 104,119,0,124,1,124,8,100,5,156,2,125,11,122,71,116,
-+ 7,124,10,124,1,124,11,131,3,125,12,116,8,124,10,131,
-+ 1,100,6,100,1,133,2,25,0,125,13,124,12,100,7,64,
-+ 0,100,8,107,3,125,6,124,6,114,138,124,12,100,9,64,
-+ 0,100,8,107,3,125,7,116,9,106,10,100,10,107,3,114,
-+ 137,124,7,115,119,116,9,106,10,100,11,107,2,114,137,124,
-+ 0,160,6,124,2,161,1,125,4,116,9,160,11,116,12,124,
-+ 4,161,2,125,5,116,13,124,10,124,5,124,1,124,11,131,
-+ 4,1,0,110,10,116,14,124,10,124,3,124,9,100,12,25,
-+ 0,124,1,124,11,131,5,1,0,87,0,110,11,4,0,116,
-+ 15,116,16,102,2,121,160,1,0,1,0,1,0,89,0,110,
-+ 16,119,0,116,17,160,18,100,13,124,8,124,2,161,3,1,
-+ 0,116,19,124,13,124,1,124,8,124,2,100,14,141,4,83,
-+ 0,124,4,100,1,117,0,114,185,124,0,160,6,124,2,161,
-+ 1,125,4,124,0,160,20,124,4,124,2,161,2,125,14,116,
-+ 17,160,18,100,15,124,2,161,2,1,0,116,21,106,22,115,
-+ 255,124,8,100,1,117,1,114,255,124,3,100,1,117,1,114,
-+ 255,124,6,114,226,124,5,100,1,117,0,114,219,116,9,160,
-+ 11,124,4,161,1,125,5,116,23,124,14,124,5,124,7,131,
-+ 3,125,10,110,8,116,24,124,14,124,3,116,25,124,4,131,
-+ 1,131,3,125,10,122,10,124,0,160,26,124,2,124,8,124,
-+ 10,161,3,1,0,87,0,124,14,83,0,4,0,116,2,121,
-+ 254,1,0,1,0,1,0,89,0,124,14,83,0,119,0,124,
-+ 14,83,0,41,16,122,190,67,111,110,99,114,101,116,101,32,
-+ 105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,
-+ 102,32,73,110,115,112,101,99,116,76,111,97,100,101,114,46,
-+ 103,101,116,95,99,111,100,101,46,10,10,32,32,32,32,32,
-+ 32,32,32,82,101,97,100,105,110,103,32,111,102,32,98,121,
-+ 116,101,99,111,100,101,32,114,101,113,117,105,114,101,115,32,
-+ 112,97,116,104,95,115,116,97,116,115,32,116,111,32,98,101,
-+ 32,105,109,112,108,101,109,101,110,116,101,100,46,32,84,111,
-+ 32,119,114,105,116,101,10,32,32,32,32,32,32,32,32,98,
-+ 121,116,101,99,111,100,101,44,32,115,101,116,95,100,97,116,
-+ 97,32,109,117,115,116,32,97,108,115,111,32,98,101,32,105,
-+ 109,112,108,101,109,101,110,116,101,100,46,10,10,32,32,32,
-+ 32,32,32,32,32,78,70,84,114,196,0,0,0,114,186,0,
-+ 0,0,114,172,0,0,0,114,3,0,0,0,114,0,0,0,
-+ 0,114,47,0,0,0,90,5,110,101,118,101,114,90,6,97,
-+ 108,119,97,121,115,218,4,115,105,122,101,122,13,123,125,32,
-+ 109,97,116,99,104,101,115,32,123,125,41,3,114,144,0,0,
-+ 0,114,135,0,0,0,114,137,0,0,0,122,19,99,111,100,
-+ 101,32,111,98,106,101,99,116,32,102,114,111,109,32,123,125,
-+ 41,27,114,206,0,0,0,114,124,0,0,0,114,110,0,0,
-+ 0,114,255,0,0,0,114,79,0,0,0,114,36,0,0,0,
-+ 114,2,1,0,0,114,179,0,0,0,218,10,109,101,109,111,
-+ 114,121,118,105,101,119,114,190,0,0,0,90,21,99,104,101,
-+ 99,107,95,104,97,115,104,95,98,97,115,101,100,95,112,121,
-+ 99,115,114,184,0,0,0,218,17,95,82,65,87,95,77,65,
-+ 71,73,67,95,78,85,77,66,69,82,114,185,0,0,0,114,
-+ 183,0,0,0,114,145,0,0,0,114,177,0,0,0,114,162,
-+ 0,0,0,114,176,0,0,0,114,192,0,0,0,114,8,1,
-+ 0,0,114,18,0,0,0,218,19,100,111,110,116,95,119,114,
-+ 105,116,101,95,98,121,116,101,99,111,100,101,114,198,0,0,
-+ 0,114,197,0,0,0,114,4,0,0,0,114,1,1,0,0,
-+ 41,15,114,146,0,0,0,114,166,0,0,0,114,137,0,0,
-+ 0,114,181,0,0,0,114,201,0,0,0,114,184,0,0,0,
-+ 90,10,104,97,115,104,95,98,97,115,101,100,90,12,99,104,
-+ 101,99,107,95,115,111,117,114,99,101,114,135,0,0,0,218,
-+ 2,115,116,114,44,0,0,0,114,178,0,0,0,114,19,0,
-+ 0,0,90,10,98,121,116,101,115,95,100,97,116,97,90,11,
-+ 99,111,100,101,95,111,98,106,101,99,116,114,7,0,0,0,
-+ 114,7,0,0,0,114,8,0,0,0,114,244,0,0,0,182,
-+ 3,0,0,115,166,0,0,0,10,7,4,1,4,1,4,1,
-+ 4,1,4,1,2,1,12,1,12,1,8,1,2,255,2,3,
-+ 14,1,12,1,4,1,2,255,12,3,2,1,14,1,12,1,
-+ 4,1,2,255,2,4,2,1,6,254,2,4,12,1,16,1,
-+ 12,1,4,1,12,1,10,1,2,1,2,255,10,2,10,1,
-+ 4,1,2,1,2,1,4,254,8,4,2,1,4,255,2,128,
-+ 2,3,2,1,2,1,6,1,2,1,2,1,4,251,4,128,
-+ 16,7,4,1,2,255,8,3,2,1,4,255,6,2,2,1,
-+ 2,1,6,254,8,3,10,1,12,1,12,1,14,1,8,1,
-+ 4,1,8,1,10,1,14,1,6,2,6,1,4,255,2,2,
-+ 16,1,4,3,12,254,2,1,4,1,2,254,4,2,122,21,
-+ 83,111,117,114,99,101,76,111,97,100,101,114,46,103,101,116,
-+ 95,99,111,100,101,78,41,10,114,153,0,0,0,114,152,0,
-+ 0,0,114,154,0,0,0,114,254,0,0,0,114,255,0,0,
-+ 0,114,1,1,0,0,114,0,1,0,0,114,4,1,0,0,
-+ 114,8,1,0,0,114,244,0,0,0,114,7,0,0,0,114,
- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,252,
-- 0,0,0,65,4,0,0,115,4,0,0,0,8,2,14,1,
-- 122,27,83,111,117,114,99,101,70,105,108,101,76,111,97,100,
-- 101,114,46,112,97,116,104,95,115,116,97,116,115,99,4,0,
-- 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,
-- 0,0,67,0,0,0,115,24,0,0,0,116,0,124,1,131,
-- 1,125,4,124,0,106,1,124,2,124,3,124,4,100,1,141,
-- 3,83,0,41,2,78,169,1,218,5,95,109,111,100,101,41,
-- 2,114,139,0,0,0,114,253,0,0,0,41,5,114,143,0,
-- 0,0,114,134,0,0,0,114,132,0,0,0,114,41,0,0,
-- 0,114,78,0,0,0,114,7,0,0,0,114,7,0,0,0,
-- 114,8,0,0,0,114,254,0,0,0,70,4,0,0,115,4,
-- 0,0,0,8,2,16,1,122,32,83,111,117,114,99,101,70,
-- 105,108,101,76,111,97,100,101,114,46,95,99,97,99,104,101,
-- 95,98,121,116,101,99,111,100,101,114,87,0,0,0,114,36,
-- 1,0,0,99,3,0,0,0,0,0,0,0,1,0,0,0,
-- 9,0,0,0,11,0,0,0,67,0,0,0,115,254,0,0,
-- 0,116,0,124,1,131,1,92,2,125,4,125,5,103,0,125,
-- 6,124,4,114,31,116,1,124,4,131,1,115,31,116,0,124,
-- 4,131,1,92,2,125,4,125,7,124,6,160,2,124,7,161,
-- 1,1,0,124,4,114,31,116,1,124,4,131,1,114,14,116,
-- 3,124,6,131,1,68,0,93,49,125,7,116,4,124,4,124,
-- 7,131,2,125,4,122,7,116,5,160,6,124,4,161,1,1,
-- 0,87,0,113,35,4,0,116,7,121,58,1,0,1,0,1,
-- 0,89,0,113,35,4,0,116,8,121,84,1,0,125,8,1,
-- 0,122,15,116,9,160,10,100,1,124,4,124,8,161,3,1,
-- 0,87,0,89,0,100,2,125,8,126,8,1,0,100,2,83,
-- 0,100,2,125,8,126,8,119,1,119,0,122,15,116,11,124,
-- 1,124,2,124,3,131,3,1,0,116,9,160,10,100,3,124,
-- 1,161,2,1,0,87,0,100,2,83,0,4,0,116,8,121,
-- 126,1,0,125,8,1,0,122,14,116,9,160,10,100,1,124,
-- 1,124,8,161,3,1,0,87,0,89,0,100,2,125,8,126,
-- 8,100,2,83,0,100,2,125,8,126,8,119,1,119,0,41,
-- 4,122,27,87,114,105,116,101,32,98,121,116,101,115,32,100,
-- 97,116,97,32,116,111,32,97,32,102,105,108,101,46,122,27,
-- 99,111,117,108,100,32,110,111,116,32,99,114,101,97,116,101,
-- 32,123,33,114,125,58,32,123,33,114,125,78,122,12,99,114,
-- 101,97,116,101,100,32,123,33,114,125,41,12,114,74,0,0,
-- 0,114,83,0,0,0,114,61,0,0,0,218,8,114,101,118,
-- 101,114,115,101,100,114,67,0,0,0,114,18,0,0,0,90,
-- 5,109,107,100,105,114,218,15,70,105,108,101,69,120,105,115,
-- 116,115,69,114,114,111,114,114,76,0,0,0,114,159,0,0,
-- 0,114,173,0,0,0,114,95,0,0,0,41,9,114,143,0,
-- 0,0,114,65,0,0,0,114,41,0,0,0,114,37,1,0,
-- 0,218,6,112,97,114,101,110,116,114,120,0,0,0,114,63,
-- 0,0,0,114,68,0,0,0,114,0,1,0,0,114,7,0,
-- 0,0,114,7,0,0,0,114,8,0,0,0,114,253,0,0,
-- 0,75,4,0,0,115,56,0,0,0,12,2,4,1,12,2,
-- 12,1,10,1,12,254,12,4,10,1,2,1,14,1,12,1,
-- 4,2,14,1,6,3,4,1,4,255,16,2,8,128,2,251,
-- 2,6,12,1,18,1,14,1,8,2,2,1,18,255,8,128,
-- 2,254,122,25,83,111,117,114,99,101,70,105,108,101,76,111,
-- 97,100,101,114,46,115,101,116,95,100,97,116,97,78,41,7,
-- 114,150,0,0,0,114,149,0,0,0,114,151,0,0,0,114,
-- 152,0,0,0,114,252,0,0,0,114,254,0,0,0,114,253,
-- 0,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,
-- 0,0,114,8,0,0,0,114,34,1,0,0,61,4,0,0,
-- 115,10,0,0,0,8,0,4,2,8,2,8,5,18,5,114,
-- 34,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,
-- 0,0,0,0,0,2,0,0,0,64,0,0,0,115,32,0,
-- 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,
-- 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,
-- 83,0,41,7,218,20,83,111,117,114,99,101,108,101,115,115,
-- 70,105,108,101,76,111,97,100,101,114,122,45,76,111,97,100,
-- 101,114,32,119,104,105,99,104,32,104,97,110,100,108,101,115,
-- 32,115,111,117,114,99,101,108,101,115,115,32,102,105,108,101,
-- 32,105,109,112,111,114,116,115,46,99,2,0,0,0,0,0,
-- 0,0,0,0,0,0,5,0,0,0,5,0,0,0,67,0,
-- 0,0,115,68,0,0,0,124,0,160,0,124,1,161,1,125,
-- 2,124,0,160,1,124,2,161,1,125,3,124,1,124,2,100,
-- 1,156,2,125,4,116,2,124,3,124,1,124,4,131,3,1,
-- 0,116,3,116,4,124,3,131,1,100,2,100,0,133,2,25,
-- 0,124,1,124,2,100,3,141,3,83,0,41,4,78,114,183,
-- 0,0,0,114,169,0,0,0,41,2,114,141,0,0,0,114,
-- 132,0,0,0,41,5,114,203,0,0,0,114,255,0,0,0,
-- 114,176,0,0,0,114,189,0,0,0,114,7,1,0,0,41,
-- 5,114,143,0,0,0,114,163,0,0,0,114,65,0,0,0,
-- 114,41,0,0,0,114,175,0,0,0,114,7,0,0,0,114,
-- 7,0,0,0,114,8,0,0,0,114,241,0,0,0,110,4,
-- 0,0,115,22,0,0,0,10,1,10,1,2,4,2,1,6,
-- 254,12,4,2,1,14,1,2,1,2,1,6,253,122,29,83,
-- 111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,
-- 100,101,114,46,103,101,116,95,99,111,100,101,99,2,0,0,
-- 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,
-- 0,67,0,0,0,114,23,0,0,0,41,2,122,39,82,101,
-- 116,117,114,110,32,78,111,110,101,32,97,115,32,116,104,101,
-- 114,101,32,105,115,32,110,111,32,115,111,117,114,99,101,32,
-- 99,111,100,101,46,78,114,7,0,0,0,114,247,0,0,0,
-- 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
-- 1,1,0,0,126,4,0,0,114,24,0,0,0,122,31,83,
-- 111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,
-- 100,101,114,46,103,101,116,95,115,111,117,114,99,101,78,41,
-- 6,114,150,0,0,0,114,149,0,0,0,114,151,0,0,0,
-- 114,152,0,0,0,114,241,0,0,0,114,1,1,0,0,114,
-- 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-- 0,0,0,114,41,1,0,0,106,4,0,0,115,8,0,0,
-- 0,8,0,4,2,8,2,12,16,114,41,1,0,0,99,0,
-- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,
-- 0,0,0,64,0,0,0,115,92,0,0,0,101,0,90,1,
-- 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,
-- 100,4,100,5,132,0,90,5,100,6,100,7,132,0,90,6,
-- 100,8,100,9,132,0,90,7,100,10,100,11,132,0,90,8,
-- 100,12,100,13,132,0,90,9,100,14,100,15,132,0,90,10,
-- 100,16,100,17,132,0,90,11,101,12,100,18,100,19,132,0,
-- 131,1,90,13,100,20,83,0,41,21,114,30,1,0,0,122,
-- 93,76,111,97,100,101,114,32,102,111,114,32,101,120,116,101,
-- 110,115,105,111,110,32,109,111,100,117,108,101,115,46,10,10,
-- 32,32,32,32,84,104,101,32,99,111,110,115,116,114,117,99,
-- 116,111,114,32,105,115,32,100,101,115,105,103,110,101,100,32,
-- 116,111,32,119,111,114,107,32,119,105,116,104,32,70,105,108,
-- 101,70,105,110,100,101,114,46,10,10,32,32,32,32,99,3,
-- 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,
-- 0,0,0,67,0,0,0,115,16,0,0,0,124,1,124,0,
-- 95,0,124,2,124,0,95,1,100,0,83,0,114,69,0,0,
-- 0,114,183,0,0,0,41,3,114,143,0,0,0,114,141,0,
-- 0,0,114,65,0,0,0,114,7,0,0,0,114,7,0,0,
-- 0,114,8,0,0,0,114,236,0,0,0,139,4,0,0,115,
-- 4,0,0,0,6,1,10,1,122,28,69,120,116,101,110,115,
-- 105,111,110,70,105,108,101,76,111,97,100,101,114,46,95,95,
-- 105,110,105,116,95,95,99,2,0,0,0,0,0,0,0,0,
-- 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,114,
-- 12,1,0,0,114,69,0,0,0,114,13,1,0,0,114,15,
-+ 0,0,0,123,3,0,0,115,16,0,0,0,8,0,8,2,
-+ 8,8,8,14,8,10,8,7,14,10,12,8,114,252,0,0,
-+ 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-+ 0,0,4,0,0,0,0,0,0,0,115,92,0,0,0,101,
-+ 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,
-+ 0,90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,
-+ 0,90,6,101,7,135,0,102,1,100,8,100,9,132,8,131,
-+ 1,90,8,101,7,100,10,100,11,132,0,131,1,90,9,100,
-+ 12,100,13,132,0,90,10,101,7,100,14,100,15,132,0,131,
-+ 1,90,11,135,0,4,0,90,12,83,0,41,16,218,10,70,
-+ 105,108,101,76,111,97,100,101,114,122,103,66,97,115,101,32,
-+ 102,105,108,101,32,108,111,97,100,101,114,32,99,108,97,115,
-+ 115,32,119,104,105,99,104,32,105,109,112,108,101,109,101,110,
-+ 116,115,32,116,104,101,32,108,111,97,100,101,114,32,112,114,
-+ 111,116,111,99,111,108,32,109,101,116,104,111,100,115,32,116,
-+ 104,97,116,10,32,32,32,32,114,101,113,117,105,114,101,32,
-+ 102,105,108,101,32,115,121,115,116,101,109,32,117,115,97,103,
-+ 101,46,99,3,0,0,0,0,0,0,0,0,0,0,0,3,
-+ 0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0,
-+ 124,1,124,0,95,0,124,2,124,0,95,1,100,1,83,0,
-+ 41,2,122,75,67,97,99,104,101,32,116,104,101,32,109,111,
-+ 100,117,108,101,32,110,97,109,101,32,97,110,100,32,116,104,
-+ 101,32,112,97,116,104,32,116,111,32,116,104,101,32,102,105,
-+ 108,101,32,102,111,117,110,100,32,98,121,32,116,104,101,10,
-+ 32,32,32,32,32,32,32,32,102,105,110,100,101,114,46,78,
-+ 114,186,0,0,0,41,3,114,146,0,0,0,114,166,0,0,
-+ 0,114,68,0,0,0,114,7,0,0,0,114,7,0,0,0,
-+ 114,8,0,0,0,114,239,0,0,0,16,4,0,0,115,4,
-+ 0,0,0,6,3,10,1,122,19,70,105,108,101,76,111,97,
-+ 100,101,114,46,95,95,105,110,105,116,95,95,99,2,0,0,
-+ 0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,
-+ 0,67,0,0,0,243,24,0,0,0,124,0,106,0,124,1,
-+ 106,0,107,2,111,11,124,0,106,1,124,1,106,1,107,2,
-+ 83,0,114,72,0,0,0,169,2,218,9,95,95,99,108,97,
-+ 115,115,95,95,114,159,0,0,0,169,2,114,146,0,0,0,
-+ 90,5,111,116,104,101,114,114,7,0,0,0,114,7,0,0,
-+ 0,114,8,0,0,0,218,6,95,95,101,113,95,95,22,4,
-+ 0,0,243,6,0,0,0,12,1,10,1,2,255,122,17,70,
-+ 105,108,101,76,111,97,100,101,114,46,95,95,101,113,95,95,
-+ 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
-+ 0,3,0,0,0,67,0,0,0,243,20,0,0,0,116,0,
-+ 124,0,106,1,131,1,116,0,124,0,106,2,131,1,65,0,
-+ 83,0,114,72,0,0,0,169,3,218,4,104,97,115,104,114,
-+ 144,0,0,0,114,68,0,0,0,169,1,114,146,0,0,0,
-+ 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,
-+ 8,95,95,104,97,115,104,95,95,26,4,0,0,243,2,0,
-+ 0,0,20,1,122,19,70,105,108,101,76,111,97,100,101,114,
-+ 46,95,95,104,97,115,104,95,95,99,2,0,0,0,0,0,
-+ 0,0,0,0,0,0,2,0,0,0,3,0,0,0,3,0,
-+ 0,0,115,16,0,0,0,116,0,116,1,124,0,131,2,160,
-+ 2,124,1,161,1,83,0,41,1,122,100,76,111,97,100,32,
-+ 97,32,109,111,100,117,108,101,32,102,114,111,109,32,97,32,
-+ 102,105,108,101,46,10,10,32,32,32,32,32,32,32,32,84,
-+ 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,
-+ 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,101,
-+ 120,101,99,95,109,111,100,117,108,101,40,41,32,105,110,115,
-+ 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,41,
-+ 3,218,5,115,117,112,101,114,114,14,1,0,0,114,251,0,
-+ 0,0,114,250,0,0,0,169,1,114,17,1,0,0,114,7,
-+ 0,0,0,114,8,0,0,0,114,251,0,0,0,29,4,0,
-+ 0,115,2,0,0,0,16,10,122,22,70,105,108,101,76,111,
-+ 97,100,101,114,46,108,111,97,100,95,109,111,100,117,108,101,
-+ 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
-+ 0,1,0,0,0,67,0,0,0,243,6,0,0,0,124,0,
-+ 106,0,83,0,169,1,122,58,82,101,116,117,114,110,32,116,
-+ 104,101,32,112,97,116,104,32,116,111,32,116,104,101,32,115,
-+ 111,117,114,99,101,32,102,105,108,101,32,97,115,32,102,111,
-+ 117,110,100,32,98,121,32,116,104,101,32,102,105,110,100,101,
-+ 114,46,114,74,0,0,0,114,250,0,0,0,114,7,0,0,
-+ 0,114,7,0,0,0,114,8,0,0,0,114,206,0,0,0,
-+ 41,4,0,0,243,2,0,0,0,6,3,122,23,70,105,108,
-+ 101,76,111,97,100,101,114,46,103,101,116,95,102,105,108,101,
-+ 110,97,109,101,99,2,0,0,0,0,0,0,0,0,0,0,
-+ 0,3,0,0,0,8,0,0,0,67,0,0,0,115,128,0,
-+ 0,0,116,0,124,0,116,1,116,2,102,2,131,2,114,36,
-+ 116,3,160,4,116,5,124,1,131,1,161,1,143,12,125,2,
-+ 124,2,160,6,161,0,87,0,2,0,100,1,4,0,4,0,
-+ 131,3,1,0,83,0,49,0,115,29,119,1,1,0,1,0,
-+ 1,0,89,0,1,0,100,1,83,0,116,3,160,7,124,1,
-+ 100,2,161,2,143,12,125,2,124,2,160,6,161,0,87,0,
-+ 2,0,100,1,4,0,4,0,131,3,1,0,83,0,49,0,
-+ 115,57,119,1,1,0,1,0,1,0,89,0,1,0,100,1,
-+ 83,0,41,3,122,39,82,101,116,117,114,110,32,116,104,101,
-+ 32,100,97,116,97,32,102,114,111,109,32,112,97,116,104,32,
-+ 97,115,32,114,97,119,32,98,121,116,101,115,46,78,218,1,
-+ 114,41,8,114,188,0,0,0,114,252,0,0,0,218,19,69,
-+ 120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,
-+ 101,114,114,94,0,0,0,90,9,111,112,101,110,95,99,111,
-+ 100,101,114,112,0,0,0,218,4,114,101,97,100,114,95,0,
-+ 0,0,41,3,114,146,0,0,0,114,68,0,0,0,114,97,
-+ 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-+ 0,0,114,2,1,0,0,46,4,0,0,115,14,0,0,0,
-+ 14,2,16,1,6,1,36,255,14,3,6,1,36,255,122,19,
-+ 70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,100,
-+ 97,116,97,99,2,0,0,0,0,0,0,0,0,0,0,0,
-+ 3,0,0,0,2,0,0,0,67,0,0,0,115,20,0,0,
-+ 0,100,1,100,2,108,0,109,1,125,2,1,0,124,2,124,
-+ 0,131,1,83,0,41,3,78,114,0,0,0,0,41,1,218,
-+ 10,70,105,108,101,82,101,97,100,101,114,41,2,218,17,105,
-+ 109,112,111,114,116,108,105,98,46,114,101,97,100,101,114,115,
-+ 114,35,1,0,0,41,3,114,146,0,0,0,114,247,0,0,
-+ 0,114,35,1,0,0,114,7,0,0,0,114,7,0,0,0,
-+ 114,8,0,0,0,218,19,103,101,116,95,114,101,115,111,117,
-+ 114,99,101,95,114,101,97,100,101,114,55,4,0,0,115,4,
-+ 0,0,0,12,2,8,1,122,30,70,105,108,101,76,111,97,
-+ 100,101,114,46,103,101,116,95,114,101,115,111,117,114,99,101,
-+ 95,114,101,97,100,101,114,41,13,114,153,0,0,0,114,152,
-+ 0,0,0,114,154,0,0,0,114,155,0,0,0,114,239,0,
-+ 0,0,114,19,1,0,0,114,25,1,0,0,114,163,0,0,
-+ 0,114,251,0,0,0,114,206,0,0,0,114,2,1,0,0,
-+ 114,37,1,0,0,90,13,95,95,99,108,97,115,115,99,101,
-+ 108,108,95,95,114,7,0,0,0,114,7,0,0,0,114,28,
-+ 1,0,0,114,8,0,0,0,114,14,1,0,0,11,4,0,
-+ 0,115,24,0,0,0,8,0,4,2,8,3,8,6,8,4,
-+ 2,3,14,1,2,11,10,1,8,4,2,9,18,1,114,14,
-+ 1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,
-+ 0,0,0,0,3,0,0,0,64,0,0,0,115,46,0,0,
-+ 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,
-+ 3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,
-+ 7,156,1,100,8,100,9,132,2,90,6,100,10,83,0,41,
-+ 11,218,16,83,111,117,114,99,101,70,105,108,101,76,111,97,
-+ 100,101,114,122,62,67,111,110,99,114,101,116,101,32,105,109,
-+ 112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,
-+ 83,111,117,114,99,101,76,111,97,100,101,114,32,117,115,105,
-+ 110,103,32,116,104,101,32,102,105,108,101,32,115,121,115,116,
-+ 101,109,46,99,2,0,0,0,0,0,0,0,0,0,0,0,
-+ 3,0,0,0,3,0,0,0,67,0,0,0,115,22,0,0,
-+ 0,116,0,124,1,131,1,125,2,124,2,106,1,124,2,106,
-+ 2,100,1,156,2,83,0,41,2,122,33,82,101,116,117,114,
-+ 110,32,116,104,101,32,109,101,116,97,100,97,116,97,32,102,
-+ 111,114,32,116,104,101,32,112,97,116,104,46,41,2,114,196,
-+ 0,0,0,114,9,1,0,0,41,3,114,78,0,0,0,218,
-+ 8,115,116,95,109,116,105,109,101,90,7,115,116,95,115,105,
-+ 122,101,41,3,114,146,0,0,0,114,68,0,0,0,114,13,
- 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-- 0,0,114,16,1,0,0,143,4,0,0,114,17,1,0,0,
-- 122,26,69,120,116,101,110,115,105,111,110,70,105,108,101,76,
-- 111,97,100,101,114,46,95,95,101,113,95,95,99,1,0,0,
-- 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,
-- 0,67,0,0,0,114,18,1,0,0,114,69,0,0,0,114,
-- 19,1,0,0,114,21,1,0,0,114,7,0,0,0,114,7,
-- 0,0,0,114,8,0,0,0,114,22,1,0,0,147,4,0,
-- 0,114,23,1,0,0,122,28,69,120,116,101,110,115,105,111,
-- 110,70,105,108,101,76,111,97,100,101,114,46,95,95,104,97,
-- 115,104,95,95,99,2,0,0,0,0,0,0,0,0,0,0,
-- 0,3,0,0,0,5,0,0,0,67,0,0,0,115,36,0,
-- 0,0,116,0,160,1,116,2,106,3,124,1,161,2,125,2,
-- 116,0,160,4,100,1,124,1,106,5,124,0,106,6,161,3,
-- 1,0,124,2,83,0,41,2,122,38,67,114,101,97,116,101,
-- 32,97,110,32,117,110,105,116,105,97,108,105,122,101,100,32,
-+ 0,0,114,255,0,0,0,65,4,0,0,115,4,0,0,0,
-+ 8,2,14,1,122,27,83,111,117,114,99,101,70,105,108,101,
-+ 76,111,97,100,101,114,46,112,97,116,104,95,115,116,97,116,
-+ 115,99,4,0,0,0,0,0,0,0,0,0,0,0,5,0,
-+ 0,0,5,0,0,0,67,0,0,0,115,24,0,0,0,116,
-+ 0,124,1,131,1,125,4,124,0,106,1,124,2,124,3,124,
-+ 4,100,1,141,3,83,0,41,2,78,169,1,218,5,95,109,
-+ 111,100,101,41,2,114,142,0,0,0,114,0,1,0,0,41,
-+ 5,114,146,0,0,0,114,137,0,0,0,114,135,0,0,0,
-+ 114,44,0,0,0,114,81,0,0,0,114,7,0,0,0,114,
-+ 7,0,0,0,114,8,0,0,0,114,1,1,0,0,70,4,
-+ 0,0,115,4,0,0,0,8,2,16,1,122,32,83,111,117,
-+ 114,99,101,70,105,108,101,76,111,97,100,101,114,46,95,99,
-+ 97,99,104,101,95,98,121,116,101,99,111,100,101,114,90,0,
-+ 0,0,114,40,1,0,0,99,3,0,0,0,0,0,0,0,
-+ 1,0,0,0,9,0,0,0,11,0,0,0,67,0,0,0,
-+ 115,254,0,0,0,116,0,124,1,131,1,92,2,125,4,125,
-+ 5,103,0,125,6,124,4,114,31,116,1,124,4,131,1,115,
-+ 31,116,0,124,4,131,1,92,2,125,4,125,7,124,6,160,
-+ 2,124,7,161,1,1,0,124,4,114,31,116,1,124,4,131,
-+ 1,114,14,116,3,124,6,131,1,68,0,93,49,125,7,116,
-+ 4,124,4,124,7,131,2,125,4,122,7,116,5,160,6,124,
-+ 4,161,1,1,0,87,0,113,35,4,0,116,7,121,58,1,
-+ 0,1,0,1,0,89,0,113,35,4,0,116,8,121,84,1,
-+ 0,125,8,1,0,122,15,116,9,160,10,100,1,124,4,124,
-+ 8,161,3,1,0,87,0,89,0,100,2,125,8,126,8,1,
-+ 0,100,2,83,0,100,2,125,8,126,8,119,1,119,0,122,
-+ 15,116,11,124,1,124,2,124,3,131,3,1,0,116,9,160,
-+ 10,100,3,124,1,161,2,1,0,87,0,100,2,83,0,4,
-+ 0,116,8,121,126,1,0,125,8,1,0,122,14,116,9,160,
-+ 10,100,1,124,1,124,8,161,3,1,0,87,0,89,0,100,
-+ 2,125,8,126,8,100,2,83,0,100,2,125,8,126,8,119,
-+ 1,119,0,41,4,122,27,87,114,105,116,101,32,98,121,116,
-+ 101,115,32,100,97,116,97,32,116,111,32,97,32,102,105,108,
-+ 101,46,122,27,99,111,117,108,100,32,110,111,116,32,99,114,
-+ 101,97,116,101,32,123,33,114,125,58,32,123,33,114,125,78,
-+ 122,12,99,114,101,97,116,101,100,32,123,33,114,125,41,12,
-+ 114,77,0,0,0,114,86,0,0,0,114,64,0,0,0,218,
-+ 8,114,101,118,101,114,115,101,100,114,70,0,0,0,114,21,
-+ 0,0,0,90,5,109,107,100,105,114,218,15,70,105,108,101,
-+ 69,120,105,115,116,115,69,114,114,111,114,114,79,0,0,0,
-+ 114,162,0,0,0,114,176,0,0,0,114,98,0,0,0,41,
-+ 9,114,146,0,0,0,114,68,0,0,0,114,44,0,0,0,
-+ 114,41,1,0,0,218,6,112,97,114,101,110,116,114,123,0,
-+ 0,0,114,66,0,0,0,114,71,0,0,0,114,3,1,0,
-+ 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-+ 114,0,1,0,0,75,4,0,0,115,56,0,0,0,12,2,
-+ 4,1,12,2,12,1,10,1,12,254,12,4,10,1,2,1,
-+ 14,1,12,1,4,2,14,1,6,3,4,1,4,255,16,2,
-+ 8,128,2,251,2,6,12,1,18,1,14,1,8,2,2,1,
-+ 18,255,8,128,2,254,122,25,83,111,117,114,99,101,70,105,
-+ 108,101,76,111,97,100,101,114,46,115,101,116,95,100,97,116,
-+ 97,78,41,7,114,153,0,0,0,114,152,0,0,0,114,154,
-+ 0,0,0,114,155,0,0,0,114,255,0,0,0,114,1,1,
-+ 0,0,114,0,1,0,0,114,7,0,0,0,114,7,0,0,
-+ 0,114,7,0,0,0,114,8,0,0,0,114,38,1,0,0,
-+ 61,4,0,0,115,10,0,0,0,8,0,4,2,8,2,8,
-+ 5,18,5,114,38,1,0,0,99,0,0,0,0,0,0,0,
-+ 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0,
-+ 0,115,32,0,0,0,101,0,90,1,100,0,90,2,100,1,
-+ 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,
-+ 90,5,100,6,83,0,41,7,218,20,83,111,117,114,99,101,
-+ 108,101,115,115,70,105,108,101,76,111,97,100,101,114,122,45,
-+ 76,111,97,100,101,114,32,119,104,105,99,104,32,104,97,110,
-+ 100,108,101,115,32,115,111,117,114,99,101,108,101,115,115,32,
-+ 102,105,108,101,32,105,109,112,111,114,116,115,46,99,2,0,
-+ 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,
-+ 0,0,67,0,0,0,115,68,0,0,0,124,0,160,0,124,
-+ 1,161,1,125,2,124,0,160,1,124,2,161,1,125,3,124,
-+ 1,124,2,100,1,156,2,125,4,116,2,124,3,124,1,124,
-+ 4,131,3,1,0,116,3,116,4,124,3,131,1,100,2,100,
-+ 0,133,2,25,0,124,1,124,2,100,3,141,3,83,0,41,
-+ 4,78,114,186,0,0,0,114,172,0,0,0,41,2,114,144,
-+ 0,0,0,114,135,0,0,0,41,5,114,206,0,0,0,114,
-+ 2,1,0,0,114,179,0,0,0,114,192,0,0,0,114,10,
-+ 1,0,0,41,5,114,146,0,0,0,114,166,0,0,0,114,
-+ 68,0,0,0,114,44,0,0,0,114,178,0,0,0,114,7,
-+ 0,0,0,114,7,0,0,0,114,8,0,0,0,114,244,0,
-+ 0,0,110,4,0,0,115,22,0,0,0,10,1,10,1,2,
-+ 4,2,1,6,254,12,4,2,1,14,1,2,1,2,1,6,
-+ 253,122,29,83,111,117,114,99,101,108,101,115,115,70,105,108,
-+ 101,76,111,97,100,101,114,46,103,101,116,95,99,111,100,101,
-+ 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
-+ 0,1,0,0,0,67,0,0,0,114,26,0,0,0,41,2,
-+ 122,39,82,101,116,117,114,110,32,78,111,110,101,32,97,115,
-+ 32,116,104,101,114,101,32,105,115,32,110,111,32,115,111,117,
-+ 114,99,101,32,99,111,100,101,46,78,114,7,0,0,0,114,
-+ 250,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-+ 0,0,0,114,4,1,0,0,126,4,0,0,114,27,0,0,
-+ 0,122,31,83,111,117,114,99,101,108,101,115,115,70,105,108,
-+ 101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,
-+ 99,101,78,41,6,114,153,0,0,0,114,152,0,0,0,114,
-+ 154,0,0,0,114,155,0,0,0,114,244,0,0,0,114,4,
-+ 1,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,
-+ 0,0,114,8,0,0,0,114,45,1,0,0,106,4,0,0,
-+ 115,8,0,0,0,8,0,4,2,8,2,12,16,114,45,1,
-+ 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,
-+ 0,0,0,3,0,0,0,64,0,0,0,115,92,0,0,0,
-+ 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,
-+ 132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7,
-+ 132,0,90,6,100,8,100,9,132,0,90,7,100,10,100,11,
-+ 132,0,90,8,100,12,100,13,132,0,90,9,100,14,100,15,
-+ 132,0,90,10,100,16,100,17,132,0,90,11,101,12,100,18,
-+ 100,19,132,0,131,1,90,13,100,20,83,0,41,21,114,33,
-+ 1,0,0,122,93,76,111,97,100,101,114,32,102,111,114,32,
- 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,
-- 122,38,101,120,116,101,110,115,105,111,110,32,109,111,100,117,
-- 108,101,32,123,33,114,125,32,108,111,97,100,101,100,32,102,
-- 114,111,109,32,123,33,114,125,41,7,114,159,0,0,0,114,
-- 242,0,0,0,114,187,0,0,0,90,14,99,114,101,97,116,
-- 101,95,100,121,110,97,109,105,99,114,173,0,0,0,114,141,
-- 0,0,0,114,65,0,0,0,41,3,114,143,0,0,0,114,
-- 210,0,0,0,114,244,0,0,0,114,7,0,0,0,114,7,
-- 0,0,0,114,8,0,0,0,114,239,0,0,0,150,4,0,
-- 0,115,14,0,0,0,4,2,6,1,4,255,6,2,8,1,
-- 4,255,4,2,122,33,69,120,116,101,110,115,105,111,110,70,
-- 105,108,101,76,111,97,100,101,114,46,99,114,101,97,116,101,
-- 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,
-- 0,0,0,0,2,0,0,0,5,0,0,0,67,0,0,0,
-- 115,36,0,0,0,116,0,160,1,116,2,106,3,124,1,161,
-- 2,1,0,116,0,160,4,100,1,124,0,106,5,124,0,106,
-- 6,161,3,1,0,100,2,83,0,41,3,122,30,73,110,105,
-- 116,105,97,108,105,122,101,32,97,110,32,101,120,116,101,110,
-- 115,105,111,110,32,109,111,100,117,108,101,122,40,101,120,116,
-- 101,110,115,105,111,110,32,109,111,100,117,108,101,32,123,33,
-- 114,125,32,101,120,101,99,117,116,101,100,32,102,114,111,109,
-- 32,123,33,114,125,78,41,7,114,159,0,0,0,114,242,0,
-- 0,0,114,187,0,0,0,90,12,101,120,101,99,95,100,121,
-- 110,97,109,105,99,114,173,0,0,0,114,141,0,0,0,114,
-- 65,0,0,0,169,2,114,143,0,0,0,114,244,0,0,0,
-- 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
-- 245,0,0,0,158,4,0,0,115,8,0,0,0,14,2,6,
-- 1,8,1,8,255,122,31,69,120,116,101,110,115,105,111,110,
-- 70,105,108,101,76,111,97,100,101,114,46,101,120,101,99,95,
-- 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,
-- 0,0,0,2,0,0,0,4,0,0,0,3,0,0,0,115,
-- 36,0,0,0,116,0,124,0,106,1,131,1,100,1,25,0,
-- 137,0,116,2,135,0,102,1,100,2,100,3,132,8,116,3,
-- 68,0,131,1,131,1,83,0,41,4,122,49,82,101,116,117,
-- 114,110,32,84,114,117,101,32,105,102,32,116,104,101,32,101,
-- 120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,
-- 105,115,32,97,32,112,97,99,107,97,103,101,46,114,3,0,
-- 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,
-- 0,0,0,4,0,0,0,51,0,0,0,115,28,0,0,0,
-- 129,0,124,0,93,9,125,1,136,0,100,0,124,1,23,0,
-- 107,2,86,0,1,0,113,2,100,1,83,0,41,2,114,236,
-- 0,0,0,78,114,7,0,0,0,169,2,114,5,0,0,0,
-- 218,6,115,117,102,102,105,120,169,1,90,9,102,105,108,101,
-- 95,110,97,109,101,114,7,0,0,0,114,8,0,0,0,114,
-- 9,0,0,0,167,4,0,0,115,8,0,0,0,2,128,4,
-- 0,2,1,20,255,122,49,69,120,116,101,110,115,105,111,110,
-- 70,105,108,101,76,111,97,100,101,114,46,105,115,95,112,97,
-- 99,107,97,103,101,46,60,108,111,99,97,108,115,62,46,60,
-- 103,101,110,101,120,112,114,62,41,4,114,74,0,0,0,114,
-- 65,0,0,0,218,3,97,110,121,114,232,0,0,0,114,247,
-- 0,0,0,114,7,0,0,0,114,45,1,0,0,114,8,0,
-- 0,0,114,206,0,0,0,164,4,0,0,115,8,0,0,0,
-- 14,2,12,1,2,1,8,255,122,30,69,120,116,101,110,115,
-- 105,111,110,70,105,108,101,76,111,97,100,101,114,46,105,115,
-- 95,112,97,99,107,97,103,101,99,2,0,0,0,0,0,0,
-- 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,
-- 0,114,23,0,0,0,41,2,122,63,82,101,116,117,114,110,
-- 32,78,111,110,101,32,97,115,32,97,110,32,101,120,116,101,
-- 110,115,105,111,110,32,109,111,100,117,108,101,32,99,97,110,
-- 110,111,116,32,99,114,101,97,116,101,32,97,32,99,111,100,
-- 101,32,111,98,106,101,99,116,46,78,114,7,0,0,0,114,
-+ 115,46,10,10,32,32,32,32,84,104,101,32,99,111,110,115,
-+ 116,114,117,99,116,111,114,32,105,115,32,100,101,115,105,103,
-+ 110,101,100,32,116,111,32,119,111,114,107,32,119,105,116,104,
-+ 32,70,105,108,101,70,105,110,100,101,114,46,10,10,32,32,
-+ 32,32,99,3,0,0,0,0,0,0,0,0,0,0,0,3,
-+ 0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0,
-+ 124,1,124,0,95,0,124,2,124,0,95,1,100,0,83,0,
-+ 114,72,0,0,0,114,186,0,0,0,41,3,114,146,0,0,
-+ 0,114,144,0,0,0,114,68,0,0,0,114,7,0,0,0,
-+ 114,7,0,0,0,114,8,0,0,0,114,239,0,0,0,139,
-+ 4,0,0,115,4,0,0,0,6,1,10,1,122,28,69,120,
-+ 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,
-+ 114,46,95,95,105,110,105,116,95,95,99,2,0,0,0,0,
-+ 0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,67,
-+ 0,0,0,114,15,1,0,0,114,72,0,0,0,114,16,1,
-+ 0,0,114,18,1,0,0,114,7,0,0,0,114,7,0,0,
-+ 0,114,8,0,0,0,114,19,1,0,0,143,4,0,0,114,
-+ 20,1,0,0,122,26,69,120,116,101,110,115,105,111,110,70,
-+ 105,108,101,76,111,97,100,101,114,46,95,95,101,113,95,95,
-+ 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
-+ 0,3,0,0,0,67,0,0,0,114,21,1,0,0,114,72,
-+ 0,0,0,114,22,1,0,0,114,24,1,0,0,114,7,0,
-+ 0,0,114,7,0,0,0,114,8,0,0,0,114,25,1,0,
-+ 0,147,4,0,0,114,26,1,0,0,122,28,69,120,116,101,
-+ 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,
-+ 95,95,104,97,115,104,95,95,99,2,0,0,0,0,0,0,
-+ 0,0,0,0,0,3,0,0,0,5,0,0,0,67,0,0,
-+ 0,115,36,0,0,0,116,0,160,1,116,2,106,3,124,1,
-+ 161,2,125,2,116,0,160,4,100,1,124,1,106,5,124,0,
-+ 106,6,161,3,1,0,124,2,83,0,41,2,122,38,67,114,
-+ 101,97,116,101,32,97,110,32,117,110,105,116,105,97,108,105,
-+ 122,101,100,32,101,120,116,101,110,115,105,111,110,32,109,111,
-+ 100,117,108,101,122,38,101,120,116,101,110,115,105,111,110,32,
-+ 109,111,100,117,108,101,32,123,33,114,125,32,108,111,97,100,
-+ 101,100,32,102,114,111,109,32,123,33,114,125,41,7,114,162,
-+ 0,0,0,114,245,0,0,0,114,190,0,0,0,218,14,99,
-+ 114,101,97,116,101,95,100,121,110,97,109,105,99,114,176,0,
-+ 0,0,114,144,0,0,0,114,68,0,0,0,41,3,114,146,
-+ 0,0,0,114,213,0,0,0,114,247,0,0,0,114,7,0,
-+ 0,0,114,7,0,0,0,114,8,0,0,0,114,242,0,0,
-+ 0,150,4,0,0,115,14,0,0,0,4,2,6,1,4,255,
-+ 6,2,8,1,4,255,4,2,122,33,69,120,116,101,110,115,
-+ 105,111,110,70,105,108,101,76,111,97,100,101,114,46,99,114,
-+ 101,97,116,101,95,109,111,100,117,108,101,99,2,0,0,0,
-+ 0,0,0,0,0,0,0,0,2,0,0,0,5,0,0,0,
-+ 67,0,0,0,115,36,0,0,0,116,0,160,1,116,2,106,
-+ 3,124,1,161,2,1,0,116,0,160,4,100,1,124,0,106,
-+ 5,124,0,106,6,161,3,1,0,100,2,83,0,41,3,122,
-+ 30,73,110,105,116,105,97,108,105,122,101,32,97,110,32,101,
-+ 120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,122,
-+ 40,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,
-+ 101,32,123,33,114,125,32,101,120,101,99,117,116,101,100,32,
-+ 102,114,111,109,32,123,33,114,125,78,41,7,114,162,0,0,
-+ 0,114,245,0,0,0,114,190,0,0,0,90,12,101,120,101,
-+ 99,95,100,121,110,97,109,105,99,114,176,0,0,0,114,144,
-+ 0,0,0,114,68,0,0,0,169,2,114,146,0,0,0,114,
- 247,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-- 0,0,0,114,241,0,0,0,170,4,0,0,114,24,0,0,
-- 0,122,28,69,120,116,101,110,115,105,111,110,70,105,108,101,
-- 76,111,97,100,101,114,46,103,101,116,95,99,111,100,101,99,
-- 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,
-- 1,0,0,0,67,0,0,0,114,23,0,0,0,41,2,122,
-- 53,82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,
-+ 0,0,0,114,248,0,0,0,158,4,0,0,115,8,0,0,
-+ 0,14,2,6,1,8,1,8,255,122,31,69,120,116,101,110,
-+ 115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,101,
-+ 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0,
-+ 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,3,
-+ 0,0,0,115,36,0,0,0,116,0,124,0,106,1,131,1,
-+ 100,1,25,0,137,0,116,2,135,0,102,1,100,2,100,3,
-+ 132,8,116,3,68,0,131,1,131,1,83,0,41,4,122,49,
-+ 82,101,116,117,114,110,32,84,114,117,101,32,105,102,32,116,
-+ 104,101,32,101,120,116,101,110,115,105,111,110,32,109,111,100,
-+ 117,108,101,32,105,115,32,97,32,112,97,99,107,97,103,101,
-+ 46,114,3,0,0,0,99,1,0,0,0,0,0,0,0,0,
-+ 0,0,0,2,0,0,0,4,0,0,0,51,0,0,0,115,
-+ 28,0,0,0,129,0,124,0,93,9,125,1,136,0,100,0,
-+ 124,1,23,0,107,2,86,0,1,0,113,2,100,1,83,0,
-+ 41,2,114,239,0,0,0,78,114,7,0,0,0,169,2,114,
-+ 5,0,0,0,218,6,115,117,102,102,105,120,169,1,90,9,
-+ 102,105,108,101,95,110,97,109,101,114,7,0,0,0,114,8,
-+ 0,0,0,114,9,0,0,0,167,4,0,0,115,8,0,0,
-+ 0,2,128,4,0,2,1,20,255,122,49,69,120,116,101,110,
-+ 115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,105,
-+ 115,95,112,97,99,107,97,103,101,46,60,108,111,99,97,108,
-+ 115,62,46,60,103,101,110,101,120,112,114,62,41,4,114,77,
-+ 0,0,0,114,68,0,0,0,218,3,97,110,121,114,235,0,
-+ 0,0,114,250,0,0,0,114,7,0,0,0,114,50,1,0,
-+ 0,114,8,0,0,0,114,209,0,0,0,164,4,0,0,115,
-+ 8,0,0,0,14,2,12,1,2,1,8,255,122,30,69,120,
-+ 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,
-+ 114,46,105,115,95,112,97,99,107,97,103,101,99,2,0,0,
-+ 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,
-+ 0,67,0,0,0,114,26,0,0,0,41,2,122,63,82,101,
-+ 116,117,114,110,32,78,111,110,101,32,97,115,32,97,110,32,
- 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,
-- 115,32,104,97,118,101,32,110,111,32,115,111,117,114,99,101,
-- 32,99,111,100,101,46,78,114,7,0,0,0,114,247,0,0,
-- 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-- 114,1,1,0,0,174,4,0,0,114,24,0,0,0,122,30,
-- 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,
-- 100,101,114,46,103,101,116,95,115,111,117,114,99,101,99,2,
-- 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,
-- 0,0,0,67,0,0,0,114,26,1,0,0,114,27,1,0,
-- 0,114,71,0,0,0,114,247,0,0,0,114,7,0,0,0,
-- 114,7,0,0,0,114,8,0,0,0,114,203,0,0,0,178,
-- 4,0,0,114,28,1,0,0,122,32,69,120,116,101,110,115,
-- 105,111,110,70,105,108,101,76,111,97,100,101,114,46,103,101,
-- 116,95,102,105,108,101,110,97,109,101,78,41,14,114,150,0,
-- 0,0,114,149,0,0,0,114,151,0,0,0,114,152,0,0,
-- 0,114,236,0,0,0,114,16,1,0,0,114,22,1,0,0,
-- 114,239,0,0,0,114,245,0,0,0,114,206,0,0,0,114,
-- 241,0,0,0,114,1,1,0,0,114,160,0,0,0,114,203,
-- 0,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,
-- 0,0,114,8,0,0,0,114,30,1,0,0,131,4,0,0,
-- 115,24,0,0,0,8,0,4,2,8,6,8,4,8,4,8,
-- 3,8,8,8,6,8,6,8,4,2,4,14,1,114,30,1,
-- 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,
-- 0,0,0,2,0,0,0,64,0,0,0,115,108,0,0,0,
-- 101,0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,
-- 100,3,100,4,132,0,90,5,100,5,100,6,132,0,90,6,
-- 100,7,100,8,132,0,90,7,100,9,100,10,132,0,90,8,
-- 100,11,100,12,132,0,90,9,100,13,100,14,132,0,90,10,
-- 100,15,100,16,132,0,90,11,100,17,100,18,132,0,90,12,
-- 100,19,100,20,132,0,90,13,100,21,100,22,132,0,90,14,
-- 100,23,100,24,132,0,90,15,100,25,83,0,41,26,218,14,
-- 95,78,97,109,101,115,112,97,99,101,80,97,116,104,97,38,
-- 1,0,0,82,101,112,114,101,115,101,110,116,115,32,97,32,
-- 110,97,109,101,115,112,97,99,101,32,112,97,99,107,97,103,
-- 101,39,115,32,112,97,116,104,46,32,32,73,116,32,117,115,
-- 101,115,32,116,104,101,32,109,111,100,117,108,101,32,110,97,
-- 109,101,10,32,32,32,32,116,111,32,102,105,110,100,32,105,
-- 116,115,32,112,97,114,101,110,116,32,109,111,100,117,108,101,
-- 44,32,97,110,100,32,102,114,111,109,32,116,104,101,114,101,
-- 32,105,116,32,108,111,111,107,115,32,117,112,32,116,104,101,
-- 32,112,97,114,101,110,116,39,115,10,32,32,32,32,95,95,
-- 112,97,116,104,95,95,46,32,32,87,104,101,110,32,116,104,
-- 105,115,32,99,104,97,110,103,101,115,44,32,116,104,101,32,
-- 109,111,100,117,108,101,39,115,32,111,119,110,32,112,97,116,
-- 104,32,105,115,32,114,101,99,111,109,112,117,116,101,100,44,
-- 10,32,32,32,32,117,115,105,110,103,32,112,97,116,104,95,
-- 102,105,110,100,101,114,46,32,32,70,111,114,32,116,111,112,
-- 45,108,101,118,101,108,32,109,111,100,117,108,101,115,44,32,
-- 116,104,101,32,112,97,114,101,110,116,32,109,111,100,117,108,
-- 101,39,115,32,112,97,116,104,10,32,32,32,32,105,115,32,
-- 115,121,115,46,112,97,116,104,46,114,0,0,0,0,99,4,
-- 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,3,
-- 0,0,0,67,0,0,0,115,44,0,0,0,124,1,124,0,
-- 95,0,124,2,124,0,95,1,116,2,124,0,160,3,161,0,
-- 131,1,124,0,95,4,124,0,106,5,124,0,95,6,124,3,
-- 124,0,95,7,100,0,83,0,114,69,0,0,0,41,8,218,
-- 5,95,110,97,109,101,218,5,95,112,97,116,104,114,136,0,
-- 0,0,218,16,95,103,101,116,95,112,97,114,101,110,116,95,
-- 112,97,116,104,218,17,95,108,97,115,116,95,112,97,114,101,
-- 110,116,95,112,97,116,104,218,6,95,101,112,111,99,104,218,
-- 11,95,108,97,115,116,95,101,112,111,99,104,218,12,95,112,
-- 97,116,104,95,102,105,110,100,101,114,169,4,114,143,0,0,
-- 0,114,141,0,0,0,114,65,0,0,0,90,11,112,97,116,
-- 104,95,102,105,110,100,101,114,114,7,0,0,0,114,7,0,
-- 0,0,114,8,0,0,0,114,236,0,0,0,195,4,0,0,
-- 115,10,0,0,0,6,1,6,1,14,1,8,1,10,1,122,
-- 23,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,
-- 95,95,105,110,105,116,95,95,99,1,0,0,0,0,0,0,
-- 0,0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,
-- 0,115,38,0,0,0,124,0,106,0,160,1,100,1,161,1,
-- 92,3,125,1,125,2,125,3,124,2,100,2,107,2,114,15,
-- 100,3,83,0,124,1,100,4,102,2,83,0,41,5,122,62,
-- 82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,32,
-- 111,102,32,40,112,97,114,101,110,116,45,109,111,100,117,108,
-- 101,45,110,97,109,101,44,32,112,97,114,101,110,116,45,112,
-- 97,116,104,45,97,116,116,114,45,110,97,109,101,41,114,97,
-- 0,0,0,114,10,0,0,0,41,2,114,15,0,0,0,114,
-- 65,0,0,0,90,8,95,95,112,97,116,104,95,95,41,2,
-- 114,48,1,0,0,114,104,0,0,0,41,4,114,143,0,0,
-- 0,114,40,1,0,0,218,3,100,111,116,90,2,109,101,114,
-- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,23,
-- 95,102,105,110,100,95,112,97,114,101,110,116,95,112,97,116,
-- 104,95,110,97,109,101,115,202,4,0,0,115,8,0,0,0,
-- 18,2,8,1,4,2,8,3,122,38,95,78,97,109,101,115,
-- 112,97,99,101,80,97,116,104,46,95,102,105,110,100,95,112,
-- 97,114,101,110,116,95,112,97,116,104,95,110,97,109,101,115,
-- 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
-- 0,3,0,0,0,67,0,0,0,115,28,0,0,0,124,0,
-- 160,0,161,0,92,2,125,1,125,2,116,1,116,2,106,3,
-- 124,1,25,0,124,2,131,2,83,0,114,69,0,0,0,41,
-- 4,114,57,1,0,0,114,155,0,0,0,114,15,0,0,0,
-- 218,7,109,111,100,117,108,101,115,41,3,114,143,0,0,0,
-- 90,18,112,97,114,101,110,116,95,109,111,100,117,108,101,95,
-- 110,97,109,101,90,14,112,97,116,104,95,97,116,116,114,95,
-- 110,97,109,101,114,7,0,0,0,114,7,0,0,0,114,8,
-- 0,0,0,114,50,1,0,0,212,4,0,0,115,4,0,0,
-- 0,12,1,16,1,122,31,95,78,97,109,101,115,112,97,99,
-- 101,80,97,116,104,46,95,103,101,116,95,112,97,114,101,110,
-- 116,95,112,97,116,104,99,1,0,0,0,0,0,0,0,0,
-- 0,0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,
-- 100,0,0,0,116,0,124,0,160,1,161,0,131,1,125,1,
-- 124,1,124,0,106,2,107,3,115,17,124,0,106,3,124,0,
-- 106,4,107,3,114,47,124,0,160,5,124,0,106,6,124,1,
-- 161,2,125,2,124,2,100,0,117,1,114,40,124,2,106,7,
-- 100,0,117,0,114,40,124,2,106,8,114,40,124,2,106,8,
-- 124,0,95,9,124,1,124,0,95,2,124,0,106,3,124,0,
-- 95,4,124,0,106,9,83,0,114,69,0,0,0,41,10,114,
-- 136,0,0,0,114,50,1,0,0,114,51,1,0,0,114,52,
-- 1,0,0,114,53,1,0,0,114,54,1,0,0,114,48,1,
-- 0,0,114,164,0,0,0,114,202,0,0,0,114,49,1,0,
-- 0,41,3,114,143,0,0,0,90,11,112,97,114,101,110,116,
-- 95,112,97,116,104,114,210,0,0,0,114,7,0,0,0,114,
-- 7,0,0,0,114,8,0,0,0,218,12,95,114,101,99,97,
-- 108,99,117,108,97,116,101,216,4,0,0,115,18,0,0,0,
-- 12,2,22,1,14,1,18,3,6,1,8,1,6,1,8,1,
-- 6,1,122,27,95,78,97,109,101,115,112,97,99,101,80,97,
-- 116,104,46,95,114,101,99,97,108,99,117,108,97,116,101,99,
-+ 32,99,97,110,110,111,116,32,99,114,101,97,116,101,32,97,
-+ 32,99,111,100,101,32,111,98,106,101,99,116,46,78,114,7,
-+ 0,0,0,114,250,0,0,0,114,7,0,0,0,114,7,0,
-+ 0,0,114,8,0,0,0,114,244,0,0,0,170,4,0,0,
-+ 114,27,0,0,0,122,28,69,120,116,101,110,115,105,111,110,
-+ 70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,99,
-+ 111,100,101,99,2,0,0,0,0,0,0,0,0,0,0,0,
-+ 2,0,0,0,1,0,0,0,67,0,0,0,114,26,0,0,
-+ 0,41,2,122,53,82,101,116,117,114,110,32,78,111,110,101,
-+ 32,97,115,32,101,120,116,101,110,115,105,111,110,32,109,111,
-+ 100,117,108,101,115,32,104,97,118,101,32,110,111,32,115,111,
-+ 117,114,99,101,32,99,111,100,101,46,78,114,7,0,0,0,
-+ 114,250,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
-+ 8,0,0,0,114,4,1,0,0,174,4,0,0,114,27,0,
-+ 0,0,122,30,69,120,116,101,110,115,105,111,110,70,105,108,
-+ 101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,
-+ 99,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
-+ 0,0,0,1,0,0,0,67,0,0,0,114,29,1,0,0,
-+ 114,30,1,0,0,114,74,0,0,0,114,250,0,0,0,114,
-+ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,206,
-+ 0,0,0,178,4,0,0,114,31,1,0,0,122,32,69,120,
-+ 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,
-+ 114,46,103,101,116,95,102,105,108,101,110,97,109,101,78,41,
-+ 14,114,153,0,0,0,114,152,0,0,0,114,154,0,0,0,
-+ 114,155,0,0,0,114,239,0,0,0,114,19,1,0,0,114,
-+ 25,1,0,0,114,242,0,0,0,114,248,0,0,0,114,209,
-+ 0,0,0,114,244,0,0,0,114,4,1,0,0,114,163,0,
-+ 0,0,114,206,0,0,0,114,7,0,0,0,114,7,0,0,
-+ 0,114,7,0,0,0,114,8,0,0,0,114,33,1,0,0,
-+ 131,4,0,0,115,24,0,0,0,8,0,4,2,8,6,8,
-+ 4,8,4,8,3,8,8,8,6,8,6,8,4,2,4,14,
-+ 1,114,33,1,0,0,99,0,0,0,0,0,0,0,0,0,
-+ 0,0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,
-+ 108,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,
-+ 100,2,90,4,100,3,100,4,132,0,90,5,100,5,100,6,
-+ 132,0,90,6,100,7,100,8,132,0,90,7,100,9,100,10,
-+ 132,0,90,8,100,11,100,12,132,0,90,9,100,13,100,14,
-+ 132,0,90,10,100,15,100,16,132,0,90,11,100,17,100,18,
-+ 132,0,90,12,100,19,100,20,132,0,90,13,100,21,100,22,
-+ 132,0,90,14,100,23,100,24,132,0,90,15,100,25,83,0,
-+ 41,26,218,14,95,78,97,109,101,115,112,97,99,101,80,97,
-+ 116,104,97,38,1,0,0,82,101,112,114,101,115,101,110,116,
-+ 115,32,97,32,110,97,109,101,115,112,97,99,101,32,112,97,
-+ 99,107,97,103,101,39,115,32,112,97,116,104,46,32,32,73,
-+ 116,32,117,115,101,115,32,116,104,101,32,109,111,100,117,108,
-+ 101,32,110,97,109,101,10,32,32,32,32,116,111,32,102,105,
-+ 110,100,32,105,116,115,32,112,97,114,101,110,116,32,109,111,
-+ 100,117,108,101,44,32,97,110,100,32,102,114,111,109,32,116,
-+ 104,101,114,101,32,105,116,32,108,111,111,107,115,32,117,112,
-+ 32,116,104,101,32,112,97,114,101,110,116,39,115,10,32,32,
-+ 32,32,95,95,112,97,116,104,95,95,46,32,32,87,104,101,
-+ 110,32,116,104,105,115,32,99,104,97,110,103,101,115,44,32,
-+ 116,104,101,32,109,111,100,117,108,101,39,115,32,111,119,110,
-+ 32,112,97,116,104,32,105,115,32,114,101,99,111,109,112,117,
-+ 116,101,100,44,10,32,32,32,32,117,115,105,110,103,32,112,
-+ 97,116,104,95,102,105,110,100,101,114,46,32,32,70,111,114,
-+ 32,116,111,112,45,108,101,118,101,108,32,109,111,100,117,108,
-+ 101,115,44,32,116,104,101,32,112,97,114,101,110,116,32,109,
-+ 111,100,117,108,101,39,115,32,112,97,116,104,10,32,32,32,
-+ 32,105,115,32,115,121,115,46,112,97,116,104,46,114,0,0,
-+ 0,0,99,4,0,0,0,0,0,0,0,0,0,0,0,4,
-+ 0,0,0,3,0,0,0,67,0,0,0,115,44,0,0,0,
-+ 124,1,124,0,95,0,124,2,124,0,95,1,116,2,124,0,
-+ 160,3,161,0,131,1,124,0,95,4,124,0,106,5,124,0,
-+ 95,6,124,3,124,0,95,7,100,0,83,0,114,72,0,0,
-+ 0,41,8,218,5,95,110,97,109,101,218,5,95,112,97,116,
-+ 104,114,139,0,0,0,218,16,95,103,101,116,95,112,97,114,
-+ 101,110,116,95,112,97,116,104,218,17,95,108,97,115,116,95,
-+ 112,97,114,101,110,116,95,112,97,116,104,218,6,95,101,112,
-+ 111,99,104,218,11,95,108,97,115,116,95,101,112,111,99,104,
-+ 218,12,95,112,97,116,104,95,102,105,110,100,101,114,169,4,
-+ 114,146,0,0,0,114,144,0,0,0,114,68,0,0,0,90,
-+ 11,112,97,116,104,95,102,105,110,100,101,114,114,7,0,0,
-+ 0,114,7,0,0,0,114,8,0,0,0,114,239,0,0,0,
-+ 195,4,0,0,115,10,0,0,0,6,1,6,1,14,1,8,
-+ 1,10,1,122,23,95,78,97,109,101,115,112,97,99,101,80,
-+ 97,116,104,46,95,95,105,110,105,116,95,95,99,1,0,0,
-+ 0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,
-+ 0,67,0,0,0,115,38,0,0,0,124,0,106,0,160,1,
-+ 100,1,161,1,92,3,125,1,125,2,125,3,124,2,100,2,
-+ 107,2,114,15,100,3,83,0,124,1,100,4,102,2,83,0,
-+ 41,5,122,62,82,101,116,117,114,110,115,32,97,32,116,117,
-+ 112,108,101,32,111,102,32,40,112,97,114,101,110,116,45,109,
-+ 111,100,117,108,101,45,110,97,109,101,44,32,112,97,114,101,
-+ 110,116,45,112,97,116,104,45,97,116,116,114,45,110,97,109,
-+ 101,41,114,100,0,0,0,114,10,0,0,0,41,2,114,18,
-+ 0,0,0,114,68,0,0,0,90,8,95,95,112,97,116,104,
-+ 95,95,41,2,114,53,1,0,0,114,107,0,0,0,41,4,
-+ 114,146,0,0,0,114,44,1,0,0,218,3,100,111,116,90,
-+ 2,109,101,114,7,0,0,0,114,7,0,0,0,114,8,0,
-+ 0,0,218,23,95,102,105,110,100,95,112,97,114,101,110,116,
-+ 95,112,97,116,104,95,110,97,109,101,115,202,4,0,0,115,
-+ 8,0,0,0,18,2,8,1,4,2,8,3,122,38,95,78,
-+ 97,109,101,115,112,97,99,101,80,97,116,104,46,95,102,105,
-+ 110,100,95,112,97,114,101,110,116,95,112,97,116,104,95,110,
-+ 97,109,101,115,99,1,0,0,0,0,0,0,0,0,0,0,
-+ 0,3,0,0,0,3,0,0,0,67,0,0,0,115,28,0,
-+ 0,0,124,0,160,0,161,0,92,2,125,1,125,2,116,1,
-+ 116,2,106,3,124,1,25,0,124,2,131,2,83,0,114,72,
-+ 0,0,0,41,4,114,62,1,0,0,114,158,0,0,0,114,
-+ 18,0,0,0,218,7,109,111,100,117,108,101,115,41,3,114,
-+ 146,0,0,0,90,18,112,97,114,101,110,116,95,109,111,100,
-+ 117,108,101,95,110,97,109,101,90,14,112,97,116,104,95,97,
-+ 116,116,114,95,110,97,109,101,114,7,0,0,0,114,7,0,
-+ 0,0,114,8,0,0,0,114,55,1,0,0,212,4,0,0,
-+ 115,4,0,0,0,12,1,16,1,122,31,95,78,97,109,101,
-+ 115,112,97,99,101,80,97,116,104,46,95,103,101,116,95,112,
-+ 97,114,101,110,116,95,112,97,116,104,99,1,0,0,0,0,
-+ 0,0,0,0,0,0,0,3,0,0,0,4,0,0,0,67,
-+ 0,0,0,115,100,0,0,0,116,0,124,0,160,1,161,0,
-+ 131,1,125,1,124,1,124,0,106,2,107,3,115,17,124,0,
-+ 106,3,124,0,106,4,107,3,114,47,124,0,160,5,124,0,
-+ 106,6,124,1,161,2,125,2,124,2,100,0,117,1,114,40,
-+ 124,2,106,7,100,0,117,0,114,40,124,2,106,8,114,40,
-+ 124,2,106,8,124,0,95,9,124,1,124,0,95,2,124,0,
-+ 106,3,124,0,95,4,124,0,106,9,83,0,114,72,0,0,
-+ 0,41,10,114,139,0,0,0,114,55,1,0,0,114,56,1,
-+ 0,0,114,57,1,0,0,114,58,1,0,0,114,59,1,0,
-+ 0,114,53,1,0,0,114,167,0,0,0,114,205,0,0,0,
-+ 114,54,1,0,0,41,3,114,146,0,0,0,90,11,112,97,
-+ 114,101,110,116,95,112,97,116,104,114,213,0,0,0,114,7,
-+ 0,0,0,114,7,0,0,0,114,8,0,0,0,218,12,95,
-+ 114,101,99,97,108,99,117,108,97,116,101,216,4,0,0,115,
-+ 18,0,0,0,12,2,22,1,14,1,18,3,6,1,8,1,
-+ 6,1,8,1,6,1,122,27,95,78,97,109,101,115,112,97,
-+ 99,101,80,97,116,104,46,95,114,101,99,97,108,99,117,108,
-+ 97,116,101,99,1,0,0,0,0,0,0,0,0,0,0,0,
-+ 1,0,0,0,3,0,0,0,67,0,0,0,243,12,0,0,
-+ 0,116,0,124,0,160,1,161,0,131,1,83,0,114,72,0,
-+ 0,0,41,2,218,4,105,116,101,114,114,64,1,0,0,114,
-+ 24,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-+ 0,0,0,218,8,95,95,105,116,101,114,95,95,230,4,0,
-+ 0,243,2,0,0,0,12,1,122,23,95,78,97,109,101,115,
-+ 112,97,99,101,80,97,116,104,46,95,95,105,116,101,114,95,
-+ 95,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,
-+ 0,0,2,0,0,0,67,0,0,0,115,12,0,0,0,124,
-+ 0,160,0,161,0,124,1,25,0,83,0,114,72,0,0,0,
-+ 169,1,114,64,1,0,0,41,2,114,146,0,0,0,218,5,
-+ 105,110,100,101,120,114,7,0,0,0,114,7,0,0,0,114,
-+ 8,0,0,0,218,11,95,95,103,101,116,105,116,101,109,95,
-+ 95,233,4,0,0,114,68,1,0,0,122,26,95,78,97,109,
-+ 101,115,112,97,99,101,80,97,116,104,46,95,95,103,101,116,
-+ 105,116,101,109,95,95,99,3,0,0,0,0,0,0,0,0,
-+ 0,0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,
-+ 14,0,0,0,124,2,124,0,106,0,124,1,60,0,100,0,
-+ 83,0,114,72,0,0,0,41,1,114,54,1,0,0,41,3,
-+ 114,146,0,0,0,114,70,1,0,0,114,68,0,0,0,114,
-+ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,
-+ 95,95,115,101,116,105,116,101,109,95,95,236,4,0,0,115,
-+ 2,0,0,0,14,1,122,26,95,78,97,109,101,115,112,97,
-+ 99,101,80,97,116,104,46,95,95,115,101,116,105,116,101,109,
-+ 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1,
-+ 0,0,0,3,0,0,0,67,0,0,0,114,65,1,0,0,
-+ 114,72,0,0,0,41,2,114,4,0,0,0,114,64,1,0,
-+ 0,114,24,1,0,0,114,7,0,0,0,114,7,0,0,0,
-+ 114,8,0,0,0,218,7,95,95,108,101,110,95,95,239,4,
-+ 0,0,114,68,1,0,0,122,22,95,78,97,109,101,115,112,
-+ 97,99,101,80,97,116,104,46,95,95,108,101,110,95,95,99,
- 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
-- 3,0,0,0,67,0,0,0,243,12,0,0,0,116,0,124,
-- 0,160,1,161,0,131,1,83,0,114,69,0,0,0,41,2,
-- 218,4,105,116,101,114,114,59,1,0,0,114,21,1,0,0,
-- 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,
-- 8,95,95,105,116,101,114,95,95,230,4,0,0,243,2,0,
-- 0,0,12,1,122,23,95,78,97,109,101,115,112,97,99,101,
-- 80,97,116,104,46,95,95,105,116,101,114,95,95,99,2,0,
-- 0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,
-- 0,0,67,0,0,0,115,12,0,0,0,124,0,160,0,161,
-- 0,124,1,25,0,83,0,114,69,0,0,0,169,1,114,59,
-- 1,0,0,41,2,114,143,0,0,0,218,5,105,110,100,101,
-- 120,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-- 218,11,95,95,103,101,116,105,116,101,109,95,95,233,4,0,
-- 0,114,63,1,0,0,122,26,95,78,97,109,101,115,112,97,
-- 99,101,80,97,116,104,46,95,95,103,101,116,105,116,101,109,
-- 95,95,99,3,0,0,0,0,0,0,0,0,0,0,0,3,
-- 0,0,0,3,0,0,0,67,0,0,0,115,14,0,0,0,
-- 124,2,124,0,106,0,124,1,60,0,100,0,83,0,114,69,
-- 0,0,0,41,1,114,49,1,0,0,41,3,114,143,0,0,
-- 0,114,65,1,0,0,114,65,0,0,0,114,7,0,0,0,
-- 114,7,0,0,0,114,8,0,0,0,218,11,95,95,115,101,
-- 116,105,116,101,109,95,95,236,4,0,0,115,2,0,0,0,
-- 14,1,122,26,95,78,97,109,101,115,112,97,99,101,80,97,
-- 116,104,46,95,95,115,101,116,105,116,101,109,95,95,99,1,
-- 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,
-- 0,0,0,67,0,0,0,114,60,1,0,0,114,69,0,0,
-- 0,41,2,114,4,0,0,0,114,59,1,0,0,114,21,1,
-- 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-- 0,218,7,95,95,108,101,110,95,95,239,4,0,0,114,63,
-- 1,0,0,122,22,95,78,97,109,101,115,112,97,99,101,80,
-- 97,116,104,46,95,95,108,101,110,95,95,99,1,0,0,0,
-- 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,
-- 67,0,0,0,243,12,0,0,0,100,1,160,0,124,0,106,
-- 1,161,1,83,0,41,2,78,122,20,95,78,97,109,101,115,
-- 112,97,99,101,80,97,116,104,40,123,33,114,125,41,41,2,
-- 114,89,0,0,0,114,49,1,0,0,114,21,1,0,0,114,
-- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,8,
-- 95,95,114,101,112,114,95,95,242,4,0,0,114,63,1,0,
-- 0,122,23,95,78,97,109,101,115,112,97,99,101,80,97,116,
-- 104,46,95,95,114,101,112,114,95,95,99,2,0,0,0,0,
-- 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67,
-- 0,0,0,115,12,0,0,0,124,1,124,0,160,0,161,0,
-- 118,0,83,0,114,69,0,0,0,114,64,1,0,0,169,2,
-- 114,143,0,0,0,218,4,105,116,101,109,114,7,0,0,0,
-- 114,7,0,0,0,114,8,0,0,0,218,12,95,95,99,111,
-- 110,116,97,105,110,115,95,95,245,4,0,0,114,63,1,0,
-- 0,122,27,95,78,97,109,101,115,112,97,99,101,80,97,116,
-- 104,46,95,95,99,111,110,116,97,105,110,115,95,95,99,2,
-+ 3,0,0,0,67,0,0,0,243,12,0,0,0,100,1,160,
-+ 0,124,0,106,1,161,1,83,0,41,2,78,122,20,95,78,
-+ 97,109,101,115,112,97,99,101,80,97,116,104,40,123,33,114,
-+ 125,41,41,2,114,92,0,0,0,114,54,1,0,0,114,24,
-+ 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-+ 0,0,218,8,95,95,114,101,112,114,95,95,242,4,0,0,
-+ 114,68,1,0,0,122,23,95,78,97,109,101,115,112,97,99,
-+ 101,80,97,116,104,46,95,95,114,101,112,114,95,95,99,2,
- 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,
-- 0,0,0,67,0,0,0,115,16,0,0,0,124,0,106,0,
-- 160,1,124,1,161,1,1,0,100,0,83,0,114,69,0,0,
-- 0,41,2,114,49,1,0,0,114,61,0,0,0,114,71,1,
-+ 0,0,0,67,0,0,0,115,12,0,0,0,124,1,124,0,
-+ 160,0,161,0,118,0,83,0,114,72,0,0,0,114,69,1,
-+ 0,0,169,2,114,146,0,0,0,218,4,105,116,101,109,114,
-+ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,12,
-+ 95,95,99,111,110,116,97,105,110,115,95,95,245,4,0,0,
-+ 114,68,1,0,0,122,27,95,78,97,109,101,115,112,97,99,
-+ 101,80,97,116,104,46,95,95,99,111,110,116,97,105,110,115,
-+ 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
-+ 0,0,0,3,0,0,0,67,0,0,0,115,16,0,0,0,
-+ 124,0,106,0,160,1,124,1,161,1,1,0,100,0,83,0,
-+ 114,72,0,0,0,41,2,114,54,1,0,0,114,64,0,0,
-+ 0,114,76,1,0,0,114,7,0,0,0,114,7,0,0,0,
-+ 114,8,0,0,0,114,64,0,0,0,248,4,0,0,243,2,
-+ 0,0,0,16,1,122,21,95,78,97,109,101,115,112,97,99,
-+ 101,80,97,116,104,46,97,112,112,101,110,100,78,41,16,114,
-+ 153,0,0,0,114,152,0,0,0,114,154,0,0,0,114,155,
-+ 0,0,0,114,57,1,0,0,114,239,0,0,0,114,62,1,
-+ 0,0,114,55,1,0,0,114,64,1,0,0,114,67,1,0,
-+ 0,114,71,1,0,0,114,72,1,0,0,114,73,1,0,0,
-+ 114,75,1,0,0,114,78,1,0,0,114,64,0,0,0,114,
-+ 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-+ 0,0,0,114,52,1,0,0,184,4,0,0,115,28,0,0,
-+ 0,8,0,4,1,4,8,8,2,8,7,8,10,8,4,8,
-+ 14,8,3,8,3,8,3,8,3,8,3,12,3,114,52,1,
-+ 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,
-+ 0,0,0,3,0,0,0,64,0,0,0,115,88,0,0,0,
-+ 101,0,90,1,100,0,90,2,100,1,100,2,132,0,90,3,
-+ 101,4,100,3,100,4,132,0,131,1,90,5,100,5,100,6,
-+ 132,0,90,6,100,7,100,8,132,0,90,7,100,9,100,10,
-+ 132,0,90,8,100,11,100,12,132,0,90,9,100,13,100,14,
-+ 132,0,90,10,100,15,100,16,132,0,90,11,100,17,100,18,
-+ 132,0,90,12,100,19,83,0,41,20,218,16,95,78,97,109,
-+ 101,115,112,97,99,101,76,111,97,100,101,114,99,4,0,0,
-+ 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,
-+ 0,67,0,0,0,115,18,0,0,0,116,0,124,1,124,2,
-+ 124,3,131,3,124,0,95,1,100,0,83,0,114,72,0,0,
-+ 0,41,2,114,52,1,0,0,114,54,1,0,0,114,60,1,
- 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-- 0,114,61,0,0,0,248,4,0,0,243,2,0,0,0,16,
-- 1,122,21,95,78,97,109,101,115,112,97,99,101,80,97,116,
-- 104,46,97,112,112,101,110,100,78,41,16,114,150,0,0,0,
-- 114,149,0,0,0,114,151,0,0,0,114,152,0,0,0,114,
-- 52,1,0,0,114,236,0,0,0,114,57,1,0,0,114,50,
-- 1,0,0,114,59,1,0,0,114,62,1,0,0,114,66,1,
-- 0,0,114,67,1,0,0,114,68,1,0,0,114,70,1,0,
-- 0,114,73,1,0,0,114,61,0,0,0,114,7,0,0,0,
-+ 0,114,239,0,0,0,254,4,0,0,115,2,0,0,0,18,
-+ 1,122,25,95,78,97,109,101,115,112,97,99,101,76,111,97,
-+ 100,101,114,46,95,95,105,110,105,116,95,95,99,1,0,0,
-+ 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,
-+ 0,67,0,0,0,115,24,0,0,0,116,0,160,1,100,1,
-+ 116,2,161,2,1,0,100,2,160,3,124,0,106,4,161,1,
-+ 83,0,41,3,122,115,82,101,116,117,114,110,32,114,101,112,
-+ 114,32,102,111,114,32,116,104,101,32,109,111,100,117,108,101,
-+ 46,10,10,32,32,32,32,32,32,32,32,84,104,101,32,109,
-+ 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,
-+ 116,101,100,46,32,32,84,104,101,32,105,109,112,111,114,116,
-+ 32,109,97,99,104,105,110,101,114,121,32,100,111,101,115,32,
-+ 116,104,101,32,106,111,98,32,105,116,115,101,108,102,46,10,
-+ 10,32,32,32,32,32,32,32,32,122,82,95,78,97,109,101,
-+ 115,112,97,99,101,76,111,97,100,101,114,46,109,111,100,117,
-+ 108,101,95,114,101,112,114,40,41,32,105,115,32,100,101,112,
-+ 114,101,99,97,116,101,100,32,97,110,100,32,115,108,97,116,
-+ 101,100,32,102,111,114,32,114,101,109,111,118,97,108,32,105,
-+ 110,32,80,121,116,104,111,110,32,51,46,49,50,122,25,60,
-+ 109,111,100,117,108,101,32,123,33,114,125,32,40,110,97,109,
-+ 101,115,112,97,99,101,41,62,41,5,114,102,0,0,0,114,
-+ 103,0,0,0,114,104,0,0,0,114,92,0,0,0,114,153,
-+ 0,0,0,41,1,114,247,0,0,0,114,7,0,0,0,114,
-+ 7,0,0,0,114,8,0,0,0,218,11,109,111,100,117,108,
-+ 101,95,114,101,112,114,1,5,0,0,115,8,0,0,0,6,
-+ 7,2,1,4,255,12,2,122,28,95,78,97,109,101,115,112,
-+ 97,99,101,76,111,97,100,101,114,46,109,111,100,117,108,101,
-+ 95,114,101,112,114,99,2,0,0,0,0,0,0,0,0,0,
-+ 0,0,2,0,0,0,1,0,0,0,67,0,0,0,114,26,
-+ 0,0,0,41,2,78,84,114,7,0,0,0,114,250,0,0,
-+ 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-+ 114,209,0,0,0,12,5,0,0,243,2,0,0,0,4,1,
-+ 122,27,95,78,97,109,101,115,112,97,99,101,76,111,97,100,
-+ 101,114,46,105,115,95,112,97,99,107,97,103,101,99,2,0,
-+ 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,
-+ 0,0,67,0,0,0,114,26,0,0,0,41,2,78,114,10,
-+ 0,0,0,114,7,0,0,0,114,250,0,0,0,114,7,0,
-+ 0,0,114,7,0,0,0,114,8,0,0,0,114,4,1,0,
-+ 0,15,5,0,0,114,82,1,0,0,122,27,95,78,97,109,
-+ 101,115,112,97,99,101,76,111,97,100,101,114,46,103,101,116,
-+ 95,115,111,117,114,99,101,99,2,0,0,0,0,0,0,0,
-+ 0,0,0,0,2,0,0,0,6,0,0,0,67,0,0,0,
-+ 115,16,0,0,0,116,0,100,1,100,2,100,3,100,4,100,
-+ 5,141,4,83,0,41,6,78,114,10,0,0,0,122,8,60,
-+ 115,116,114,105,110,103,62,114,246,0,0,0,84,41,1,114,
-+ 6,1,0,0,41,1,114,7,1,0,0,114,250,0,0,0,
- 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
-- 47,1,0,0,184,4,0,0,115,28,0,0,0,8,0,4,
-- 1,4,8,8,2,8,7,8,10,8,4,8,14,8,3,8,
-- 3,8,3,8,3,8,3,12,3,114,47,1,0,0,99,0,
-- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,
-- 0,0,0,64,0,0,0,115,88,0,0,0,101,0,90,1,
-- 100,0,90,2,100,1,100,2,132,0,90,3,101,4,100,3,
-- 100,4,132,0,131,1,90,5,100,5,100,6,132,0,90,6,
-- 100,7,100,8,132,0,90,7,100,9,100,10,132,0,90,8,
-- 100,11,100,12,132,0,90,9,100,13,100,14,132,0,90,10,
-- 100,15,100,16,132,0,90,11,100,17,100,18,132,0,90,12,
-- 100,19,83,0,41,20,218,16,95,78,97,109,101,115,112,97,
-- 99,101,76,111,97,100,101,114,99,4,0,0,0,0,0,0,
-- 0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,
-- 0,115,18,0,0,0,116,0,124,1,124,2,124,3,131,3,
-- 124,0,95,1,100,0,83,0,114,69,0,0,0,41,2,114,
-- 47,1,0,0,114,49,1,0,0,114,55,1,0,0,114,7,
-- 0,0,0,114,7,0,0,0,114,8,0,0,0,114,236,0,
-- 0,0,254,4,0,0,115,2,0,0,0,18,1,122,25,95,
-+ 244,0,0,0,18,5,0,0,114,79,1,0,0,122,25,95,
- 78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,
-- 95,95,105,110,105,116,95,95,99,1,0,0,0,0,0,0,
-- 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0,
-- 0,115,24,0,0,0,116,0,160,1,100,1,116,2,161,2,
-- 1,0,100,2,160,3,124,0,106,4,161,1,83,0,41,3,
-- 122,115,82,101,116,117,114,110,32,114,101,112,114,32,102,111,
-- 114,32,116,104,101,32,109,111,100,117,108,101,46,10,10,32,
-- 32,32,32,32,32,32,32,84,104,101,32,109,101,116,104,111,
-- 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,
-- 32,32,84,104,101,32,105,109,112,111,114,116,32,109,97,99,
-- 104,105,110,101,114,121,32,100,111,101,115,32,116,104,101,32,
-- 106,111,98,32,105,116,115,101,108,102,46,10,10,32,32,32,
-- 32,32,32,32,32,122,82,95,78,97,109,101,115,112,97,99,
-- 101,76,111,97,100,101,114,46,109,111,100,117,108,101,95,114,
-- 101,112,114,40,41,32,105,115,32,100,101,112,114,101,99,97,
-- 116,101,100,32,97,110,100,32,115,108,97,116,101,100,32,102,
-- 111,114,32,114,101,109,111,118,97,108,32,105,110,32,80,121,
-- 116,104,111,110,32,51,46,49,50,122,25,60,109,111,100,117,
-- 108,101,32,123,33,114,125,32,40,110,97,109,101,115,112,97,
-- 99,101,41,62,41,5,114,99,0,0,0,114,100,0,0,0,
-- 114,101,0,0,0,114,89,0,0,0,114,150,0,0,0,41,
-- 1,114,244,0,0,0,114,7,0,0,0,114,7,0,0,0,
-- 114,8,0,0,0,218,11,109,111,100,117,108,101,95,114,101,
-- 112,114,1,5,0,0,115,8,0,0,0,6,7,2,1,4,
-- 255,12,2,122,28,95,78,97,109,101,115,112,97,99,101,76,
-- 111,97,100,101,114,46,109,111,100,117,108,101,95,114,101,112,
-- 114,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,
-- 0,0,1,0,0,0,67,0,0,0,114,23,0,0,0,41,
-- 2,78,84,114,7,0,0,0,114,247,0,0,0,114,7,0,
-- 0,0,114,7,0,0,0,114,8,0,0,0,114,206,0,0,
-- 0,12,5,0,0,243,2,0,0,0,4,1,122,27,95,78,
-- 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,105,
-- 115,95,112,97,99,107,97,103,101,99,2,0,0,0,0,0,
-- 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,
-- 0,0,114,23,0,0,0,41,2,78,114,10,0,0,0,114,
-- 7,0,0,0,114,247,0,0,0,114,7,0,0,0,114,7,
-- 0,0,0,114,8,0,0,0,114,1,1,0,0,15,5,0,
-- 0,114,77,1,0,0,122,27,95,78,97,109,101,115,112,97,
-- 99,101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,
-- 114,99,101,99,2,0,0,0,0,0,0,0,0,0,0,0,
-- 2,0,0,0,6,0,0,0,67,0,0,0,115,16,0,0,
-- 0,116,0,100,1,100,2,100,3,100,4,100,5,141,4,83,
-- 0,41,6,78,114,10,0,0,0,122,8,60,115,116,114,105,
-- 110,103,62,114,243,0,0,0,84,41,1,114,3,1,0,0,
-- 41,1,114,4,1,0,0,114,247,0,0,0,114,7,0,0,
-- 0,114,7,0,0,0,114,8,0,0,0,114,241,0,0,0,
-- 18,5,0,0,114,74,1,0,0,122,25,95,78,97,109,101,
-- 115,112,97,99,101,76,111,97,100,101,114,46,103,101,116,95,
-- 99,111,100,101,99,2,0,0,0,0,0,0,0,0,0,0,
-- 0,2,0,0,0,1,0,0,0,67,0,0,0,114,23,0,
-- 0,0,114,237,0,0,0,114,7,0,0,0,114,238,0,0,
-- 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-- 114,239,0,0,0,21,5,0,0,114,240,0,0,0,122,30,
-- 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,
-- 46,99,114,101,97,116,101,95,109,111,100,117,108,101,99,2,
-- 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,
-- 0,0,0,67,0,0,0,115,4,0,0,0,100,0,83,0,
-- 114,69,0,0,0,114,7,0,0,0,114,42,1,0,0,114,
-- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,245,
-- 0,0,0,24,5,0,0,114,77,1,0,0,122,28,95,78,
-- 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,101,
-- 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0,
-- 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67,
-- 0,0,0,115,26,0,0,0,116,0,160,1,100,1,124,0,
-- 106,2,161,2,1,0,116,0,160,3,124,0,124,1,161,2,
-- 83,0,41,2,122,98,76,111,97,100,32,97,32,110,97,109,
-- 101,115,112,97,99,101,32,109,111,100,117,108,101,46,10,10,
-+ 103,101,116,95,99,111,100,101,99,2,0,0,0,0,0,0,
-+ 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,
-+ 0,114,26,0,0,0,114,240,0,0,0,114,7,0,0,0,
-+ 114,241,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
-+ 8,0,0,0,114,242,0,0,0,21,5,0,0,114,243,0,
-+ 0,0,122,30,95,78,97,109,101,115,112,97,99,101,76,111,
-+ 97,100,101,114,46,99,114,101,97,116,101,95,109,111,100,117,
-+ 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
-+ 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,
-+ 100,0,83,0,114,72,0,0,0,114,7,0,0,0,114,47,
-+ 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-+ 0,0,114,248,0,0,0,24,5,0,0,114,82,1,0,0,
-+ 122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,
-+ 101,114,46,101,120,101,99,95,109,111,100,117,108,101,99,2,
-+ 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,
-+ 0,0,0,67,0,0,0,115,26,0,0,0,116,0,160,1,
-+ 100,1,124,0,106,2,161,2,1,0,116,0,160,3,124,0,
-+ 124,1,161,2,83,0,41,2,122,98,76,111,97,100,32,97,
-+ 32,110,97,109,101,115,112,97,99,101,32,109,111,100,117,108,
-+ 101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,
-+ 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,
-+ 99,97,116,101,100,46,32,32,85,115,101,32,101,120,101,99,
-+ 95,109,111,100,117,108,101,40,41,32,105,110,115,116,101,97,
-+ 100,46,10,10,32,32,32,32,32,32,32,32,122,38,110,97,
-+ 109,101,115,112,97,99,101,32,109,111,100,117,108,101,32,108,
-+ 111,97,100,101,100,32,119,105,116,104,32,112,97,116,104,32,
-+ 123,33,114,125,41,4,114,162,0,0,0,114,176,0,0,0,
-+ 114,54,1,0,0,114,249,0,0,0,114,250,0,0,0,114,
-+ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,251,
-+ 0,0,0,27,5,0,0,115,8,0,0,0,6,7,4,1,
-+ 4,255,12,3,122,28,95,78,97,109,101,115,112,97,99,101,
-+ 76,111,97,100,101,114,46,108,111,97,100,95,109,111,100,117,
-+ 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,3,
-+ 0,0,0,2,0,0,0,67,0,0,0,115,22,0,0,0,
-+ 100,1,100,2,108,0,109,1,125,2,1,0,124,2,124,0,
-+ 106,2,131,1,83,0,41,3,78,114,0,0,0,0,41,1,
-+ 218,15,78,97,109,101,115,112,97,99,101,82,101,97,100,101,
-+ 114,41,3,114,36,1,0,0,114,83,1,0,0,114,54,1,
-+ 0,0,41,3,114,146,0,0,0,114,247,0,0,0,114,83,
-+ 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-+ 0,0,114,37,1,0,0,39,5,0,0,115,4,0,0,0,
-+ 12,1,10,1,122,36,95,78,97,109,101,115,112,97,99,101,
-+ 76,111,97,100,101,114,46,103,101,116,95,114,101,115,111,117,
-+ 114,99,101,95,114,101,97,100,101,114,78,41,13,114,153,0,
-+ 0,0,114,152,0,0,0,114,154,0,0,0,114,239,0,0,
-+ 0,114,236,0,0,0,114,81,1,0,0,114,209,0,0,0,
-+ 114,4,1,0,0,114,244,0,0,0,114,242,0,0,0,114,
-+ 248,0,0,0,114,251,0,0,0,114,37,1,0,0,114,7,
-+ 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-+ 0,0,114,80,1,0,0,253,4,0,0,115,22,0,0,0,
-+ 8,0,8,1,2,3,10,1,8,10,8,3,8,3,8,3,
-+ 8,3,8,3,12,12,114,80,1,0,0,99,0,0,0,0,
-+ 0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
-+ 64,0,0,0,115,118,0,0,0,101,0,90,1,100,0,90,
-+ 2,100,1,90,3,101,4,100,2,100,3,132,0,131,1,90,
-+ 5,101,4,100,4,100,5,132,0,131,1,90,6,101,7,100,
-+ 6,100,7,132,0,131,1,90,8,101,7,100,8,100,9,132,
-+ 0,131,1,90,9,101,7,100,19,100,11,100,12,132,1,131,
-+ 1,90,10,101,7,100,20,100,13,100,14,132,1,131,1,90,
-+ 11,101,7,100,19,100,15,100,16,132,1,131,1,90,12,101,
-+ 4,100,17,100,18,132,0,131,1,90,13,100,10,83,0,41,
-+ 21,218,10,80,97,116,104,70,105,110,100,101,114,122,62,77,
-+ 101,116,97,32,112,97,116,104,32,102,105,110,100,101,114,32,
-+ 102,111,114,32,115,121,115,46,112,97,116,104,32,97,110,100,
-+ 32,112,97,99,107,97,103,101,32,95,95,112,97,116,104,95,
-+ 95,32,97,116,116,114,105,98,117,116,101,115,46,99,0,0,
-+ 0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,
-+ 0,0,67,0,0,0,115,78,0,0,0,116,0,116,1,106,
-+ 2,160,3,161,0,131,1,68,0,93,22,92,2,125,0,125,
-+ 1,124,1,100,1,117,0,114,20,116,1,106,2,124,0,61,
-+ 0,113,7,116,4,124,1,100,2,131,2,114,29,124,1,160,
-+ 5,161,0,1,0,113,7,116,6,4,0,106,7,100,3,55,
-+ 0,2,0,95,7,100,1,83,0,41,4,122,125,67,97,108,
-+ 108,32,116,104,101,32,105,110,118,97,108,105,100,97,116,101,
-+ 95,99,97,99,104,101,115,40,41,32,109,101,116,104,111,100,
-+ 32,111,110,32,97,108,108,32,112,97,116,104,32,101,110,116,
-+ 114,121,32,102,105,110,100,101,114,115,10,32,32,32,32,32,
-+ 32,32,32,115,116,111,114,101,100,32,105,110,32,115,121,115,
-+ 46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,
-+ 97,99,104,101,115,32,40,119,104,101,114,101,32,105,109,112,
-+ 108,101,109,101,110,116,101,100,41,46,78,218,17,105,110,118,
-+ 97,108,105,100,97,116,101,95,99,97,99,104,101,115,114,3,
-+ 0,0,0,41,8,218,4,108,105,115,116,114,18,0,0,0,
-+ 218,19,112,97,116,104,95,105,109,112,111,114,116,101,114,95,
-+ 99,97,99,104,101,218,5,105,116,101,109,115,114,156,0,0,
-+ 0,114,85,1,0,0,114,52,1,0,0,114,57,1,0,0,
-+ 41,2,114,144,0,0,0,218,6,102,105,110,100,101,114,114,
-+ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,85,
-+ 1,0,0,50,5,0,0,115,14,0,0,0,22,4,8,1,
-+ 10,1,10,1,8,1,2,128,18,3,122,28,80,97,116,104,
-+ 70,105,110,100,101,114,46,105,110,118,97,108,105,100,97,116,
-+ 101,95,99,97,99,104,101,115,99,1,0,0,0,0,0,0,
-+ 0,0,0,0,0,2,0,0,0,9,0,0,0,67,0,0,
-+ 0,115,76,0,0,0,116,0,106,1,100,1,117,1,114,14,
-+ 116,0,106,1,115,14,116,2,160,3,100,2,116,4,161,2,
-+ 1,0,116,0,106,1,68,0,93,18,125,1,122,7,124,1,
-+ 124,0,131,1,87,0,2,0,1,0,83,0,4,0,116,5,
-+ 121,35,1,0,1,0,1,0,89,0,113,17,119,0,100,1,
-+ 83,0,41,3,122,46,83,101,97,114,99,104,32,115,121,115,
-+ 46,112,97,116,104,95,104,111,111,107,115,32,102,111,114,32,
-+ 97,32,102,105,110,100,101,114,32,102,111,114,32,39,112,97,
-+ 116,104,39,46,78,122,23,115,121,115,46,112,97,116,104,95,
-+ 104,111,111,107,115,32,105,115,32,101,109,112,116,121,41,6,
-+ 114,18,0,0,0,218,10,112,97,116,104,95,104,111,111,107,
-+ 115,114,102,0,0,0,114,103,0,0,0,114,165,0,0,0,
-+ 114,145,0,0,0,41,2,114,68,0,0,0,90,4,104,111,
-+ 111,107,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-+ 0,218,11,95,112,97,116,104,95,104,111,111,107,115,63,5,
-+ 0,0,115,18,0,0,0,16,3,12,1,10,1,2,1,14,
-+ 1,12,1,4,1,2,255,4,3,122,22,80,97,116,104,70,
-+ 105,110,100,101,114,46,95,112,97,116,104,95,104,111,111,107,
-+ 115,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,
-+ 0,0,8,0,0,0,67,0,0,0,115,100,0,0,0,124,
-+ 1,100,1,107,2,114,21,122,6,116,0,160,1,161,0,125,
-+ 1,87,0,110,10,4,0,116,2,121,20,1,0,1,0,1,
-+ 0,89,0,100,2,83,0,119,0,122,8,116,3,106,4,124,
-+ 1,25,0,125,2,87,0,124,2,83,0,4,0,116,5,121,
-+ 49,1,0,1,0,1,0,124,0,160,6,124,1,161,1,125,
-+ 2,124,2,116,3,106,4,124,1,60,0,89,0,124,2,83,
-+ 0,119,0,41,3,122,210,71,101,116,32,116,104,101,32,102,
-+ 105,110,100,101,114,32,102,111,114,32,116,104,101,32,112,97,
-+ 116,104,32,101,110,116,114,121,32,102,114,111,109,32,115,121,
-+ 115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,
-+ 99,97,99,104,101,46,10,10,32,32,32,32,32,32,32,32,
-+ 73,102,32,116,104,101,32,112,97,116,104,32,101,110,116,114,
-+ 121,32,105,115,32,110,111,116,32,105,110,32,116,104,101,32,
-+ 99,97,99,104,101,44,32,102,105,110,100,32,116,104,101,32,
-+ 97,112,112,114,111,112,114,105,97,116,101,32,102,105,110,100,
-+ 101,114,10,32,32,32,32,32,32,32,32,97,110,100,32,99,
-+ 97,99,104,101,32,105,116,46,32,73,102,32,110,111,32,102,
-+ 105,110,100,101,114,32,105,115,32,97,118,97,105,108,97,98,
-+ 108,101,44,32,115,116,111,114,101,32,78,111,110,101,46,10,
-+ 10,32,32,32,32,32,32,32,32,114,10,0,0,0,78,41,
-+ 7,114,21,0,0,0,114,85,0,0,0,218,17,70,105,108,
-+ 101,78,111,116,70,111,117,110,100,69,114,114,111,114,114,18,
-+ 0,0,0,114,87,1,0,0,218,8,75,101,121,69,114,114,
-+ 111,114,114,91,1,0,0,41,3,114,224,0,0,0,114,68,
-+ 0,0,0,114,89,1,0,0,114,7,0,0,0,114,7,0,
-+ 0,0,114,8,0,0,0,218,20,95,112,97,116,104,95,105,
-+ 109,112,111,114,116,101,114,95,99,97,99,104,101,76,5,0,
-+ 0,115,28,0,0,0,8,8,2,1,12,1,12,1,6,3,
-+ 2,253,2,4,12,1,4,4,12,253,10,1,12,1,4,1,
-+ 2,253,122,31,80,97,116,104,70,105,110,100,101,114,46,95,
-+ 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,
-+ 99,104,101,99,3,0,0,0,0,0,0,0,0,0,0,0,
-+ 7,0,0,0,4,0,0,0,67,0,0,0,115,138,0,0,
-+ 0,116,0,124,2,100,1,131,2,114,27,116,1,160,2,124,
-+ 2,161,1,155,0,100,2,157,2,125,3,116,3,160,4,124,
-+ 3,116,5,161,2,1,0,124,2,160,6,124,1,161,1,92,
-+ 2,125,4,125,5,110,21,116,1,160,2,124,2,161,1,155,
-+ 0,100,3,157,2,125,3,116,3,160,4,124,3,116,5,161,
-+ 2,1,0,124,2,160,7,124,1,161,1,125,4,103,0,125,
-+ 5,124,4,100,0,117,1,114,58,116,1,160,8,124,1,124,
-+ 4,161,2,83,0,116,1,160,9,124,1,100,0,161,2,125,
-+ 6,124,5,124,6,95,10,124,6,83,0,41,4,78,114,164,
-+ 0,0,0,122,53,46,102,105,110,100,95,115,112,101,99,40,
-+ 41,32,110,111,116,32,102,111,117,110,100,59,32,102,97,108,
-+ 108,105,110,103,32,98,97,99,107,32,116,111,32,102,105,110,
-+ 100,95,108,111,97,100,101,114,40,41,122,53,46,102,105,110,
-+ 100,95,115,112,101,99,40,41,32,110,111,116,32,102,111,117,
-+ 110,100,59,32,102,97,108,108,105,110,103,32,98,97,99,107,
-+ 32,116,111,32,102,105,110,100,95,109,111,100,117,108,101,40,
-+ 41,41,11,114,156,0,0,0,114,162,0,0,0,90,12,95,
-+ 111,98,106,101,99,116,95,110,97,109,101,114,102,0,0,0,
-+ 114,103,0,0,0,114,165,0,0,0,114,164,0,0,0,114,
-+ 232,0,0,0,114,227,0,0,0,114,210,0,0,0,114,205,
-+ 0,0,0,41,7,114,224,0,0,0,114,166,0,0,0,114,
-+ 89,1,0,0,114,169,0,0,0,114,167,0,0,0,114,168,
-+ 0,0,0,114,213,0,0,0,114,7,0,0,0,114,7,0,
-+ 0,0,114,8,0,0,0,218,16,95,108,101,103,97,99,121,
-+ 95,103,101,116,95,115,112,101,99,98,5,0,0,115,26,0,
-+ 0,0,10,4,16,1,12,2,16,1,16,2,12,2,10,1,
-+ 4,1,8,1,12,1,12,1,6,1,4,1,122,27,80,97,
-+ 116,104,70,105,110,100,101,114,46,95,108,101,103,97,99,121,
-+ 95,103,101,116,95,115,112,101,99,78,99,4,0,0,0,0,
-+ 0,0,0,0,0,0,0,9,0,0,0,5,0,0,0,67,
-+ 0,0,0,115,166,0,0,0,103,0,125,4,124,2,68,0,
-+ 93,67,125,5,116,0,124,5,116,1,116,2,102,2,131,2,
-+ 115,14,113,4,124,0,160,3,124,5,161,1,125,6,124,6,
-+ 100,1,117,1,114,71,116,4,124,6,100,2,131,2,114,35,
-+ 124,6,160,5,124,1,124,3,161,2,125,7,110,6,124,0,
-+ 160,6,124,1,124,6,161,2,125,7,124,7,100,1,117,0,
-+ 114,46,113,4,124,7,106,7,100,1,117,1,114,55,124,7,
-+ 2,0,1,0,83,0,124,7,106,8,125,8,124,8,100,1,
-+ 117,0,114,66,116,9,100,3,131,1,130,1,124,4,160,10,
-+ 124,8,161,1,1,0,113,4,116,11,160,12,124,1,100,1,
-+ 161,2,125,7,124,4,124,7,95,8,124,7,83,0,41,4,
-+ 122,63,70,105,110,100,32,116,104,101,32,108,111,97,100,101,
-+ 114,32,111,114,32,110,97,109,101,115,112,97,99,101,95,112,
-+ 97,116,104,32,102,111,114,32,116,104,105,115,32,109,111,100,
-+ 117,108,101,47,112,97,99,107,97,103,101,32,110,97,109,101,
-+ 46,78,114,229,0,0,0,122,19,115,112,101,99,32,109,105,
-+ 115,115,105,110,103,32,108,111,97,100,101,114,41,13,114,188,
-+ 0,0,0,114,112,0,0,0,218,5,98,121,116,101,115,114,
-+ 94,1,0,0,114,156,0,0,0,114,229,0,0,0,114,95,
-+ 1,0,0,114,167,0,0,0,114,205,0,0,0,114,145,0,
-+ 0,0,114,194,0,0,0,114,162,0,0,0,114,210,0,0,
-+ 0,41,9,114,224,0,0,0,114,166,0,0,0,114,68,0,
-+ 0,0,114,228,0,0,0,218,14,110,97,109,101,115,112,97,
-+ 99,101,95,112,97,116,104,90,5,101,110,116,114,121,114,89,
-+ 1,0,0,114,213,0,0,0,114,168,0,0,0,114,7,0,
-+ 0,0,114,7,0,0,0,114,8,0,0,0,218,9,95,103,
-+ 101,116,95,115,112,101,99,119,5,0,0,115,42,0,0,0,
-+ 4,5,8,1,14,1,2,1,10,1,8,1,10,1,14,1,
-+ 12,2,8,1,2,1,10,1,8,1,6,1,8,1,8,1,
-+ 10,5,2,128,12,2,6,1,4,1,122,20,80,97,116,104,
-+ 70,105,110,100,101,114,46,95,103,101,116,95,115,112,101,99,
-+ 99,4,0,0,0,0,0,0,0,0,0,0,0,6,0,0,
-+ 0,5,0,0,0,67,0,0,0,115,94,0,0,0,124,2,
-+ 100,1,117,0,114,7,116,0,106,1,125,2,124,0,160,2,
-+ 124,1,124,2,124,3,161,3,125,4,124,4,100,1,117,0,
-+ 114,20,100,1,83,0,124,4,106,3,100,1,117,0,114,45,
-+ 124,4,106,4,125,5,124,5,114,43,100,1,124,4,95,5,
-+ 116,6,124,1,124,5,124,0,106,2,131,3,124,4,95,4,
-+ 124,4,83,0,100,1,83,0,124,4,83,0,41,2,122,141,
-+ 84,114,121,32,116,111,32,102,105,110,100,32,97,32,115,112,
-+ 101,99,32,102,111,114,32,39,102,117,108,108,110,97,109,101,
-+ 39,32,111,110,32,115,121,115,46,112,97,116,104,32,111,114,
-+ 32,39,112,97,116,104,39,46,10,10,32,32,32,32,32,32,
-+ 32,32,84,104,101,32,115,101,97,114,99,104,32,105,115,32,
-+ 98,97,115,101,100,32,111,110,32,115,121,115,46,112,97,116,
-+ 104,95,104,111,111,107,115,32,97,110,100,32,115,121,115,46,
-+ 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,
-+ 99,104,101,46,10,32,32,32,32,32,32,32,32,78,41,7,
-+ 114,18,0,0,0,114,68,0,0,0,114,98,1,0,0,114,
-+ 167,0,0,0,114,205,0,0,0,114,208,0,0,0,114,52,
-+ 1,0,0,41,6,114,224,0,0,0,114,166,0,0,0,114,
-+ 68,0,0,0,114,228,0,0,0,114,213,0,0,0,114,97,
-+ 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-+ 0,0,114,229,0,0,0,151,5,0,0,115,26,0,0,0,
-+ 8,6,6,1,14,1,8,1,4,1,10,1,6,1,4,1,
-+ 6,3,16,1,4,1,4,2,4,2,122,20,80,97,116,104,
-+ 70,105,110,100,101,114,46,102,105,110,100,95,115,112,101,99,
-+ 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
-+ 0,4,0,0,0,67,0,0,0,115,42,0,0,0,116,0,
-+ 160,1,100,1,116,2,161,2,1,0,124,0,160,3,124,1,
-+ 124,2,161,2,125,3,124,3,100,2,117,0,114,18,100,2,
-+ 83,0,124,3,106,4,83,0,41,3,122,170,102,105,110,100,
-+ 32,116,104,101,32,109,111,100,117,108,101,32,111,110,32,115,
-+ 121,115,46,112,97,116,104,32,111,114,32,39,112,97,116,104,
-+ 39,32,98,97,115,101,100,32,111,110,32,115,121,115,46,112,
-+ 97,116,104,95,104,111,111,107,115,32,97,110,100,10,32,32,
-+ 32,32,32,32,32,32,115,121,115,46,112,97,116,104,95,105,
-+ 109,112,111,114,116,101,114,95,99,97,99,104,101,46,10,10,
- 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,
- 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,
-- 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100,
-- 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10,
-- 32,32,32,32,32,32,32,32,122,38,110,97,109,101,115,112,
-- 97,99,101,32,109,111,100,117,108,101,32,108,111,97,100,101,
-- 100,32,119,105,116,104,32,112,97,116,104,32,123,33,114,125,
-- 41,4,114,159,0,0,0,114,173,0,0,0,114,49,1,0,
-- 0,114,246,0,0,0,114,247,0,0,0,114,7,0,0,0,
-- 114,7,0,0,0,114,8,0,0,0,114,248,0,0,0,27,
-- 5,0,0,115,8,0,0,0,6,7,4,1,4,255,12,3,
-- 122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,
-- 101,114,46,108,111,97,100,95,109,111,100,117,108,101,99,2,
-- 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,
-- 0,0,0,67,0,0,0,115,22,0,0,0,100,1,100,2,
-- 108,0,109,1,125,2,1,0,124,2,124,0,106,2,131,1,
-- 83,0,41,3,78,114,0,0,0,0,41,1,218,15,78,97,
-- 109,101,115,112,97,99,101,82,101,97,100,101,114,41,3,114,
-- 32,1,0,0,114,78,1,0,0,114,49,1,0,0,41,3,
-- 114,143,0,0,0,114,244,0,0,0,114,78,1,0,0,114,
-- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,33,
-- 1,0,0,39,5,0,0,115,4,0,0,0,12,1,10,1,
-- 122,36,95,78,97,109,101,115,112,97,99,101,76,111,97,100,
-- 101,114,46,103,101,116,95,114,101,115,111,117,114,99,101,95,
-- 114,101,97,100,101,114,78,41,13,114,150,0,0,0,114,149,
-- 0,0,0,114,151,0,0,0,114,236,0,0,0,114,233,0,
-- 0,0,114,76,1,0,0,114,206,0,0,0,114,1,1,0,
-- 0,114,241,0,0,0,114,239,0,0,0,114,245,0,0,0,
-- 114,248,0,0,0,114,33,1,0,0,114,7,0,0,0,114,
-- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,75,
-- 1,0,0,253,4,0,0,115,22,0,0,0,8,0,8,1,
-- 2,3,10,1,8,10,8,3,8,3,8,3,8,3,8,3,
-- 12,12,114,75,1,0,0,99,0,0,0,0,0,0,0,0,
-- 0,0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,
-- 115,118,0,0,0,101,0,90,1,100,0,90,2,100,1,90,
-- 3,101,4,100,2,100,3,132,0,131,1,90,5,101,4,100,
-- 4,100,5,132,0,131,1,90,6,101,7,100,6,100,7,132,
-- 0,131,1,90,8,101,7,100,8,100,9,132,0,131,1,90,
-- 9,101,7,100,19,100,11,100,12,132,1,131,1,90,10,101,
-- 7,100,20,100,13,100,14,132,1,131,1,90,11,101,7,100,
-- 19,100,15,100,16,132,1,131,1,90,12,101,4,100,17,100,
-- 18,132,0,131,1,90,13,100,10,83,0,41,21,218,10,80,
-- 97,116,104,70,105,110,100,101,114,122,62,77,101,116,97,32,
-- 112,97,116,104,32,102,105,110,100,101,114,32,102,111,114,32,
-- 115,121,115,46,112,97,116,104,32,97,110,100,32,112,97,99,
-- 107,97,103,101,32,95,95,112,97,116,104,95,95,32,97,116,
-- 116,114,105,98,117,116,101,115,46,99,0,0,0,0,0,0,
-- 0,0,0,0,0,0,2,0,0,0,4,0,0,0,67,0,
-- 0,0,115,78,0,0,0,116,0,116,1,106,2,160,3,161,
-- 0,131,1,68,0,93,22,92,2,125,0,125,1,124,1,100,
-- 1,117,0,114,20,116,1,106,2,124,0,61,0,113,7,116,
-- 4,124,1,100,2,131,2,114,29,124,1,160,5,161,0,1,
-- 0,113,7,116,6,4,0,106,7,100,3,55,0,2,0,95,
-- 7,100,1,83,0,41,4,122,125,67,97,108,108,32,116,104,
-- 101,32,105,110,118,97,108,105,100,97,116,101,95,99,97,99,
-- 104,101,115,40,41,32,109,101,116,104,111,100,32,111,110,32,
-- 97,108,108,32,112,97,116,104,32,101,110,116,114,121,32,102,
-- 105,110,100,101,114,115,10,32,32,32,32,32,32,32,32,115,
-- 116,111,114,101,100,32,105,110,32,115,121,115,46,112,97,116,
-- 104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,
-- 115,32,40,119,104,101,114,101,32,105,109,112,108,101,109,101,
-- 110,116,101,100,41,46,78,218,17,105,110,118,97,108,105,100,
-- 97,116,101,95,99,97,99,104,101,115,114,3,0,0,0,41,
-- 8,218,4,108,105,115,116,114,15,0,0,0,218,19,112,97,
-- 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,
-- 101,218,5,105,116,101,109,115,114,153,0,0,0,114,80,1,
-- 0,0,114,47,1,0,0,114,52,1,0,0,41,2,114,141,
-- 0,0,0,218,6,102,105,110,100,101,114,114,7,0,0,0,
-- 114,7,0,0,0,114,8,0,0,0,114,80,1,0,0,50,
-- 5,0,0,115,14,0,0,0,22,4,8,1,10,1,10,1,
-- 8,1,2,128,18,3,122,28,80,97,116,104,70,105,110,100,
-- 101,114,46,105,110,118,97,108,105,100,97,116,101,95,99,97,
-- 99,104,101,115,99,1,0,0,0,0,0,0,0,0,0,0,
-- 0,2,0,0,0,9,0,0,0,67,0,0,0,115,76,0,
-- 0,0,116,0,106,1,100,1,117,1,114,14,116,0,106,1,
-- 115,14,116,2,160,3,100,2,116,4,161,2,1,0,116,0,
-- 106,1,68,0,93,18,125,1,122,7,124,1,124,0,131,1,
-- 87,0,2,0,1,0,83,0,4,0,116,5,121,35,1,0,
-- 1,0,1,0,89,0,113,17,119,0,100,1,83,0,41,3,
-- 122,46,83,101,97,114,99,104,32,115,121,115,46,112,97,116,
-- 104,95,104,111,111,107,115,32,102,111,114,32,97,32,102,105,
-- 110,100,101,114,32,102,111,114,32,39,112,97,116,104,39,46,
-- 78,122,23,115,121,115,46,112,97,116,104,95,104,111,111,107,
-- 115,32,105,115,32,101,109,112,116,121,41,6,114,15,0,0,
-- 0,218,10,112,97,116,104,95,104,111,111,107,115,114,99,0,
-- 0,0,114,100,0,0,0,114,162,0,0,0,114,142,0,0,
-- 0,41,2,114,65,0,0,0,90,4,104,111,111,107,114,7,
-- 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,95,
-- 112,97,116,104,95,104,111,111,107,115,63,5,0,0,115,18,
-- 0,0,0,16,3,12,1,10,1,2,1,14,1,12,1,4,
-- 1,2,255,4,3,122,22,80,97,116,104,70,105,110,100,101,
-- 114,46,95,112,97,116,104,95,104,111,111,107,115,99,2,0,
-- 0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,
-- 0,0,67,0,0,0,115,100,0,0,0,124,1,100,1,107,
-- 2,114,21,122,6,116,0,160,1,161,0,125,1,87,0,110,
-- 10,4,0,116,2,121,20,1,0,1,0,1,0,89,0,100,
-- 2,83,0,119,0,122,8,116,3,106,4,124,1,25,0,125,
-- 2,87,0,124,2,83,0,4,0,116,5,121,49,1,0,1,
-- 0,1,0,124,0,160,6,124,1,161,1,125,2,124,2,116,
-- 3,106,4,124,1,60,0,89,0,124,2,83,0,119,0,41,
-- 3,122,210,71,101,116,32,116,104,101,32,102,105,110,100,101,
-- 114,32,102,111,114,32,116,104,101,32,112,97,116,104,32,101,
-- 110,116,114,121,32,102,114,111,109,32,115,121,115,46,112,97,
-- 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,
-- 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,116,
-- 104,101,32,112,97,116,104,32,101,110,116,114,121,32,105,115,
-- 32,110,111,116,32,105,110,32,116,104,101,32,99,97,99,104,
-- 101,44,32,102,105,110,100,32,116,104,101,32,97,112,112,114,
-- 111,112,114,105,97,116,101,32,102,105,110,100,101,114,10,32,
-- 32,32,32,32,32,32,32,97,110,100,32,99,97,99,104,101,
-- 32,105,116,46,32,73,102,32,110,111,32,102,105,110,100,101,
-- 114,32,105,115,32,97,118,97,105,108,97,98,108,101,44,32,
-- 115,116,111,114,101,32,78,111,110,101,46,10,10,32,32,32,
-- 32,32,32,32,32,114,10,0,0,0,78,41,7,114,18,0,
-- 0,0,114,82,0,0,0,218,17,70,105,108,101,78,111,116,
-- 70,111,117,110,100,69,114,114,111,114,114,15,0,0,0,114,
-- 82,1,0,0,218,8,75,101,121,69,114,114,111,114,114,86,
-- 1,0,0,41,3,114,221,0,0,0,114,65,0,0,0,114,
-- 84,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-- 0,0,0,218,20,95,112,97,116,104,95,105,109,112,111,114,
-- 116,101,114,95,99,97,99,104,101,76,5,0,0,115,28,0,
-- 0,0,8,8,2,1,12,1,12,1,6,3,2,253,2,4,
-- 12,1,4,4,12,253,10,1,12,1,4,1,2,253,122,31,
-- 80,97,116,104,70,105,110,100,101,114,46,95,112,97,116,104,
-- 95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,99,
-- 3,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,
-- 4,0,0,0,67,0,0,0,115,138,0,0,0,116,0,124,
-- 2,100,1,131,2,114,27,116,1,160,2,124,2,161,1,155,
-- 0,100,2,157,2,125,3,116,3,160,4,124,3,116,5,161,
-- 2,1,0,124,2,160,6,124,1,161,1,92,2,125,4,125,
-- 5,110,21,116,1,160,2,124,2,161,1,155,0,100,3,157,
-- 2,125,3,116,3,160,4,124,3,116,5,161,2,1,0,124,
-- 2,160,7,124,1,161,1,125,4,103,0,125,5,124,4,100,
-- 0,117,1,114,58,116,1,160,8,124,1,124,4,161,2,83,
-- 0,116,1,160,9,124,1,100,0,161,2,125,6,124,5,124,
-- 6,95,10,124,6,83,0,41,4,78,114,161,0,0,0,122,
-- 53,46,102,105,110,100,95,115,112,101,99,40,41,32,110,111,
-- 116,32,102,111,117,110,100,59,32,102,97,108,108,105,110,103,
-- 32,98,97,99,107,32,116,111,32,102,105,110,100,95,108,111,
-- 97,100,101,114,40,41,122,53,46,102,105,110,100,95,115,112,
-- 101,99,40,41,32,110,111,116,32,102,111,117,110,100,59,32,
-- 102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,
-- 102,105,110,100,95,109,111,100,117,108,101,40,41,41,11,114,
-- 153,0,0,0,114,159,0,0,0,90,12,95,111,98,106,101,
-- 99,116,95,110,97,109,101,114,99,0,0,0,114,100,0,0,
-- 0,114,162,0,0,0,114,161,0,0,0,114,229,0,0,0,
-- 114,224,0,0,0,114,207,0,0,0,114,202,0,0,0,41,
-- 7,114,221,0,0,0,114,163,0,0,0,114,84,1,0,0,
-- 114,166,0,0,0,114,164,0,0,0,114,165,0,0,0,114,
-- 210,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-- 0,0,0,218,16,95,108,101,103,97,99,121,95,103,101,116,
-- 95,115,112,101,99,98,5,0,0,115,26,0,0,0,10,4,
-- 16,1,12,2,16,1,16,2,12,2,10,1,4,1,8,1,
-- 12,1,12,1,6,1,4,1,122,27,80,97,116,104,70,105,
-- 110,100,101,114,46,95,108,101,103,97,99,121,95,103,101,116,
-- 95,115,112,101,99,78,99,4,0,0,0,0,0,0,0,0,
-- 0,0,0,9,0,0,0,5,0,0,0,67,0,0,0,115,
-- 166,0,0,0,103,0,125,4,124,2,68,0,93,67,125,5,
-- 116,0,124,5,116,1,116,2,102,2,131,2,115,14,113,4,
-- 124,0,160,3,124,5,161,1,125,6,124,6,100,1,117,1,
-- 114,71,116,4,124,6,100,2,131,2,114,35,124,6,160,5,
-- 124,1,124,3,161,2,125,7,110,6,124,0,160,6,124,1,
-- 124,6,161,2,125,7,124,7,100,1,117,0,114,46,113,4,
-- 124,7,106,7,100,1,117,1,114,55,124,7,2,0,1,0,
-- 83,0,124,7,106,8,125,8,124,8,100,1,117,0,114,66,
-- 116,9,100,3,131,1,130,1,124,4,160,10,124,8,161,1,
-- 1,0,113,4,116,11,160,12,124,1,100,1,161,2,125,7,
-- 124,4,124,7,95,8,124,7,83,0,41,4,122,63,70,105,
-- 110,100,32,116,104,101,32,108,111,97,100,101,114,32,111,114,
-- 32,110,97,109,101,115,112,97,99,101,95,112,97,116,104,32,
-- 102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,47,
-- 112,97,99,107,97,103,101,32,110,97,109,101,46,78,114,226,
-- 0,0,0,122,19,115,112,101,99,32,109,105,115,115,105,110,
-- 103,32,108,111,97,100,101,114,41,13,114,185,0,0,0,114,
-- 109,0,0,0,218,5,98,121,116,101,115,114,89,1,0,0,
-- 114,153,0,0,0,114,226,0,0,0,114,90,1,0,0,114,
-- 164,0,0,0,114,202,0,0,0,114,142,0,0,0,114,191,
-- 0,0,0,114,159,0,0,0,114,207,0,0,0,41,9,114,
-- 221,0,0,0,114,163,0,0,0,114,65,0,0,0,114,225,
-- 0,0,0,218,14,110,97,109,101,115,112,97,99,101,95,112,
-- 97,116,104,90,5,101,110,116,114,121,114,84,1,0,0,114,
-- 210,0,0,0,114,165,0,0,0,114,7,0,0,0,114,7,
-- 0,0,0,114,8,0,0,0,218,9,95,103,101,116,95,115,
-- 112,101,99,119,5,0,0,115,42,0,0,0,4,5,8,1,
-- 14,1,2,1,10,1,8,1,10,1,14,1,12,2,8,1,
-- 2,1,10,1,8,1,6,1,8,1,8,1,10,5,2,128,
-- 12,2,6,1,4,1,122,20,80,97,116,104,70,105,110,100,
-- 101,114,46,95,103,101,116,95,115,112,101,99,99,4,0,0,
-- 0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0,
-- 0,67,0,0,0,115,94,0,0,0,124,2,100,1,117,0,
-- 114,7,116,0,106,1,125,2,124,0,160,2,124,1,124,2,
-- 124,3,161,3,125,4,124,4,100,1,117,0,114,20,100,1,
-- 83,0,124,4,106,3,100,1,117,0,114,45,124,4,106,4,
-- 125,5,124,5,114,43,100,1,124,4,95,5,116,6,124,1,
-- 124,5,124,0,106,2,131,3,124,4,95,4,124,4,83,0,
-- 100,1,83,0,124,4,83,0,41,2,122,141,84,114,121,32,
-- 116,111,32,102,105,110,100,32,97,32,115,112,101,99,32,102,
-- 111,114,32,39,102,117,108,108,110,97,109,101,39,32,111,110,
-- 32,115,121,115,46,112,97,116,104,32,111,114,32,39,112,97,
-- 116,104,39,46,10,10,32,32,32,32,32,32,32,32,84,104,
-- 101,32,115,101,97,114,99,104,32,105,115,32,98,97,115,101,
-- 100,32,111,110,32,115,121,115,46,112,97,116,104,95,104,111,
-- 111,107,115,32,97,110,100,32,115,121,115,46,112,97,116,104,
-- 95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,46,
-- 10,32,32,32,32,32,32,32,32,78,41,7,114,15,0,0,
-- 0,114,65,0,0,0,114,93,1,0,0,114,164,0,0,0,
-- 114,202,0,0,0,114,205,0,0,0,114,47,1,0,0,41,
-- 6,114,221,0,0,0,114,163,0,0,0,114,65,0,0,0,
-- 114,225,0,0,0,114,210,0,0,0,114,92,1,0,0,114,
-- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,226,
-- 0,0,0,151,5,0,0,115,26,0,0,0,8,6,6,1,
-- 14,1,8,1,4,1,10,1,6,1,4,1,6,3,16,1,
-- 4,1,4,2,4,2,122,20,80,97,116,104,70,105,110,100,
-- 101,114,46,102,105,110,100,95,115,112,101,99,99,3,0,0,
-- 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,
-- 0,67,0,0,0,115,42,0,0,0,116,0,160,1,100,1,
-- 116,2,161,2,1,0,124,0,160,3,124,1,124,2,161,2,
-- 125,3,124,3,100,2,117,0,114,18,100,2,83,0,124,3,
-- 106,4,83,0,41,3,122,170,102,105,110,100,32,116,104,101,
-- 32,109,111,100,117,108,101,32,111,110,32,115,121,115,46,112,
-- 97,116,104,32,111,114,32,39,112,97,116,104,39,32,98,97,
-- 115,101,100,32,111,110,32,115,121,115,46,112,97,116,104,95,
-- 104,111,111,107,115,32,97,110,100,10,32,32,32,32,32,32,
-- 32,32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,
-- 116,101,114,95,99,97,99,104,101,46,10,10,32,32,32,32,
-+ 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101,
-+ 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,
-+ 32,32,32,32,32,32,122,101,80,97,116,104,70,105,110,100,
-+ 101,114,46,102,105,110,100,95,109,111,100,117,108,101,40,41,
-+ 32,105,115,32,100,101,112,114,101,99,97,116,101,100,32,97,
-+ 110,100,32,115,108,97,116,101,100,32,102,111,114,32,114,101,
-+ 109,111,118,97,108,32,105,110,32,80,121,116,104,111,110,32,
-+ 51,46,49,50,59,32,117,115,101,32,102,105,110,100,95,115,
-+ 112,101,99,40,41,32,105,110,115,116,101,97,100,78,114,230,
-+ 0,0,0,114,231,0,0,0,114,7,0,0,0,114,7,0,
-+ 0,0,114,8,0,0,0,114,232,0,0,0,175,5,0,0,
-+ 115,14,0,0,0,6,8,2,2,4,254,12,3,8,1,4,
-+ 1,6,1,122,22,80,97,116,104,70,105,110,100,101,114,46,
-+ 102,105,110,100,95,109,111,100,117,108,101,99,0,0,0,0,
-+ 0,0,0,0,0,0,0,0,3,0,0,0,4,0,0,0,
-+ 79,0,0,0,115,28,0,0,0,100,1,100,2,108,0,109,
-+ 1,125,2,1,0,124,2,106,2,124,0,105,0,124,1,164,
-+ 1,142,1,83,0,41,3,97,32,1,0,0,10,32,32,32,
-+ 32,32,32,32,32,70,105,110,100,32,100,105,115,116,114,105,
-+ 98,117,116,105,111,110,115,46,10,10,32,32,32,32,32,32,
-+ 32,32,82,101,116,117,114,110,32,97,110,32,105,116,101,114,
-+ 97,98,108,101,32,111,102,32,97,108,108,32,68,105,115,116,
-+ 114,105,98,117,116,105,111,110,32,105,110,115,116,97,110,99,
-+ 101,115,32,99,97,112,97,98,108,101,32,111,102,10,32,32,
-+ 32,32,32,32,32,32,108,111,97,100,105,110,103,32,116,104,
-+ 101,32,109,101,116,97,100,97,116,97,32,102,111,114,32,112,
-+ 97,99,107,97,103,101,115,32,109,97,116,99,104,105,110,103,
-+ 32,96,96,99,111,110,116,101,120,116,46,110,97,109,101,96,
-+ 96,10,32,32,32,32,32,32,32,32,40,111,114,32,97,108,
-+ 108,32,110,97,109,101,115,32,105,102,32,96,96,78,111,110,
-+ 101,96,96,32,105,110,100,105,99,97,116,101,100,41,32,97,
-+ 108,111,110,103,32,116,104,101,32,112,97,116,104,115,32,105,
-+ 110,32,116,104,101,32,108,105,115,116,10,32,32,32,32,32,
-+ 32,32,32,111,102,32,100,105,114,101,99,116,111,114,105,101,
-+ 115,32,96,96,99,111,110,116,101,120,116,46,112,97,116,104,
-+ 96,96,46,10,32,32,32,32,32,32,32,32,114,0,0,0,
-+ 0,41,1,218,18,77,101,116,97,100,97,116,97,80,97,116,
-+ 104,70,105,110,100,101,114,41,3,90,18,105,109,112,111,114,
-+ 116,108,105,98,46,109,101,116,97,100,97,116,97,114,99,1,
-+ 0,0,218,18,102,105,110,100,95,100,105,115,116,114,105,98,
-+ 117,116,105,111,110,115,41,3,114,147,0,0,0,114,148,0,
-+ 0,0,114,99,1,0,0,114,7,0,0,0,114,7,0,0,
-+ 0,114,8,0,0,0,114,100,1,0,0,191,5,0,0,115,
-+ 4,0,0,0,12,10,16,1,122,29,80,97,116,104,70,105,
-+ 110,100,101,114,46,102,105,110,100,95,100,105,115,116,114,105,
-+ 98,117,116,105,111,110,115,114,72,0,0,0,114,233,0,0,
-+ 0,41,14,114,153,0,0,0,114,152,0,0,0,114,154,0,
-+ 0,0,114,155,0,0,0,114,236,0,0,0,114,85,1,0,
-+ 0,114,91,1,0,0,114,237,0,0,0,114,94,1,0,0,
-+ 114,95,1,0,0,114,98,1,0,0,114,229,0,0,0,114,
-+ 232,0,0,0,114,100,1,0,0,114,7,0,0,0,114,7,
-+ 0,0,0,114,7,0,0,0,114,8,0,0,0,114,84,1,
-+ 0,0,46,5,0,0,115,36,0,0,0,8,0,4,2,2,
-+ 2,10,1,2,12,10,1,2,12,10,1,2,21,10,1,2,
-+ 20,12,1,2,31,12,1,2,23,12,1,2,15,14,1,114,
-+ 84,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,
-+ 0,0,0,0,0,3,0,0,0,64,0,0,0,115,90,0,
-+ 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,
-+ 100,3,132,0,90,4,100,4,100,5,132,0,90,5,101,6,
-+ 90,7,100,6,100,7,132,0,90,8,100,8,100,9,132,0,
-+ 90,9,100,19,100,11,100,12,132,1,90,10,100,13,100,14,
-+ 132,0,90,11,101,12,100,15,100,16,132,0,131,1,90,13,
-+ 100,17,100,18,132,0,90,14,100,10,83,0,41,20,218,10,
-+ 70,105,108,101,70,105,110,100,101,114,122,172,70,105,108,101,
-+ 45,98,97,115,101,100,32,102,105,110,100,101,114,46,10,10,
-+ 32,32,32,32,73,110,116,101,114,97,99,116,105,111,110,115,
-+ 32,119,105,116,104,32,116,104,101,32,102,105,108,101,32,115,
-+ 121,115,116,101,109,32,97,114,101,32,99,97,99,104,101,100,
-+ 32,102,111,114,32,112,101,114,102,111,114,109,97,110,99,101,
-+ 44,32,98,101,105,110,103,10,32,32,32,32,114,101,102,114,
-+ 101,115,104,101,100,32,119,104,101,110,32,116,104,101,32,100,
-+ 105,114,101,99,116,111,114,121,32,116,104,101,32,102,105,110,
-+ 100,101,114,32,105,115,32,104,97,110,100,108,105,110,103,32,
-+ 104,97,115,32,98,101,101,110,32,109,111,100,105,102,105,101,
-+ 100,46,10,10,32,32,32,32,99,2,0,0,0,0,0,0,
-+ 0,0,0,0,0,5,0,0,0,6,0,0,0,7,0,0,
-+ 0,115,112,0,0,0,103,0,125,3,124,2,68,0,93,16,
-+ 92,2,137,0,125,4,124,3,160,0,135,0,102,1,100,1,
-+ 100,2,132,8,124,4,68,0,131,1,161,1,1,0,113,4,
-+ 124,3,124,0,95,1,124,1,112,27,100,3,124,0,95,2,
-+ 116,3,124,0,106,2,131,1,115,43,116,4,116,5,160,6,
-+ 161,0,124,0,106,2,131,2,124,0,95,2,100,4,124,0,
-+ 95,7,116,8,131,0,124,0,95,9,116,8,131,0,124,0,
-+ 95,10,100,5,83,0,41,6,122,154,73,110,105,116,105,97,
-+ 108,105,122,101,32,119,105,116,104,32,116,104,101,32,112,97,
-+ 116,104,32,116,111,32,115,101,97,114,99,104,32,111,110,32,
-+ 97,110,100,32,97,32,118,97,114,105,97,98,108,101,32,110,
-+ 117,109,98,101,114,32,111,102,10,32,32,32,32,32,32,32,
-+ 32,50,45,116,117,112,108,101,115,32,99,111,110,116,97,105,
-+ 110,105,110,103,32,116,104,101,32,108,111,97,100,101,114,32,
-+ 97,110,100,32,116,104,101,32,102,105,108,101,32,115,117,102,
-+ 102,105,120,101,115,32,116,104,101,32,108,111,97,100,101,114,
-+ 10,32,32,32,32,32,32,32,32,114,101,99,111,103,110,105,
-+ 122,101,115,46,99,1,0,0,0,0,0,0,0,0,0,0,
-+ 0,2,0,0,0,3,0,0,0,51,0,0,0,115,24,0,
-+ 0,0,129,0,124,0,93,7,125,1,124,1,136,0,102,2,
-+ 86,0,1,0,113,2,100,0,83,0,114,72,0,0,0,114,
-+ 7,0,0,0,114,48,1,0,0,169,1,114,167,0,0,0,
-+ 114,7,0,0,0,114,8,0,0,0,114,9,0,0,0,220,
-+ 5,0,0,115,4,0,0,0,2,128,22,0,122,38,70,105,
-+ 108,101,70,105,110,100,101,114,46,95,95,105,110,105,116,95,
-+ 95,46,60,108,111,99,97,108,115,62,46,60,103,101,110,101,
-+ 120,112,114,62,114,100,0,0,0,114,133,0,0,0,78,41,
-+ 11,114,194,0,0,0,218,8,95,108,111,97,100,101,114,115,
-+ 114,68,0,0,0,114,89,0,0,0,114,70,0,0,0,114,
-+ 21,0,0,0,114,85,0,0,0,218,11,95,112,97,116,104,
-+ 95,109,116,105,109,101,218,3,115,101,116,218,11,95,112,97,
-+ 116,104,95,99,97,99,104,101,218,19,95,114,101,108,97,120,
-+ 101,100,95,112,97,116,104,95,99,97,99,104,101,41,5,114,
-+ 146,0,0,0,114,68,0,0,0,218,14,108,111,97,100,101,
-+ 114,95,100,101,116,97,105,108,115,90,7,108,111,97,100,101,
-+ 114,115,114,215,0,0,0,114,7,0,0,0,114,102,1,0,
-+ 0,114,8,0,0,0,114,239,0,0,0,214,5,0,0,115,
-+ 20,0,0,0,4,4,12,1,26,1,6,1,10,2,10,1,
-+ 18,1,6,1,8,1,12,1,122,19,70,105,108,101,70,105,
-+ 110,100,101,114,46,95,95,105,110,105,116,95,95,99,1,0,
-+ 0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,
-+ 0,0,67,0,0,0,115,10,0,0,0,100,1,124,0,95,
-+ 0,100,2,83,0,41,3,122,31,73,110,118,97,108,105,100,
-+ 97,116,101,32,116,104,101,32,100,105,114,101,99,116,111,114,
-+ 121,32,109,116,105,109,101,46,114,133,0,0,0,78,41,1,
-+ 114,104,1,0,0,114,24,1,0,0,114,7,0,0,0,114,
-+ 7,0,0,0,114,8,0,0,0,114,85,1,0,0,230,5,
-+ 0,0,114,84,0,0,0,122,28,70,105,108,101,70,105,110,
-+ 100,101,114,46,105,110,118,97,108,105,100,97,116,101,95,99,
-+ 97,99,104,101,115,99,2,0,0,0,0,0,0,0,0,0,
-+ 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,54,
-+ 0,0,0,116,0,160,1,100,1,116,2,161,2,1,0,124,
-+ 0,160,3,124,1,161,1,125,2,124,2,100,2,117,0,114,
-+ 19,100,2,103,0,102,2,83,0,124,2,106,4,124,2,106,
-+ 5,112,25,103,0,102,2,83,0,41,3,122,197,84,114,121,
-+ 32,116,111,32,102,105,110,100,32,97,32,108,111,97,100,101,
-+ 114,32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,
-+ 105,101,100,32,109,111,100,117,108,101,44,32,111,114,32,116,
-+ 104,101,32,110,97,109,101,115,112,97,99,101,10,32,32,32,
-+ 32,32,32,32,32,112,97,99,107,97,103,101,32,112,111,114,
-+ 116,105,111,110,115,46,32,82,101,116,117,114,110,115,32,40,
-+ 108,111,97,100,101,114,44,32,108,105,115,116,45,111,102,45,
-+ 112,111,114,116,105,111,110,115,41,46,10,10,32,32,32,32,
- 32,32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,
- 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,
- 85,115,101,32,102,105,110,100,95,115,112,101,99,40,41,32,
- 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,
-- 32,32,122,101,80,97,116,104,70,105,110,100,101,114,46,102,
-- 105,110,100,95,109,111,100,117,108,101,40,41,32,105,115,32,
-+ 32,32,122,101,70,105,108,101,70,105,110,100,101,114,46,102,
-+ 105,110,100,95,108,111,97,100,101,114,40,41,32,105,115,32,
- 100,101,112,114,101,99,97,116,101,100,32,97,110,100,32,115,
- 108,97,116,101,100,32,102,111,114,32,114,101,109,111,118,97,
- 108,32,105,110,32,80,121,116,104,111,110,32,51,46,49,50,
- 59,32,117,115,101,32,102,105,110,100,95,115,112,101,99,40,
-- 41,32,105,110,115,116,101,97,100,78,114,227,0,0,0,114,
-- 228,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-- 0,0,0,114,229,0,0,0,175,5,0,0,115,14,0,0,
-- 0,6,8,2,2,4,254,12,3,8,1,4,1,6,1,122,
-- 22,80,97,116,104,70,105,110,100,101,114,46,102,105,110,100,
-- 95,109,111,100,117,108,101,99,0,0,0,0,0,0,0,0,
-- 0,0,0,0,3,0,0,0,4,0,0,0,79,0,0,0,
-- 115,28,0,0,0,100,1,100,2,108,0,109,1,125,2,1,
-- 0,124,2,106,2,124,0,105,0,124,1,164,1,142,1,83,
-- 0,41,3,97,32,1,0,0,10,32,32,32,32,32,32,32,
-- 32,70,105,110,100,32,100,105,115,116,114,105,98,117,116,105,
-- 111,110,115,46,10,10,32,32,32,32,32,32,32,32,82,101,
-- 116,117,114,110,32,97,110,32,105,116,101,114,97,98,108,101,
-- 32,111,102,32,97,108,108,32,68,105,115,116,114,105,98,117,
-- 116,105,111,110,32,105,110,115,116,97,110,99,101,115,32,99,
-- 97,112,97,98,108,101,32,111,102,10,32,32,32,32,32,32,
-- 32,32,108,111,97,100,105,110,103,32,116,104,101,32,109,101,
-- 116,97,100,97,116,97,32,102,111,114,32,112,97,99,107,97,
-- 103,101,115,32,109,97,116,99,104,105,110,103,32,96,96,99,
-- 111,110,116,101,120,116,46,110,97,109,101,96,96,10,32,32,
-- 32,32,32,32,32,32,40,111,114,32,97,108,108,32,110,97,
-- 109,101,115,32,105,102,32,96,96,78,111,110,101,96,96,32,
-- 105,110,100,105,99,97,116,101,100,41,32,97,108,111,110,103,
-- 32,116,104,101,32,112,97,116,104,115,32,105,110,32,116,104,
-- 101,32,108,105,115,116,10,32,32,32,32,32,32,32,32,111,
-- 102,32,100,105,114,101,99,116,111,114,105,101,115,32,96,96,
-- 99,111,110,116,101,120,116,46,112,97,116,104,96,96,46,10,
-- 32,32,32,32,32,32,32,32,114,0,0,0,0,41,1,218,
-- 18,77,101,116,97,100,97,116,97,80,97,116,104,70,105,110,
-- 100,101,114,41,3,90,18,105,109,112,111,114,116,108,105,98,
-- 46,109,101,116,97,100,97,116,97,114,94,1,0,0,218,18,
-- 102,105,110,100,95,100,105,115,116,114,105,98,117,116,105,111,
-- 110,115,41,3,114,144,0,0,0,114,145,0,0,0,114,94,
-- 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-- 0,0,114,95,1,0,0,191,5,0,0,115,4,0,0,0,
-- 12,10,16,1,122,29,80,97,116,104,70,105,110,100,101,114,
-- 46,102,105,110,100,95,100,105,115,116,114,105,98,117,116,105,
-- 111,110,115,114,69,0,0,0,114,230,0,0,0,41,14,114,
-- 150,0,0,0,114,149,0,0,0,114,151,0,0,0,114,152,
-- 0,0,0,114,233,0,0,0,114,80,1,0,0,114,86,1,
-- 0,0,114,234,0,0,0,114,89,1,0,0,114,90,1,0,
-- 0,114,93,1,0,0,114,226,0,0,0,114,229,0,0,0,
-- 114,95,1,0,0,114,7,0,0,0,114,7,0,0,0,114,
-- 7,0,0,0,114,8,0,0,0,114,79,1,0,0,46,5,
-- 0,0,115,36,0,0,0,8,0,4,2,2,2,10,1,2,
-- 12,10,1,2,12,10,1,2,21,10,1,2,20,12,1,2,
-- 31,12,1,2,23,12,1,2,15,14,1,114,79,1,0,0,
-- 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-- 0,3,0,0,0,64,0,0,0,115,90,0,0,0,101,0,
-- 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,
-- 90,4,100,4,100,5,132,0,90,5,101,6,90,7,100,6,
-- 100,7,132,0,90,8,100,8,100,9,132,0,90,9,100,19,
-- 100,11,100,12,132,1,90,10,100,13,100,14,132,0,90,11,
-- 101,12,100,15,100,16,132,0,131,1,90,13,100,17,100,18,
-- 132,0,90,14,100,10,83,0,41,20,218,10,70,105,108,101,
-- 70,105,110,100,101,114,122,172,70,105,108,101,45,98,97,115,
-- 101,100,32,102,105,110,100,101,114,46,10,10,32,32,32,32,
-- 73,110,116,101,114,97,99,116,105,111,110,115,32,119,105,116,
-- 104,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,
-- 109,32,97,114,101,32,99,97,99,104,101,100,32,102,111,114,
-- 32,112,101,114,102,111,114,109,97,110,99,101,44,32,98,101,
-- 105,110,103,10,32,32,32,32,114,101,102,114,101,115,104,101,
-- 100,32,119,104,101,110,32,116,104,101,32,100,105,114,101,99,
-- 116,111,114,121,32,116,104,101,32,102,105,110,100,101,114,32,
-- 105,115,32,104,97,110,100,108,105,110,103,32,104,97,115,32,
-- 98,101,101,110,32,109,111,100,105,102,105,101,100,46,10,10,
-- 32,32,32,32,99,2,0,0,0,0,0,0,0,0,0,0,
-- 0,5,0,0,0,6,0,0,0,7,0,0,0,115,112,0,
-- 0,0,103,0,125,3,124,2,68,0,93,16,92,2,137,0,
-- 125,4,124,3,160,0,135,0,102,1,100,1,100,2,132,8,
-- 124,4,68,0,131,1,161,1,1,0,113,4,124,3,124,0,
-- 95,1,124,1,112,27,100,3,124,0,95,2,116,3,124,0,
-- 106,2,131,1,115,43,116,4,116,5,160,6,161,0,124,0,
-- 106,2,131,2,124,0,95,2,100,4,124,0,95,7,116,8,
-- 131,0,124,0,95,9,116,8,131,0,124,0,95,10,100,5,
-- 83,0,41,6,122,154,73,110,105,116,105,97,108,105,122,101,
-- 32,119,105,116,104,32,116,104,101,32,112,97,116,104,32,116,
-- 111,32,115,101,97,114,99,104,32,111,110,32,97,110,100,32,
-- 97,32,118,97,114,105,97,98,108,101,32,110,117,109,98,101,
-- 114,32,111,102,10,32,32,32,32,32,32,32,32,50,45,116,
-- 117,112,108,101,115,32,99,111,110,116,97,105,110,105,110,103,
-- 32,116,104,101,32,108,111,97,100,101,114,32,97,110,100,32,
-- 116,104,101,32,102,105,108,101,32,115,117,102,102,105,120,101,
-- 115,32,116,104,101,32,108,111,97,100,101,114,10,32,32,32,
-- 32,32,32,32,32,114,101,99,111,103,110,105,122,101,115,46,
-+ 41,32,105,110,115,116,101,97,100,78,41,6,114,102,0,0,
-+ 0,114,103,0,0,0,114,104,0,0,0,114,229,0,0,0,
-+ 114,167,0,0,0,114,205,0,0,0,41,3,114,146,0,0,
-+ 0,114,166,0,0,0,114,213,0,0,0,114,7,0,0,0,
-+ 114,7,0,0,0,114,8,0,0,0,114,164,0,0,0,236,
-+ 5,0,0,115,14,0,0,0,6,7,2,2,4,254,10,3,
-+ 8,1,8,1,16,1,122,22,70,105,108,101,70,105,110,100,
-+ 101,114,46,102,105,110,100,95,108,111,97,100,101,114,99,6,
-+ 0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,6,
-+ 0,0,0,67,0,0,0,115,26,0,0,0,124,1,124,2,
-+ 124,3,131,2,125,6,116,0,124,2,124,3,124,6,124,4,
-+ 100,1,141,4,83,0,41,2,78,114,204,0,0,0,41,1,
-+ 114,216,0,0,0,41,7,114,146,0,0,0,114,214,0,0,
-+ 0,114,166,0,0,0,114,68,0,0,0,90,4,115,109,115,
-+ 108,114,228,0,0,0,114,167,0,0,0,114,7,0,0,0,
-+ 114,7,0,0,0,114,8,0,0,0,114,98,1,0,0,251,
-+ 5,0,0,115,8,0,0,0,10,1,8,1,2,1,6,255,
-+ 122,20,70,105,108,101,70,105,110,100,101,114,46,95,103,101,
-+ 116,95,115,112,101,99,78,99,3,0,0,0,0,0,0,0,
-+ 0,0,0,0,14,0,0,0,9,0,0,0,67,0,0,0,
-+ 115,122,1,0,0,100,1,125,3,124,1,160,0,100,2,161,
-+ 1,100,3,25,0,125,4,122,12,116,1,124,0,106,2,112,
-+ 17,116,3,160,4,161,0,131,1,106,5,125,5,87,0,110,
-+ 11,4,0,116,6,121,32,1,0,1,0,1,0,100,4,125,
-+ 5,89,0,110,1,119,0,124,5,124,0,106,7,107,3,114,
-+ 45,124,0,160,8,161,0,1,0,124,5,124,0,95,7,116,
-+ 9,131,0,114,56,124,0,106,10,125,6,124,4,160,11,161,
-+ 0,125,7,110,5,124,0,106,12,125,6,124,4,125,7,124,
-+ 7,124,6,118,0,114,108,116,13,124,0,106,2,124,4,131,
-+ 2,125,8,124,0,106,14,68,0,93,29,92,2,125,9,125,
-+ 10,100,5,124,9,23,0,125,11,116,13,124,8,124,11,131,
-+ 2,125,12,116,15,124,12,131,1,114,103,124,0,160,16,124,
-+ 10,124,1,124,12,124,8,103,1,124,2,161,5,2,0,1,
-+ 0,83,0,113,74,116,17,124,8,131,1,125,3,124,0,106,
-+ 14,68,0,93,55,92,2,125,9,125,10,122,10,116,13,124,
-+ 0,106,2,124,4,124,9,23,0,131,2,125,12,87,0,110,
-+ 11,4,0,116,18,121,136,1,0,1,0,1,0,89,0,1,
-+ 0,100,6,83,0,119,0,116,19,106,20,100,7,124,12,100,
-+ 3,100,8,141,3,1,0,124,7,124,9,23,0,124,6,118,
-+ 0,114,166,116,15,124,12,131,1,114,166,124,0,160,16,124,
-+ 10,124,1,124,12,100,6,124,2,161,5,2,0,1,0,83,
-+ 0,113,111,124,3,114,187,116,19,160,20,100,9,124,8,161,
-+ 2,1,0,116,19,160,21,124,1,100,6,161,2,125,13,124,
-+ 8,103,1,124,13,95,22,124,13,83,0,100,6,83,0,41,
-+ 10,122,111,84,114,121,32,116,111,32,102,105,110,100,32,97,
-+ 32,115,112,101,99,32,102,111,114,32,116,104,101,32,115,112,
-+ 101,99,105,102,105,101,100,32,109,111,100,117,108,101,46,10,
-+ 10,32,32,32,32,32,32,32,32,82,101,116,117,114,110,115,
-+ 32,116,104,101,32,109,97,116,99,104,105,110,103,32,115,112,
-+ 101,99,44,32,111,114,32,78,111,110,101,32,105,102,32,110,
-+ 111,116,32,102,111,117,110,100,46,10,32,32,32,32,32,32,
-+ 32,32,70,114,100,0,0,0,114,47,0,0,0,114,133,0,
-+ 0,0,114,239,0,0,0,78,122,9,116,114,121,105,110,103,
-+ 32,123,125,41,1,90,9,118,101,114,98,111,115,105,116,121,
-+ 122,25,112,111,115,115,105,98,108,101,32,110,97,109,101,115,
-+ 112,97,99,101,32,102,111,114,32,123,125,41,23,114,107,0,
-+ 0,0,114,78,0,0,0,114,68,0,0,0,114,21,0,0,
-+ 0,114,85,0,0,0,114,39,1,0,0,114,79,0,0,0,
-+ 114,104,1,0,0,218,11,95,102,105,108,108,95,99,97,99,
-+ 104,101,114,24,0,0,0,114,107,1,0,0,114,134,0,0,
-+ 0,114,106,1,0,0,114,70,0,0,0,114,103,1,0,0,
-+ 114,83,0,0,0,114,98,1,0,0,114,86,0,0,0,114,
-+ 114,0,0,0,114,162,0,0,0,114,176,0,0,0,114,210,
-+ 0,0,0,114,205,0,0,0,41,14,114,146,0,0,0,114,
-+ 166,0,0,0,114,228,0,0,0,90,12,105,115,95,110,97,
-+ 109,101,115,112,97,99,101,90,11,116,97,105,108,95,109,111,
-+ 100,117,108,101,114,196,0,0,0,90,5,99,97,99,104,101,
-+ 90,12,99,97,99,104,101,95,109,111,100,117,108,101,90,9,
-+ 98,97,115,101,95,112,97,116,104,114,49,1,0,0,114,214,
-+ 0,0,0,90,13,105,110,105,116,95,102,105,108,101,110,97,
-+ 109,101,90,9,102,117,108,108,95,112,97,116,104,114,213,0,
-+ 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-+ 0,114,229,0,0,0,0,6,0,0,115,86,0,0,0,4,
-+ 5,14,1,2,1,24,1,12,1,8,1,2,255,10,2,8,
-+ 1,6,1,6,2,6,1,10,1,6,2,4,1,8,2,12,
-+ 1,14,1,8,1,10,1,8,1,24,1,2,255,8,5,14,
-+ 2,2,1,20,1,12,1,8,1,2,255,16,2,12,1,8,
-+ 1,10,1,4,1,8,255,2,128,4,2,12,1,12,1,8,
-+ 1,4,1,4,1,122,20,70,105,108,101,70,105,110,100,101,
-+ 114,46,102,105,110,100,95,115,112,101,99,99,1,0,0,0,
-+ 0,0,0,0,0,0,0,0,9,0,0,0,10,0,0,0,
-+ 67,0,0,0,115,192,0,0,0,124,0,106,0,125,1,122,
-+ 11,116,1,160,2,124,1,112,11,116,1,160,3,161,0,161,
-+ 1,125,2,87,0,110,14,4,0,116,4,116,5,116,6,102,
-+ 3,121,28,1,0,1,0,1,0,103,0,125,2,89,0,110,
-+ 1,119,0,116,7,106,8,160,9,100,1,161,1,115,41,116,
-+ 10,124,2,131,1,124,0,95,11,110,37,116,10,131,0,125,
-+ 3,124,2,68,0,93,28,125,4,124,4,160,12,100,2,161,
-+ 1,92,3,125,5,125,6,125,7,124,6,114,67,100,3,160,
-+ 13,124,5,124,7,160,14,161,0,161,2,125,8,110,2,124,
-+ 5,125,8,124,3,160,15,124,8,161,1,1,0,113,46,124,
-+ 3,124,0,95,11,116,7,106,8,160,9,116,16,161,1,114,
-+ 94,100,4,100,5,132,0,124,2,68,0,131,1,124,0,95,
-+ 17,100,6,83,0,100,6,83,0,41,7,122,68,70,105,108,
-+ 108,32,116,104,101,32,99,97,99,104,101,32,111,102,32,112,
-+ 111,116,101,110,116,105,97,108,32,109,111,100,117,108,101,115,
-+ 32,97,110,100,32,112,97,99,107,97,103,101,115,32,102,111,
-+ 114,32,116,104,105,115,32,100,105,114,101,99,116,111,114,121,
-+ 46,114,14,0,0,0,114,100,0,0,0,114,91,0,0,0,
- 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
-- 0,3,0,0,0,51,0,0,0,115,24,0,0,0,129,0,
-- 124,0,93,7,125,1,124,1,136,0,102,2,86,0,1,0,
-- 113,2,100,0,83,0,114,69,0,0,0,114,7,0,0,0,
-- 114,43,1,0,0,169,1,114,164,0,0,0,114,7,0,0,
-- 0,114,8,0,0,0,114,9,0,0,0,220,5,0,0,115,
-- 4,0,0,0,2,128,22,0,122,38,70,105,108,101,70,105,
-- 110,100,101,114,46,95,95,105,110,105,116,95,95,46,60,108,
-- 111,99,97,108,115,62,46,60,103,101,110,101,120,112,114,62,
-- 114,97,0,0,0,114,130,0,0,0,78,41,11,114,191,0,
-- 0,0,218,8,95,108,111,97,100,101,114,115,114,65,0,0,
-- 0,114,86,0,0,0,114,67,0,0,0,114,18,0,0,0,
-- 114,82,0,0,0,218,11,95,112,97,116,104,95,109,116,105,
-- 109,101,218,3,115,101,116,218,11,95,112,97,116,104,95,99,
-- 97,99,104,101,218,19,95,114,101,108,97,120,101,100,95,112,
-- 97,116,104,95,99,97,99,104,101,41,5,114,143,0,0,0,
-- 114,65,0,0,0,218,14,108,111,97,100,101,114,95,100,101,
-- 116,97,105,108,115,90,7,108,111,97,100,101,114,115,114,212,
-- 0,0,0,114,7,0,0,0,114,97,1,0,0,114,8,0,
-- 0,0,114,236,0,0,0,214,5,0,0,115,20,0,0,0,
-- 4,4,12,1,26,1,6,1,10,2,10,1,18,1,6,1,
-- 8,1,12,1,122,19,70,105,108,101,70,105,110,100,101,114,
-- 46,95,95,105,110,105,116,95,95,99,1,0,0,0,0,0,
-- 0,0,0,0,0,0,1,0,0,0,2,0,0,0,67,0,
-- 0,0,115,10,0,0,0,100,1,124,0,95,0,100,2,83,
-- 0,41,3,122,31,73,110,118,97,108,105,100,97,116,101,32,
-- 116,104,101,32,100,105,114,101,99,116,111,114,121,32,109,116,
-- 105,109,101,46,114,130,0,0,0,78,41,1,114,99,1,0,
-- 0,114,21,1,0,0,114,7,0,0,0,114,7,0,0,0,
-- 114,8,0,0,0,114,80,1,0,0,230,5,0,0,114,81,
-- 0,0,0,122,28,70,105,108,101,70,105,110,100,101,114,46,
-- 105,110,118,97,108,105,100,97,116,101,95,99,97,99,104,101,
-- 115,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,
-- 0,0,4,0,0,0,67,0,0,0,115,54,0,0,0,116,
-- 0,160,1,100,1,116,2,161,2,1,0,124,0,160,3,124,
-- 1,161,1,125,2,124,2,100,2,117,0,114,19,100,2,103,
-- 0,102,2,83,0,124,2,106,4,124,2,106,5,112,25,103,
-- 0,102,2,83,0,41,3,122,197,84,114,121,32,116,111,32,
-- 102,105,110,100,32,97,32,108,111,97,100,101,114,32,102,111,
-- 114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,
-- 109,111,100,117,108,101,44,32,111,114,32,116,104,101,32,110,
-- 97,109,101,115,112,97,99,101,10,32,32,32,32,32,32,32,
-- 32,112,97,99,107,97,103,101,32,112,111,114,116,105,111,110,
-- 115,46,32,82,101,116,117,114,110,115,32,40,108,111,97,100,
-- 101,114,44,32,108,105,115,116,45,111,102,45,112,111,114,116,
-- 105,111,110,115,41,46,10,10,32,32,32,32,32,32,32,32,
-- 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,
-- 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,
-- 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,
-- 101,97,100,46,10,10,32,32,32,32,32,32,32,32,122,101,
-- 70,105,108,101,70,105,110,100,101,114,46,102,105,110,100,95,
-- 108,111,97,100,101,114,40,41,32,105,115,32,100,101,112,114,
-- 101,99,97,116,101,100,32,97,110,100,32,115,108,97,116,101,
-- 100,32,102,111,114,32,114,101,109,111,118,97,108,32,105,110,
-- 32,80,121,116,104,111,110,32,51,46,49,50,59,32,117,115,
-- 101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,
-- 115,116,101,97,100,78,41,6,114,99,0,0,0,114,100,0,
-- 0,0,114,101,0,0,0,114,226,0,0,0,114,164,0,0,
-- 0,114,202,0,0,0,41,3,114,143,0,0,0,114,163,0,
-- 0,0,114,210,0,0,0,114,7,0,0,0,114,7,0,0,
-- 0,114,8,0,0,0,114,161,0,0,0,236,5,0,0,115,
-- 14,0,0,0,6,7,2,2,4,254,10,3,8,1,8,1,
-- 16,1,122,22,70,105,108,101,70,105,110,100,101,114,46,102,
-- 105,110,100,95,108,111,97,100,101,114,99,6,0,0,0,0,
-- 0,0,0,0,0,0,0,7,0,0,0,6,0,0,0,67,
-- 0,0,0,115,26,0,0,0,124,1,124,2,124,3,131,2,
-- 125,6,116,0,124,2,124,3,124,6,124,4,100,1,141,4,
-- 83,0,41,2,78,114,201,0,0,0,41,1,114,213,0,0,
-- 0,41,7,114,143,0,0,0,114,211,0,0,0,114,163,0,
-- 0,0,114,65,0,0,0,90,4,115,109,115,108,114,225,0,
-- 0,0,114,164,0,0,0,114,7,0,0,0,114,7,0,0,
-- 0,114,8,0,0,0,114,93,1,0,0,251,5,0,0,115,
-- 8,0,0,0,10,1,8,1,2,1,6,255,122,20,70,105,
-- 108,101,70,105,110,100,101,114,46,95,103,101,116,95,115,112,
-- 101,99,78,99,3,0,0,0,0,0,0,0,0,0,0,0,
-- 14,0,0,0,9,0,0,0,67,0,0,0,115,122,1,0,
-- 0,100,1,125,3,124,1,160,0,100,2,161,1,100,3,25,
-- 0,125,4,122,12,116,1,124,0,106,2,112,17,116,3,160,
-- 4,161,0,131,1,106,5,125,5,87,0,110,11,4,0,116,
-- 6,121,32,1,0,1,0,1,0,100,4,125,5,89,0,110,
-- 1,119,0,124,5,124,0,106,7,107,3,114,45,124,0,160,
-- 8,161,0,1,0,124,5,124,0,95,7,116,9,131,0,114,
-- 56,124,0,106,10,125,6,124,4,160,11,161,0,125,7,110,
-- 5,124,0,106,12,125,6,124,4,125,7,124,7,124,6,118,
-- 0,114,108,116,13,124,0,106,2,124,4,131,2,125,8,124,
-- 0,106,14,68,0,93,29,92,2,125,9,125,10,100,5,124,
-- 9,23,0,125,11,116,13,124,8,124,11,131,2,125,12,116,
-- 15,124,12,131,1,114,103,124,0,160,16,124,10,124,1,124,
-- 12,124,8,103,1,124,2,161,5,2,0,1,0,83,0,113,
-- 74,116,17,124,8,131,1,125,3,124,0,106,14,68,0,93,
-- 55,92,2,125,9,125,10,122,10,116,13,124,0,106,2,124,
-- 4,124,9,23,0,131,2,125,12,87,0,110,11,4,0,116,
-- 18,121,136,1,0,1,0,1,0,89,0,1,0,100,6,83,
-- 0,119,0,116,19,106,20,100,7,124,12,100,3,100,8,141,
-- 3,1,0,124,7,124,9,23,0,124,6,118,0,114,166,116,
-- 15,124,12,131,1,114,166,124,0,160,16,124,10,124,1,124,
-- 12,100,6,124,2,161,5,2,0,1,0,83,0,113,111,124,
-- 3,114,187,116,19,160,20,100,9,124,8,161,2,1,0,116,
-- 19,160,21,124,1,100,6,161,2,125,13,124,8,103,1,124,
-- 13,95,22,124,13,83,0,100,6,83,0,41,10,122,111,84,
-- 114,121,32,116,111,32,102,105,110,100,32,97,32,115,112,101,
-- 99,32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,
-- 105,101,100,32,109,111,100,117,108,101,46,10,10,32,32,32,
-- 32,32,32,32,32,82,101,116,117,114,110,115,32,116,104,101,
-- 32,109,97,116,99,104,105,110,103,32,115,112,101,99,44,32,
-- 111,114,32,78,111,110,101,32,105,102,32,110,111,116,32,102,
-- 111,117,110,100,46,10,32,32,32,32,32,32,32,32,70,114,
-- 97,0,0,0,114,44,0,0,0,114,130,0,0,0,114,236,
-- 0,0,0,78,122,9,116,114,121,105,110,103,32,123,125,41,
-- 1,90,9,118,101,114,98,111,115,105,116,121,122,25,112,111,
-- 115,115,105,98,108,101,32,110,97,109,101,115,112,97,99,101,
-- 32,102,111,114,32,123,125,41,23,114,104,0,0,0,114,75,
-- 0,0,0,114,65,0,0,0,114,18,0,0,0,114,82,0,
-- 0,0,114,35,1,0,0,114,76,0,0,0,114,99,1,0,
-- 0,218,11,95,102,105,108,108,95,99,97,99,104,101,114,21,
-- 0,0,0,114,102,1,0,0,114,131,0,0,0,114,101,1,
-- 0,0,114,67,0,0,0,114,98,1,0,0,114,80,0,0,
-- 0,114,93,1,0,0,114,83,0,0,0,114,111,0,0,0,
-- 114,159,0,0,0,114,173,0,0,0,114,207,0,0,0,114,
-- 202,0,0,0,41,14,114,143,0,0,0,114,163,0,0,0,
-- 114,225,0,0,0,90,12,105,115,95,110,97,109,101,115,112,
-- 97,99,101,90,11,116,97,105,108,95,109,111,100,117,108,101,
-- 114,193,0,0,0,90,5,99,97,99,104,101,90,12,99,97,
-- 99,104,101,95,109,111,100,117,108,101,90,9,98,97,115,101,
-- 95,112,97,116,104,114,44,1,0,0,114,211,0,0,0,90,
-- 13,105,110,105,116,95,102,105,108,101,110,97,109,101,90,9,
-- 102,117,108,108,95,112,97,116,104,114,210,0,0,0,114,7,
-- 0,0,0,114,7,0,0,0,114,8,0,0,0,114,226,0,
-- 0,0,0,6,0,0,115,86,0,0,0,4,5,14,1,2,
-- 1,24,1,12,1,8,1,2,255,10,2,8,1,6,1,6,
-- 2,6,1,10,1,6,2,4,1,8,2,12,1,14,1,8,
-- 1,10,1,8,1,24,1,2,255,8,5,14,2,2,1,20,
-- 1,12,1,8,1,2,255,16,2,12,1,8,1,10,1,4,
-- 1,8,255,2,128,4,2,12,1,12,1,8,1,4,1,4,
-- 1,122,20,70,105,108,101,70,105,110,100,101,114,46,102,105,
-- 110,100,95,115,112,101,99,99,1,0,0,0,0,0,0,0,
-- 0,0,0,0,9,0,0,0,10,0,0,0,67,0,0,0,
-- 115,192,0,0,0,124,0,106,0,125,1,122,11,116,1,160,
-- 2,124,1,112,11,116,1,160,3,161,0,161,1,125,2,87,
-- 0,110,14,4,0,116,4,116,5,116,6,102,3,121,28,1,
-- 0,1,0,1,0,103,0,125,2,89,0,110,1,119,0,116,
-- 7,106,8,160,9,100,1,161,1,115,41,116,10,124,2,131,
-- 1,124,0,95,11,110,37,116,10,131,0,125,3,124,2,68,
-- 0,93,28,125,4,124,4,160,12,100,2,161,1,92,3,125,
-- 5,125,6,125,7,124,6,114,67,100,3,160,13,124,5,124,
-- 7,160,14,161,0,161,2,125,8,110,2,124,5,125,8,124,
-- 3,160,15,124,8,161,1,1,0,113,46,124,3,124,0,95,
-- 11,116,7,106,8,160,9,116,16,161,1,114,94,100,4,100,
-- 5,132,0,124,2,68,0,131,1,124,0,95,17,100,6,83,
-- 0,100,6,83,0,41,7,122,68,70,105,108,108,32,116,104,
-- 101,32,99,97,99,104,101,32,111,102,32,112,111,116,101,110,
-- 116,105,97,108,32,109,111,100,117,108,101,115,32,97,110,100,
-- 32,112,97,99,107,97,103,101,115,32,102,111,114,32,116,104,
-- 105,115,32,100,105,114,101,99,116,111,114,121,46,114,14,0,
-- 0,0,114,97,0,0,0,114,88,0,0,0,99,1,0,0,
-- 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,
-- 0,83,0,0,0,115,20,0,0,0,104,0,124,0,93,6,
-- 125,1,124,1,160,0,161,0,146,2,113,2,83,0,114,7,
-- 0,0,0,41,1,114,131,0,0,0,41,2,114,5,0,0,
-- 0,90,2,102,110,114,7,0,0,0,114,7,0,0,0,114,
-- 8,0,0,0,114,13,0,0,0,80,6,0,0,115,2,0,
-- 0,0,20,0,122,41,70,105,108,101,70,105,110,100,101,114,
-- 46,95,102,105,108,108,95,99,97,99,104,101,46,60,108,111,
-- 99,97,108,115,62,46,60,115,101,116,99,111,109,112,62,78,
-- 41,18,114,65,0,0,0,114,18,0,0,0,90,7,108,105,
-- 115,116,100,105,114,114,82,0,0,0,114,87,1,0,0,218,
-- 15,80,101,114,109,105,115,115,105,111,110,69,114,114,111,114,
-- 218,18,78,111,116,65,68,105,114,101,99,116,111,114,121,69,
-- 114,114,111,114,114,15,0,0,0,114,25,0,0,0,114,26,
-- 0,0,0,114,100,1,0,0,114,101,1,0,0,114,126,0,
-- 0,0,114,89,0,0,0,114,131,0,0,0,218,3,97,100,
-- 100,114,27,0,0,0,114,102,1,0,0,41,9,114,143,0,
-- 0,0,114,65,0,0,0,90,8,99,111,110,116,101,110,116,
-- 115,90,21,108,111,119,101,114,95,115,117,102,102,105,120,95,
-- 99,111,110,116,101,110,116,115,114,72,1,0,0,114,141,0,
-- 0,0,114,56,1,0,0,114,44,1,0,0,90,8,110,101,
-- 119,95,110,97,109,101,114,7,0,0,0,114,7,0,0,0,
-- 114,8,0,0,0,114,104,1,0,0,51,6,0,0,115,38,
-- 0,0,0,6,2,2,1,22,1,18,1,8,3,2,253,12,
-- 6,12,1,6,7,8,1,16,1,4,1,18,1,4,2,12,
-- 1,6,1,12,1,20,1,4,255,122,22,70,105,108,101,70,
-- 105,110,100,101,114,46,95,102,105,108,108,95,99,97,99,104,
-- 101,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,
-- 0,0,3,0,0,0,7,0,0,0,115,18,0,0,0,135,
-- 0,135,1,102,2,100,1,100,2,132,8,125,2,124,2,83,
-- 0,41,3,97,20,1,0,0,65,32,99,108,97,115,115,32,
-- 109,101,116,104,111,100,32,119,104,105,99,104,32,114,101,116,
-- 117,114,110,115,32,97,32,99,108,111,115,117,114,101,32,116,
-- 111,32,117,115,101,32,111,110,32,115,121,115,46,112,97,116,
-- 104,95,104,111,111,107,10,32,32,32,32,32,32,32,32,119,
-- 104,105,99,104,32,119,105,108,108,32,114,101,116,117,114,110,
-- 32,97,110,32,105,110,115,116,97,110,99,101,32,117,115,105,
-- 110,103,32,116,104,101,32,115,112,101,99,105,102,105,101,100,
-- 32,108,111,97,100,101,114,115,32,97,110,100,32,116,104,101,
-- 32,112,97,116,104,10,32,32,32,32,32,32,32,32,99,97,
-+ 0,4,0,0,0,83,0,0,0,115,20,0,0,0,104,0,
-+ 124,0,93,6,125,1,124,1,160,0,161,0,146,2,113,2,
-+ 83,0,114,7,0,0,0,41,1,114,134,0,0,0,41,2,
-+ 114,5,0,0,0,90,2,102,110,114,7,0,0,0,114,7,
-+ 0,0,0,114,8,0,0,0,114,13,0,0,0,80,6,0,
-+ 0,115,2,0,0,0,20,0,122,41,70,105,108,101,70,105,
-+ 110,100,101,114,46,95,102,105,108,108,95,99,97,99,104,101,
-+ 46,60,108,111,99,97,108,115,62,46,60,115,101,116,99,111,
-+ 109,112,62,78,41,18,114,68,0,0,0,114,21,0,0,0,
-+ 90,7,108,105,115,116,100,105,114,114,85,0,0,0,114,92,
-+ 1,0,0,218,15,80,101,114,109,105,115,115,105,111,110,69,
-+ 114,114,111,114,218,18,78,111,116,65,68,105,114,101,99,116,
-+ 111,114,121,69,114,114,111,114,114,18,0,0,0,114,28,0,
-+ 0,0,114,29,0,0,0,114,105,1,0,0,114,106,1,0,
-+ 0,114,129,0,0,0,114,92,0,0,0,114,134,0,0,0,
-+ 218,3,97,100,100,114,30,0,0,0,114,107,1,0,0,41,
-+ 9,114,146,0,0,0,114,68,0,0,0,90,8,99,111,110,
-+ 116,101,110,116,115,90,21,108,111,119,101,114,95,115,117,102,
-+ 102,105,120,95,99,111,110,116,101,110,116,115,114,77,1,0,
-+ 0,114,144,0,0,0,114,61,1,0,0,114,49,1,0,0,
-+ 90,8,110,101,119,95,110,97,109,101,114,7,0,0,0,114,
-+ 7,0,0,0,114,8,0,0,0,114,109,1,0,0,51,6,
-+ 0,0,115,38,0,0,0,6,2,2,1,22,1,18,1,8,
-+ 3,2,253,12,6,12,1,6,7,8,1,16,1,4,1,18,
-+ 1,4,2,12,1,6,1,12,1,20,1,4,255,122,22,70,
-+ 105,108,101,70,105,110,100,101,114,46,95,102,105,108,108,95,
-+ 99,97,99,104,101,99,1,0,0,0,0,0,0,0,0,0,
-+ 0,0,3,0,0,0,3,0,0,0,7,0,0,0,115,18,
-+ 0,0,0,135,0,135,1,102,2,100,1,100,2,132,8,125,
-+ 2,124,2,83,0,41,3,97,20,1,0,0,65,32,99,108,
-+ 97,115,115,32,109,101,116,104,111,100,32,119,104,105,99,104,
-+ 32,114,101,116,117,114,110,115,32,97,32,99,108,111,115,117,
-+ 114,101,32,116,111,32,117,115,101,32,111,110,32,115,121,115,
-+ 46,112,97,116,104,95,104,111,111,107,10,32,32,32,32,32,
-+ 32,32,32,119,104,105,99,104,32,119,105,108,108,32,114,101,
-+ 116,117,114,110,32,97,110,32,105,110,115,116,97,110,99,101,
-+ 32,117,115,105,110,103,32,116,104,101,32,115,112,101,99,105,
-+ 102,105,101,100,32,108,111,97,100,101,114,115,32,97,110,100,
-+ 32,116,104,101,32,112,97,116,104,10,32,32,32,32,32,32,
-+ 32,32,99,97,108,108,101,100,32,111,110,32,116,104,101,32,
-+ 99,108,111,115,117,114,101,46,10,10,32,32,32,32,32,32,
-+ 32,32,73,102,32,116,104,101,32,112,97,116,104,32,99,97,
- 108,108,101,100,32,111,110,32,116,104,101,32,99,108,111,115,
-- 117,114,101,46,10,10,32,32,32,32,32,32,32,32,73,102,
-- 32,116,104,101,32,112,97,116,104,32,99,97,108,108,101,100,
-- 32,111,110,32,116,104,101,32,99,108,111,115,117,114,101,32,
-- 105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,
-- 114,121,44,32,73,109,112,111,114,116,69,114,114,111,114,32,
-- 105,115,10,32,32,32,32,32,32,32,32,114,97,105,115,101,
-- 100,46,10,10,32,32,32,32,32,32,32,32,99,1,0,0,
-- 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,
-- 0,19,0,0,0,115,36,0,0,0,116,0,124,0,131,1,
-- 115,10,116,1,100,1,124,0,100,2,141,2,130,1,136,0,
-- 124,0,103,1,136,1,162,1,82,0,142,0,83,0,41,3,
-- 122,45,80,97,116,104,32,104,111,111,107,32,102,111,114,32,
-- 105,109,112,111,114,116,108,105,98,46,109,97,99,104,105,110,
-- 101,114,121,46,70,105,108,101,70,105,110,100,101,114,46,122,
-- 30,111,110,108,121,32,100,105,114,101,99,116,111,114,105,101,
-- 115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,114,
-- 71,0,0,0,41,2,114,83,0,0,0,114,142,0,0,0,
-- 114,71,0,0,0,169,2,114,221,0,0,0,114,103,1,0,
-- 0,114,7,0,0,0,114,8,0,0,0,218,24,112,97,116,
-- 104,95,104,111,111,107,95,102,111,114,95,70,105,108,101,70,
-- 105,110,100,101,114,92,6,0,0,115,6,0,0,0,8,2,
-- 12,1,16,1,122,54,70,105,108,101,70,105,110,100,101,114,
-- 46,112,97,116,104,95,104,111,111,107,46,60,108,111,99,97,
-- 108,115,62,46,112,97,116,104,95,104,111,111,107,95,102,111,
-- 114,95,70,105,108,101,70,105,110,100,101,114,114,7,0,0,
-- 0,41,3,114,221,0,0,0,114,103,1,0,0,114,109,1,
-- 0,0,114,7,0,0,0,114,108,1,0,0,114,8,0,0,
-- 0,218,9,112,97,116,104,95,104,111,111,107,82,6,0,0,
-- 115,4,0,0,0,14,10,4,6,122,20,70,105,108,101,70,
-- 105,110,100,101,114,46,112,97,116,104,95,104,111,111,107,99,
-- 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
-- 3,0,0,0,67,0,0,0,114,69,1,0,0,41,2,78,
-- 122,16,70,105,108,101,70,105,110,100,101,114,40,123,33,114,
-- 125,41,41,2,114,89,0,0,0,114,65,0,0,0,114,21,
-- 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-- 0,0,114,70,1,0,0,100,6,0,0,114,63,1,0,0,
-- 122,19,70,105,108,101,70,105,110,100,101,114,46,95,95,114,
-- 101,112,114,95,95,114,69,0,0,0,41,15,114,150,0,0,
-- 0,114,149,0,0,0,114,151,0,0,0,114,152,0,0,0,
-- 114,236,0,0,0,114,80,1,0,0,114,167,0,0,0,114,
-- 229,0,0,0,114,161,0,0,0,114,93,1,0,0,114,226,
-- 0,0,0,114,104,1,0,0,114,234,0,0,0,114,110,1,
-- 0,0,114,70,1,0,0,114,7,0,0,0,114,7,0,0,
-- 0,114,7,0,0,0,114,8,0,0,0,114,96,1,0,0,
-- 205,5,0,0,115,24,0,0,0,8,0,4,2,8,7,8,
-- 16,4,4,8,2,8,15,10,5,8,51,2,31,10,1,12,
-- 17,114,96,1,0,0,99,4,0,0,0,0,0,0,0,0,
-+ 117,114,101,32,105,115,32,110,111,116,32,97,32,100,105,114,
-+ 101,99,116,111,114,121,44,32,73,109,112,111,114,116,69,114,
-+ 114,111,114,32,105,115,10,32,32,32,32,32,32,32,32,114,
-+ 97,105,115,101,100,46,10,10,32,32,32,32,32,32,32,32,
-+ 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
-+ 0,4,0,0,0,19,0,0,0,115,36,0,0,0,116,0,
-+ 124,0,131,1,115,10,116,1,100,1,124,0,100,2,141,2,
-+ 130,1,136,0,124,0,103,1,136,1,162,1,82,0,142,0,
-+ 83,0,41,3,122,45,80,97,116,104,32,104,111,111,107,32,
-+ 102,111,114,32,105,109,112,111,114,116,108,105,98,46,109,97,
-+ 99,104,105,110,101,114,121,46,70,105,108,101,70,105,110,100,
-+ 101,114,46,122,30,111,110,108,121,32,100,105,114,101,99,116,
-+ 111,114,105,101,115,32,97,114,101,32,115,117,112,112,111,114,
-+ 116,101,100,114,74,0,0,0,41,2,114,86,0,0,0,114,
-+ 145,0,0,0,114,74,0,0,0,169,2,114,224,0,0,0,
-+ 114,108,1,0,0,114,7,0,0,0,114,8,0,0,0,218,
-+ 24,112,97,116,104,95,104,111,111,107,95,102,111,114,95,70,
-+ 105,108,101,70,105,110,100,101,114,92,6,0,0,115,6,0,
-+ 0,0,8,2,12,1,16,1,122,54,70,105,108,101,70,105,
-+ 110,100,101,114,46,112,97,116,104,95,104,111,111,107,46,60,
-+ 108,111,99,97,108,115,62,46,112,97,116,104,95,104,111,111,
-+ 107,95,102,111,114,95,70,105,108,101,70,105,110,100,101,114,
-+ 114,7,0,0,0,41,3,114,224,0,0,0,114,108,1,0,
-+ 0,114,114,1,0,0,114,7,0,0,0,114,113,1,0,0,
-+ 114,8,0,0,0,218,9,112,97,116,104,95,104,111,111,107,
-+ 82,6,0,0,115,4,0,0,0,14,10,4,6,122,20,70,
-+ 105,108,101,70,105,110,100,101,114,46,112,97,116,104,95,104,
-+ 111,111,107,99,1,0,0,0,0,0,0,0,0,0,0,0,
-+ 1,0,0,0,3,0,0,0,67,0,0,0,114,74,1,0,
-+ 0,41,2,78,122,16,70,105,108,101,70,105,110,100,101,114,
-+ 40,123,33,114,125,41,41,2,114,92,0,0,0,114,68,0,
-+ 0,0,114,24,1,0,0,114,7,0,0,0,114,7,0,0,
-+ 0,114,8,0,0,0,114,75,1,0,0,100,6,0,0,114,
-+ 68,1,0,0,122,19,70,105,108,101,70,105,110,100,101,114,
-+ 46,95,95,114,101,112,114,95,95,114,72,0,0,0,41,15,
-+ 114,153,0,0,0,114,152,0,0,0,114,154,0,0,0,114,
-+ 155,0,0,0,114,239,0,0,0,114,85,1,0,0,114,170,
-+ 0,0,0,114,232,0,0,0,114,164,0,0,0,114,98,1,
-+ 0,0,114,229,0,0,0,114,109,1,0,0,114,237,0,0,
-+ 0,114,115,1,0,0,114,75,1,0,0,114,7,0,0,0,
-+ 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
-+ 101,1,0,0,205,5,0,0,115,24,0,0,0,8,0,4,
-+ 2,8,7,8,16,4,4,8,2,8,15,10,5,8,51,2,
-+ 31,10,1,12,17,114,101,1,0,0,99,0,0,0,0,0,
-+ 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64,
-+ 0,0,0,115,24,0,0,0,101,0,90,1,100,0,90,2,
-+ 100,1,90,3,100,2,100,3,132,0,90,4,100,4,83,0,
-+ 41,5,218,20,65,112,112,108,101,70,114,97,109,101,119,111,
-+ 114,107,76,111,97,100,101,114,122,122,65,32,108,111,97,100,
-+ 101,114,32,102,111,114,32,109,111,100,117,108,101,115,32,116,
-+ 104,97,116,32,104,97,118,101,32,98,101,101,110,32,112,97,
-+ 99,107,97,103,101,100,32,97,115,32,102,114,97,109,101,119,
-+ 111,114,107,115,32,102,111,114,10,32,32,32,32,99,111,109,
-+ 112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,
-+ 65,112,112,108,101,39,115,32,105,79,83,32,65,112,112,32,
-+ 83,116,111,114,101,32,112,111,108,105,99,105,101,115,46,10,
-+ 32,32,32,32,99,2,0,0,0,0,0,0,0,0,0,0,
-+ 0,8,0,0,0,8,0,0,0,67,0,0,0,115,254,0,
-+ 0,0,124,1,106,0,160,1,100,1,161,1,114,50,116,2,
-+ 160,3,124,1,106,0,100,2,161,2,143,16,125,2,124,2,
-+ 160,4,161,0,160,5,161,0,160,6,161,0,125,3,87,0,
-+ 100,0,4,0,4,0,131,3,1,0,110,8,49,0,115,32,
-+ 119,1,1,0,1,0,1,0,89,0,1,0,116,7,116,8,
-+ 106,9,131,1,100,3,25,0,125,4,116,10,124,4,124,3,
-+ 131,2,124,1,95,0,124,0,106,11,160,1,100,1,161,1,
-+ 114,60,124,0,106,11,125,5,110,45,116,2,160,3,124,0,
-+ 106,11,100,4,23,0,100,2,161,2,143,28,125,2,124,2,
-+ 160,4,161,0,160,5,161,0,160,6,161,0,125,6,116,7,
-+ 116,8,106,9,131,1,100,3,25,0,125,4,116,10,124,4,
-+ 124,6,131,2,125,5,87,0,100,0,4,0,4,0,131,3,
-+ 1,0,110,8,49,0,115,100,119,1,1,0,1,0,1,0,
-+ 89,0,1,0,116,12,160,13,116,14,106,15,124,1,161,2,
-+ 125,7,116,12,160,16,100,5,124,1,106,17,124,1,106,0,
-+ 124,5,161,4,1,0,124,5,124,7,95,18,124,7,83,0,
-+ 41,6,78,250,6,46,102,119,111,114,107,114,32,1,0,0,
-+ 114,0,0,0,0,122,7,46,111,114,105,103,105,110,122,66,
-+ 65,112,112,108,101,32,102,114,97,109,101,119,111,114,107,32,
-+ 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,
-+ 32,123,33,114,125,32,108,111,97,100,101,100,32,102,114,111,
-+ 109,32,123,33,114,125,32,40,112,97,116,104,32,123,33,114,
-+ 125,41,41,19,114,208,0,0,0,114,61,0,0,0,114,94,
-+ 0,0,0,114,95,0,0,0,114,34,1,0,0,114,200,0,
-+ 0,0,218,5,115,116,114,105,112,114,77,0,0,0,114,18,
-+ 0,0,0,90,10,101,120,101,99,117,116,97,98,108,101,114,
-+ 70,0,0,0,114,68,0,0,0,114,162,0,0,0,114,245,
-+ 0,0,0,114,190,0,0,0,114,46,1,0,0,114,176,0,
-+ 0,0,114,144,0,0,0,218,8,95,95,102,105,108,101,95,
-+ 95,41,8,114,146,0,0,0,114,213,0,0,0,114,97,0,
-+ 0,0,90,16,102,114,97,109,101,119,111,114,107,95,98,105,
-+ 110,97,114,121,90,11,98,117,110,100,108,101,95,112,97,116,
-+ 104,114,68,0,0,0,114,208,0,0,0,114,247,0,0,0,
-+ 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
-+ 242,0,0,0,108,6,0,0,115,44,0,0,0,12,5,16,
-+ 1,18,1,28,255,14,2,12,1,12,5,8,1,20,2,16,
-+ 1,14,1,12,1,28,253,14,5,4,2,2,1,4,1,4,
-+ 1,2,1,4,252,6,8,4,2,122,34,65,112,112,108,101,
-+ 70,114,97,109,101,119,111,114,107,76,111,97,100,101,114,46,
-+ 99,114,101,97,116,101,95,109,111,100,117,108,101,78,41,5,
-+ 114,153,0,0,0,114,152,0,0,0,114,154,0,0,0,114,
-+ 155,0,0,0,114,242,0,0,0,114,7,0,0,0,114,7,
-+ 0,0,0,114,7,0,0,0,114,8,0,0,0,114,116,1,
-+ 0,0,104,6,0,0,115,6,0,0,0,8,0,4,1,12,
-+ 3,114,116,1,0,0,99,4,0,0,0,0,0,0,0,0,
- 0,0,0,6,0,0,0,8,0,0,0,67,0,0,0,115,
- 144,0,0,0,124,0,160,0,100,1,161,1,125,4,124,0,
- 160,0,100,2,161,1,125,5,124,4,115,33,124,5,114,18,
-@@ -2664,108 +2725,125 @@
- 60,0,124,3,124,0,100,5,60,0,87,0,100,0,83,0,
- 4,0,116,5,121,71,1,0,1,0,1,0,89,0,100,0,
- 83,0,119,0,41,6,78,218,10,95,95,108,111,97,100,101,
-- 114,95,95,218,8,95,95,115,112,101,99,95,95,114,97,1,
-- 0,0,90,8,95,95,102,105,108,101,95,95,90,10,95,95,
-- 99,97,99,104,101,100,95,95,41,6,218,3,103,101,116,114,
-- 164,0,0,0,114,41,1,0,0,114,34,1,0,0,114,213,
-- 0,0,0,218,9,69,120,99,101,112,116,105,111,110,41,6,
-- 90,2,110,115,114,141,0,0,0,90,8,112,97,116,104,110,
-- 97,109,101,90,9,99,112,97,116,104,110,97,109,101,114,164,
-- 0,0,0,114,210,0,0,0,114,7,0,0,0,114,7,0,
-- 0,0,114,8,0,0,0,218,14,95,102,105,120,95,117,112,
-- 95,109,111,100,117,108,101,106,6,0,0,115,36,0,0,0,
-- 10,2,10,1,4,1,4,1,8,1,8,1,12,1,10,2,
-- 4,1,14,1,2,1,8,1,8,1,8,1,14,1,12,1,
-- 6,2,2,254,114,115,1,0,0,99,0,0,0,0,0,0,
-- 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,
-- 0,0,115,38,0,0,0,116,0,116,1,160,2,161,0,102,
-- 2,125,0,116,3,116,4,102,2,125,1,116,5,116,6,102,
-- 2,125,2,124,0,124,1,124,2,103,3,83,0,41,1,122,
-- 95,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,
-- 111,102,32,102,105,108,101,45,98,97,115,101,100,32,109,111,
-- 100,117,108,101,32,108,111,97,100,101,114,115,46,10,10,32,
-- 32,32,32,69,97,99,104,32,105,116,101,109,32,105,115,32,
-- 97,32,116,117,112,108,101,32,40,108,111,97,100,101,114,44,
-- 32,115,117,102,102,105,120,101,115,41,46,10,32,32,32,32,
-- 41,7,114,30,1,0,0,114,187,0,0,0,218,18,101,120,
-- 116,101,110,115,105,111,110,95,115,117,102,102,105,120,101,115,
-- 114,34,1,0,0,114,127,0,0,0,114,41,1,0,0,114,
-- 113,0,0,0,41,3,90,10,101,120,116,101,110,115,105,111,
-- 110,115,90,6,115,111,117,114,99,101,90,8,98,121,116,101,
-- 99,111,100,101,114,7,0,0,0,114,7,0,0,0,114,8,
-- 0,0,0,114,208,0,0,0,129,6,0,0,115,8,0,0,
-- 0,12,5,8,1,8,1,10,1,114,208,0,0,0,99,1,
-- 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,
-- 0,0,0,67,0,0,0,115,8,0,0,0,124,0,97,0,
-- 100,0,83,0,114,69,0,0,0,41,1,114,159,0,0,0,
-- 41,1,218,17,95,98,111,111,116,115,116,114,97,112,95,109,
-- 111,100,117,108,101,114,7,0,0,0,114,7,0,0,0,114,
-- 8,0,0,0,218,21,95,115,101,116,95,98,111,111,116,115,
-- 116,114,97,112,95,109,111,100,117,108,101,140,6,0,0,115,
-- 2,0,0,0,8,2,114,118,1,0,0,99,1,0,0,0,
-- 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,
-- 67,0,0,0,115,50,0,0,0,116,0,124,0,131,1,1,
-- 0,116,1,131,0,125,1,116,2,106,3,160,4,116,5,106,
-- 6,124,1,142,0,103,1,161,1,1,0,116,2,106,7,160,
-- 8,116,9,161,1,1,0,100,1,83,0,41,2,122,41,73,
-- 110,115,116,97,108,108,32,116,104,101,32,112,97,116,104,45,
-- 98,97,115,101,100,32,105,109,112,111,114,116,32,99,111,109,
-- 112,111,110,101,110,116,115,46,78,41,10,114,118,1,0,0,
-- 114,208,0,0,0,114,15,0,0,0,114,85,1,0,0,114,
-- 191,0,0,0,114,96,1,0,0,114,110,1,0,0,218,9,
-- 109,101,116,97,95,112,97,116,104,114,61,0,0,0,114,79,
-- 1,0,0,41,2,114,117,1,0,0,90,17,115,117,112,112,
-- 111,114,116,101,100,95,108,111,97,100,101,114,115,114,7,0,
-- 0,0,114,7,0,0,0,114,8,0,0,0,218,8,95,105,
-- 110,115,116,97,108,108,145,6,0,0,115,8,0,0,0,8,
-- 2,6,1,20,1,16,1,114,120,1,0,0,41,1,114,87,
-- 0,0,0,114,69,0,0,0,41,3,78,78,78,41,2,114,
-- 0,0,0,0,114,0,0,0,0,41,1,84,41,85,114,152,
-- 0,0,0,114,159,0,0,0,114,187,0,0,0,114,91,0,
-- 0,0,114,15,0,0,0,114,99,0,0,0,114,184,0,0,
-- 0,114,25,0,0,0,114,231,0,0,0,90,2,110,116,114,
-- 18,0,0,0,114,215,0,0,0,90,5,112,111,115,105,120,
-- 114,50,0,0,0,218,3,97,108,108,114,59,0,0,0,114,
-- 136,0,0,0,114,57,0,0,0,114,62,0,0,0,90,20,
-- 95,112,97,116,104,115,101,112,115,95,119,105,116,104,95,99,
-- 111,108,111,110,114,28,0,0,0,90,37,95,67,65,83,69,
-- 95,73,78,83,69,78,83,73,84,73,86,69,95,80,76,65,
-- 84,70,79,82,77,83,95,66,89,84,69,83,95,75,69,89,
-- 114,27,0,0,0,114,29,0,0,0,114,21,0,0,0,114,
-- 36,0,0,0,114,42,0,0,0,114,45,0,0,0,114,67,
-- 0,0,0,114,74,0,0,0,114,75,0,0,0,114,79,0,
-- 0,0,114,80,0,0,0,114,83,0,0,0,114,86,0,0,
-- 0,114,95,0,0,0,218,4,116,121,112,101,218,8,95,95,
-- 99,111,100,101,95,95,114,186,0,0,0,114,34,0,0,0,
-- 114,172,0,0,0,114,33,0,0,0,114,39,0,0,0,114,
-- 8,1,0,0,114,116,0,0,0,114,112,0,0,0,114,127,
-- 0,0,0,114,61,0,0,0,114,116,1,0,0,114,232,0,
-- 0,0,114,113,0,0,0,90,23,68,69,66,85,71,95,66,
-- 89,84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,
-- 90,27,79,80,84,73,77,73,90,69,68,95,66,89,84,69,
-- 67,79,68,69,95,83,85,70,70,73,88,69,83,114,121,0,
-- 0,0,114,128,0,0,0,114,135,0,0,0,114,137,0,0,
-- 0,114,139,0,0,0,114,160,0,0,0,114,167,0,0,0,
-- 114,176,0,0,0,114,180,0,0,0,114,182,0,0,0,114,
-- 189,0,0,0,114,194,0,0,0,114,195,0,0,0,114,200,
-- 0,0,0,218,6,111,98,106,101,99,116,114,209,0,0,0,
-- 114,213,0,0,0,114,214,0,0,0,114,235,0,0,0,114,
-- 249,0,0,0,114,11,1,0,0,114,34,1,0,0,114,41,
-- 1,0,0,114,30,1,0,0,114,47,1,0,0,114,75,1,
-- 0,0,114,79,1,0,0,114,96,1,0,0,114,115,1,0,
-- 0,114,208,0,0,0,114,118,1,0,0,114,120,1,0,0,
-- 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
-- 8,0,0,0,218,8,60,109,111,100,117,108,101,62,1,0,
-- 0,0,115,180,0,0,0,4,0,4,22,8,3,8,1,8,
-- 1,8,1,8,1,10,3,4,1,8,1,10,1,8,2,4,
-- 3,10,1,6,2,22,2,8,1,8,1,10,1,14,1,4,
-- 4,4,1,2,1,2,1,4,255,8,4,6,16,8,3,8,
-- 5,8,5,4,6,10,1,8,30,8,6,8,8,8,10,8,
-- 9,8,5,4,7,10,1,8,8,10,5,10,22,0,127,16,
-- 30,12,1,4,2,4,1,6,2,4,1,10,1,8,2,6,
-- 2,8,2,16,2,8,71,8,40,8,19,8,12,8,12,8,
-- 31,8,20,8,33,8,28,10,24,10,13,10,10,8,11,6,
-- 14,4,3,2,1,12,255,14,73,14,67,16,30,0,127,14,
-- 17,18,50,18,45,18,25,14,53,14,69,14,49,0,127,14,
-- 32,0,127,10,30,8,23,8,11,12,5,
-+ 114,95,95,218,8,95,95,115,112,101,99,95,95,114,102,1,
-+ 0,0,114,119,1,0,0,90,10,95,95,99,97,99,104,101,
-+ 100,95,95,41,6,218,3,103,101,116,114,167,0,0,0,114,
-+ 45,1,0,0,114,38,1,0,0,114,216,0,0,0,218,9,
-+ 69,120,99,101,112,116,105,111,110,41,6,90,2,110,115,114,
-+ 144,0,0,0,90,8,112,97,116,104,110,97,109,101,90,9,
-+ 99,112,97,116,104,110,97,109,101,114,167,0,0,0,114,213,
-+ 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-+ 0,0,218,14,95,102,105,120,95,117,112,95,109,111,100,117,
-+ 108,101,146,6,0,0,115,36,0,0,0,10,2,10,1,4,
-+ 1,4,1,8,1,8,1,12,1,10,2,4,1,14,1,2,
-+ 1,8,1,8,1,8,1,14,1,12,1,6,2,2,254,114,
-+ 124,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,
-+ 0,3,0,0,0,5,0,0,0,67,0,0,0,115,86,0,
-+ 0,0,116,0,106,1,100,1,118,0,114,18,116,2,100,2,
-+ 100,3,132,0,116,3,160,4,161,0,68,0,131,1,102,2,
-+ 103,1,125,0,110,2,103,0,125,0,124,0,160,5,116,6,
-+ 116,3,160,4,161,0,102,2,161,1,1,0,116,7,116,8,
-+ 102,2,125,1,116,9,116,10,102,2,125,2,124,0,124,1,
-+ 124,2,103,2,23,0,83,0,41,4,122,95,82,101,116,117,
-+ 114,110,115,32,97,32,108,105,115,116,32,111,102,32,102,105,
-+ 108,101,45,98,97,115,101,100,32,109,111,100,117,108,101,32,
-+ 108,111,97,100,101,114,115,46,10,10,32,32,32,32,69,97,
-+ 99,104,32,105,116,101,109,32,105,115,32,97,32,116,117,112,
-+ 108,101,32,40,108,111,97,100,101,114,44,32,115,117,102,102,
-+ 105,120,101,115,41,46,10,32,32,32,32,62,3,0,0,0,
-+ 114,15,0,0,0,114,17,0,0,0,114,16,0,0,0,99,
-+ 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,
-+ 6,0,0,0,83,0,0,0,115,24,0,0,0,103,0,124,
-+ 0,93,8,125,1,124,1,160,0,100,0,100,1,161,2,145,
-+ 2,113,2,83,0,41,2,122,3,46,115,111,114,117,1,0,
-+ 0,41,1,114,88,0,0,0,114,48,1,0,0,114,7,0,
-+ 0,0,114,7,0,0,0,114,8,0,0,0,114,56,0,0,
-+ 0,175,6,0,0,115,8,0,0,0,6,0,2,2,10,255,
-+ 6,255,122,47,95,103,101,116,95,115,117,112,112,111,114,116,
-+ 101,100,95,102,105,108,101,95,108,111,97,100,101,114,115,46,
-+ 60,108,111,99,97,108,115,62,46,60,108,105,115,116,99,111,
-+ 109,112,62,41,11,114,18,0,0,0,114,28,0,0,0,114,
-+ 116,1,0,0,114,190,0,0,0,218,18,101,120,116,101,110,
-+ 115,105,111,110,95,115,117,102,102,105,120,101,115,114,64,0,
-+ 0,0,114,33,1,0,0,114,38,1,0,0,114,130,0,0,
-+ 0,114,45,1,0,0,114,116,0,0,0,41,3,90,17,101,
-+ 120,116,101,110,115,105,111,110,95,108,111,97,100,101,114,115,
-+ 90,6,115,111,117,114,99,101,90,8,98,121,116,101,99,111,
-+ 100,101,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-+ 0,114,211,0,0,0,169,6,0,0,115,18,0,0,0,10,
-+ 5,8,1,6,2,12,254,4,5,18,1,8,1,8,1,12,
-+ 1,114,211,0,0,0,99,1,0,0,0,0,0,0,0,0,
-+ 0,0,0,1,0,0,0,1,0,0,0,67,0,0,0,115,
-+ 8,0,0,0,124,0,97,0,100,0,83,0,114,72,0,0,
-+ 0,41,1,114,162,0,0,0,41,1,218,17,95,98,111,111,
-+ 116,115,116,114,97,112,95,109,111,100,117,108,101,114,7,0,
-+ 0,0,114,7,0,0,0,114,8,0,0,0,218,21,95,115,
-+ 101,116,95,98,111,111,116,115,116,114,97,112,95,109,111,100,
-+ 117,108,101,187,6,0,0,115,2,0,0,0,8,2,114,127,
-+ 1,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,
-+ 2,0,0,0,4,0,0,0,67,0,0,0,115,50,0,0,
-+ 0,116,0,124,0,131,1,1,0,116,1,131,0,125,1,116,
-+ 2,106,3,160,4,116,5,106,6,124,1,142,0,103,1,161,
-+ 1,1,0,116,2,106,7,160,8,116,9,161,1,1,0,100,
-+ 1,83,0,41,2,122,41,73,110,115,116,97,108,108,32,116,
-+ 104,101,32,112,97,116,104,45,98,97,115,101,100,32,105,109,
-+ 112,111,114,116,32,99,111,109,112,111,110,101,110,116,115,46,
-+ 78,41,10,114,127,1,0,0,114,211,0,0,0,114,18,0,
-+ 0,0,114,90,1,0,0,114,194,0,0,0,114,101,1,0,
-+ 0,114,115,1,0,0,218,9,109,101,116,97,95,112,97,116,
-+ 104,114,64,0,0,0,114,84,1,0,0,41,2,114,126,1,
-+ 0,0,90,17,115,117,112,112,111,114,116,101,100,95,108,111,
-+ 97,100,101,114,115,114,7,0,0,0,114,7,0,0,0,114,
-+ 8,0,0,0,218,8,95,105,110,115,116,97,108,108,192,6,
-+ 0,0,115,8,0,0,0,8,2,6,1,20,1,16,1,114,
-+ 129,1,0,0,41,1,114,90,0,0,0,114,72,0,0,0,
-+ 41,3,78,78,78,41,2,114,0,0,0,0,114,0,0,0,
-+ 0,41,1,84,41,86,114,155,0,0,0,114,162,0,0,0,
-+ 114,190,0,0,0,114,94,0,0,0,114,18,0,0,0,114,
-+ 102,0,0,0,114,187,0,0,0,114,28,0,0,0,114,234,
-+ 0,0,0,90,2,110,116,114,21,0,0,0,114,218,0,0,
-+ 0,90,5,112,111,115,105,120,114,53,0,0,0,218,3,97,
-+ 108,108,114,62,0,0,0,114,139,0,0,0,114,60,0,0,
-+ 0,114,65,0,0,0,90,20,95,112,97,116,104,115,101,112,
-+ 115,95,119,105,116,104,95,99,111,108,111,110,114,31,0,0,
-+ 0,90,37,95,67,65,83,69,95,73,78,83,69,78,83,73,
-+ 84,73,86,69,95,80,76,65,84,70,79,82,77,83,95,66,
-+ 89,84,69,83,95,75,69,89,114,30,0,0,0,114,32,0,
-+ 0,0,114,24,0,0,0,114,39,0,0,0,114,45,0,0,
-+ 0,114,48,0,0,0,114,70,0,0,0,114,77,0,0,0,
-+ 114,78,0,0,0,114,82,0,0,0,114,83,0,0,0,114,
-+ 86,0,0,0,114,89,0,0,0,114,98,0,0,0,218,4,
-+ 116,121,112,101,218,8,95,95,99,111,100,101,95,95,114,189,
-+ 0,0,0,114,37,0,0,0,114,175,0,0,0,114,36,0,
-+ 0,0,114,42,0,0,0,114,11,1,0,0,114,119,0,0,
-+ 0,114,115,0,0,0,114,130,0,0,0,114,64,0,0,0,
-+ 114,125,1,0,0,114,235,0,0,0,114,116,0,0,0,90,
-+ 23,68,69,66,85,71,95,66,89,84,69,67,79,68,69,95,
-+ 83,85,70,70,73,88,69,83,90,27,79,80,84,73,77,73,
-+ 90,69,68,95,66,89,84,69,67,79,68,69,95,83,85,70,
-+ 70,73,88,69,83,114,124,0,0,0,114,131,0,0,0,114,
-+ 138,0,0,0,114,140,0,0,0,114,142,0,0,0,114,163,
-+ 0,0,0,114,170,0,0,0,114,179,0,0,0,114,183,0,
-+ 0,0,114,185,0,0,0,114,192,0,0,0,114,197,0,0,
-+ 0,114,198,0,0,0,114,203,0,0,0,218,6,111,98,106,
-+ 101,99,116,114,212,0,0,0,114,216,0,0,0,114,217,0,
-+ 0,0,114,238,0,0,0,114,252,0,0,0,114,14,1,0,
-+ 0,114,38,1,0,0,114,45,1,0,0,114,33,1,0,0,
-+ 114,52,1,0,0,114,80,1,0,0,114,84,1,0,0,114,
-+ 101,1,0,0,114,116,1,0,0,114,124,1,0,0,114,211,
-+ 0,0,0,114,127,1,0,0,114,129,1,0,0,114,7,0,
-+ 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-+ 0,218,8,60,109,111,100,117,108,101,62,1,0,0,0,115,
-+ 182,0,0,0,4,0,4,22,8,3,8,1,8,1,8,1,
-+ 8,1,10,3,4,1,8,1,10,1,8,2,4,3,10,1,
-+ 6,2,22,2,8,1,8,1,10,1,14,1,4,4,4,1,
-+ 2,1,2,1,4,255,8,4,6,16,8,3,8,5,8,5,
-+ 4,6,10,1,8,30,8,6,8,8,8,10,8,9,8,5,
-+ 4,7,10,1,8,8,10,5,10,22,0,127,16,30,12,1,
-+ 4,2,4,1,6,2,4,1,10,1,8,2,6,2,8,2,
-+ 16,2,8,71,8,40,8,19,8,12,8,12,8,31,8,20,
-+ 8,33,8,28,10,24,10,13,10,10,8,11,6,14,4,3,
-+ 2,1,12,255,14,73,14,67,16,30,0,127,14,17,18,50,
-+ 18,45,18,25,14,53,14,69,14,49,0,127,14,32,0,127,
-+ 16,28,10,42,8,23,8,18,12,5,
- };
-diff --git a/Python/marshal.c b/Python/marshal.c
-index 67540e08ed9..062e3047fb8 100644
---- a/Python/marshal.c
-+++ b/Python/marshal.c
-@@ -14,6 +14,10 @@
- #include "marshal.h"
- #include "pycore_hashtable.h"
-
-+#ifdef __APPLE__
-+# include "TargetConditionals.h"
-+#endif /* __APPLE__ */
++You can then use the `my-testbed` folder to run the Python test suite,
++passing in any command line arguments you may require. For example, if you're
++trying to diagnose a failure in the `os` module, you might run:
++```
++python my-testbed run -- test -W test_os
++```
++
++This is the equivalent of running `python -m test -W test_os` on a desktop
++Python build. Any arguments after the `--` will be passed to testbed as if
++they were arguments to `python -m` on a desktop machine.
++
++### Testing in Xcode
++
++You can also open the testbed project in Xcode by running:
++```
++open my-testbed/iOSTestbed.xcodeproj
++```
++
++This will allow you to use the full Xcode suite of tools for debugging.
++
++The arguments used to run the test suite are defined as part of the test plan.
++To modify the test plan, select the test plan node of the project tree (it
++should be the first child of the root node), and select the "Configurations"
++tab. Modify the "Arguments Passed On Launch" value to change the testing
++arguments.
++
++The test plan also disables parallel testing, and specifies the use of the
++`Testbed.lldbinit` file for providing configuration of the debugger. The
++default debugger configuration disables automatic breakpoints on the
++`SIGINT`, `SIGUSR1`, `SIGUSR2`, and `SIGXFSZ` signals.
++
++### Testing on an iOS device
++
++To test on an iOS device, the app needs to be signed with known developer
++credentials. To obtain these credentials, you must have an iOS Developer
++account, and your Xcode install will need to be logged into your account (see
++the Accounts tab of the Preferences dialog).
++
++Once the project is open, and you're signed into your Apple Developer account,
++select the root node of the project tree (labeled "iOSTestbed"), then the
++"Signing & Capabilities" tab in the details page. Select a development team
++(this will likely be your own name), and plug in a physical device to your
++macOS machine with a USB cable. You should then be able to select your physical
++device from the list of targets in the pulldown in the Xcode titlebar.
+--- /dev/null
++++ b/Apple/iOS/Resources/Info.plist.in
+@@ -0,0 +1,34 @@
++
++
++
++
++ CFBundleDevelopmentRegion
++ en
++ CFBundleExecutable
++ Python
++ CFBundleGetInfoString
++ Python Runtime and Library
++ CFBundleIdentifier
++ @PYTHONFRAMEWORKIDENTIFIER@
++ CFBundleInfoDictionaryVersion
++ 6.0
++ CFBundleName
++ Python
++ CFBundlePackageType
++ FMWK
++ CFBundleShortVersionString
++ %VERSION%
++ CFBundleLongVersionString
++ %VERSION%, (c) 2001-2024 Python Software Foundation.
++ CFBundleSignature
++ ????
++ CFBundleVersion
++ %VERSION%
++ CFBundleSupportedPlatforms
++
++ iPhoneOS
++
++ MinimumOSVersion
++ @IPHONEOS_DEPLOYMENT_TARGET@
++
++
+--- /dev/null
++++ b/Apple/iOS/Resources/bin/arm64-apple-ios-ar
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphoneos${IOS_SDK_VERSION} ar "$@"
+--- /dev/null
++++ b/Apple/iOS/Resources/bin/arm64-apple-ios-clang
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphoneos${IOS_SDK_VERSION} clang -target arm64-apple-ios${IPHONEOS_DEPLOYMENT_TARGET} "$@"
+--- /dev/null
++++ b/Apple/iOS/Resources/bin/arm64-apple-ios-clang++
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphoneos${IOS_SDK_VERSION} clang++ -target arm64-apple-ios${IPHONEOS_DEPLOYMENT_TARGET} "$@"
+--- /dev/null
++++ b/Apple/iOS/Resources/bin/arm64-apple-ios-cpp
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphoneos${IOS_SDK_VERSION} clang -target arm64-apple-ios${IPHONEOS_DEPLOYMENT_TARGET} -E "$@"
+--- /dev/null
++++ b/Apple/iOS/Resources/bin/arm64-apple-ios-simulator-ar
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} ar "$@"
+--- /dev/null
++++ b/Apple/iOS/Resources/bin/arm64-apple-ios-simulator-clang
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} clang -target arm64-apple-ios${IPHONEOS_DEPLOYMENT_TARGET}-simulator "$@"
+--- /dev/null
++++ b/Apple/iOS/Resources/bin/arm64-apple-ios-simulator-clang++
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} clang++ -target arm64-apple-ios${IPHONEOS_DEPLOYMENT_TARGET}-simulator "$@"
+--- /dev/null
++++ b/Apple/iOS/Resources/bin/arm64-apple-ios-simulator-cpp
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} clang -target arm64-apple-ios${IPHONEOS_DEPLOYMENT_TARGET}-simulator -E "$@"
+--- /dev/null
++++ b/Apple/iOS/Resources/bin/arm64-apple-ios-simulator-strip
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} strip -arch arm64 "$@"
+--- /dev/null
++++ b/Apple/iOS/Resources/bin/arm64-apple-ios-strip
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphoneos${IOS_SDK_VERSION} strip -arch arm64 "$@"
+--- /dev/null
++++ b/Apple/iOS/Resources/bin/x86_64-apple-ios-simulator-ar
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} ar "$@"
+--- /dev/null
++++ b/Apple/iOS/Resources/bin/x86_64-apple-ios-simulator-clang
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} clang -target x86_64-apple-ios${IPHONEOS_DEPLOYMENT_TARGET}-simulator "$@"
+--- /dev/null
++++ b/Apple/iOS/Resources/bin/x86_64-apple-ios-simulator-clang++
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} clang++ -target x86_64-apple-ios${IPHONEOS_DEPLOYMENT_TARGET}-simulator "$@"
+--- /dev/null
++++ b/Apple/iOS/Resources/bin/x86_64-apple-ios-simulator-cpp
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} clang -target x86_64-apple-ios${IPHONEOS_DEPLOYMENT_TARGET}-simulator -E "$@"
+--- /dev/null
++++ b/Apple/iOS/Resources/bin/x86_64-apple-ios-simulator-strip
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} strip -arch x86_64 "$@"
+--- /dev/null
++++ b/Apple/iOS/Resources/pyconfig.h
+@@ -0,0 +1,7 @@
++#ifdef __arm64__
++#include "pyconfig-arm64.h"
++#endif
++
++#ifdef __x86_64__
++#include "pyconfig-x86_64.h"
++#endif
+--- /dev/null
++++ b/Apple/testbed/Python.xcframework/Info.plist
+@@ -0,0 +1,106 @@
++
++
++
++
++ AvailableLibraries
++
++
++ BinaryPath
++ Python.framework/Python
++ LibraryIdentifier
++ ios-arm64
++ LibraryPath
++ Python.framework
++ SupportedArchitectures
++
++ arm64
++
++ SupportedPlatform
++ ios
++
++
++ BinaryPath
++ Python.framework/Python
++ LibraryIdentifier
++ ios-arm64_x86_64-simulator
++ LibraryPath
++ Python.framework
++ SupportedArchitectures
++
++ arm64
++ x86_64
++
++ SupportedPlatform
++ ios
++ SupportedPlatformVariant
++ simulator
++
++
++ BinaryPath
++ Python.framework/Python
++ LibraryIdentifier
++ tvos-arm64
++ LibraryPath
++ Python.framework
++ SupportedArchitectures
++
++ arm64
++
++ SupportedPlatform
++ tvos
++
++
++ BinaryPath
++ Python.framework/Python
++ LibraryIdentifier
++ tvos-arm64_x86_64-simulator
++ LibraryPath
++ Python.framework
++ SupportedArchitectures
++
++ arm64
++ x86_64
++
++ SupportedPlatform
++ tvos
++ SupportedPlatformVariant
++ simulator
++
++
++ BinaryPath
++ Python.framework/Python
++ LibraryIdentifier
++ watchos-arm64_x86_64-simulator
++ LibraryPath
++ Python.framework
++ SupportedArchitectures
++
++ arm64
++ x86_64
++
++ SupportedPlatform
++ watchos
++ SupportedPlatformVariant
++ simulator
++
++
++ BinaryPath
++ Python.framework/Python
++ LibraryIdentifier
++ watchos-arm64_32
++ LibraryPath
++ Python.framework
++ SupportedArchitectures
++
++ arm64_32
++
++ SupportedPlatform
++ watchos
++
++
++ CFBundlePackageType
++ XFWK
++ XCFrameworkFormatVersion
++ 1.0
++
++
+--- /dev/null
++++ b/Apple/testbed/Python.xcframework/build/iOS-dylib-Info-template.plist
+@@ -0,0 +1,26 @@
++
++
++
++
++ CFBundleDevelopmentRegion
++ en
++ CFBundleExecutable
++
++ CFBundleIdentifier
++
++ CFBundleInfoDictionaryVersion
++ 6.0
++ CFBundlePackageType
++ APPL
++ CFBundleShortVersionString
++ 1.0
++ CFBundleSupportedPlatforms
++
++ iPhoneOS
++
++ MinimumOSVersion
++ 13.0
++ CFBundleVersion
++ 1
++
++
+--- /dev/null
++++ b/Apple/testbed/Python.xcframework/build/tvOS-dylib-Info-template.plist
+@@ -0,0 +1,26 @@
++
++
++
++
++ CFBundleDevelopmentRegion
++ en
++ CFBundleExecutable
++
++ CFBundleIdentifier
++
++ CFBundleInfoDictionaryVersion
++ 6.0
++ CFBundlePackageType
++ APPL
++ CFBundleShortVersionString
++ 1.0
++ CFBundleSupportedPlatforms
++
++ tvOS
++
++ MinimumOSVersion
++ 9.0
++ CFBundleVersion
++ 1
++
++
+--- /dev/null
++++ b/Apple/testbed/Python.xcframework/build/utils.sh
+@@ -0,0 +1,174 @@
++# Utility methods for use in an Xcode project.
++#
++# An iOS XCframework cannot include any content other than the library binary
++# and relevant metadata. However, Python requires a standard library at runtime.
++# Therefore, it is necessary to add a build step to an Xcode app target that
++# processes the standard library and puts the content into the final app.
++#
++# In general, these tools will be invoked after bundle resources have been
++# copied into the app, but before framework embedding (and signing).
++#
++# The following is an example script, assuming that:
++# * Python.xcframework is in the root of the project
++# * There is an `app` folder that contains the app code
++# * There is an `app_packages` folder that contains installed Python packages.
++# -----
++# set -e
++# source $PROJECT_DIR/Python.xcframework/build/build_utils.sh
++# install_python Python.xcframework app app_packages
++# -----
++
++# Copy the standard library from the XCframework into the app bundle.
++#
++# Accepts one argument:
++# 1. The path, relative to the root of the Xcode project, where the Python
++# XCframework can be found.
++install_stdlib() {
++ PYTHON_XCFRAMEWORK_PATH=$1
++
++ mkdir -p "$CODESIGNING_FOLDER_PATH/python/lib"
++ if [ "$EFFECTIVE_PLATFORM_NAME" = "-iphonesimulator" ]; then
++ echo "Installing Python modules for iOS Simulator"
++ if [ -d "$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/ios-arm64-simulator" ]; then
++ SLICE_FOLDER="ios-arm64-simulator"
++ else
++ SLICE_FOLDER="ios-arm64_x86_64-simulator"
++ fi
++ elif [ "$EFFECTIVE_PLATFORM_NAME" = "-iphoneos" ]; then
++ echo "Installing Python modules for iOS Device"
++ SLICE_FOLDER="ios-arm64"
++ elif [ "$EFFECTIVE_PLATFORM_NAME" = "-appletvsimulator" ]; then
++ echo "Installing Python modules for tvOS Simulator"
++ if [ -d "$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/tvos-arm64-simulator" ]; then
++ SLICE_FOLDER="tvos-arm64-simulator"
++ else
++ SLICE_FOLDER="tvos-arm64_x86_64-simulator"
++ fi
++ elif [ "$EFFECTIVE_PLATFORM_NAME" = "-appletvos" ]; then
++ echo "Installing Python modules for tvOS Device"
++ SLICE_FOLDER="tvos-arm64"
++ elif [ "$EFFECTIVE_PLATFORM_NAME" = "-watchsimulator" ]; then
++ echo "Installing Python modules for watchOS Simulator"
++ if [ -d "$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/watchos-arm64-simulator" ]; then
++ SLICE_FOLDER="watchos-arm64-simulator"
++ else
++ SLICE_FOLDER="watchos-arm64_x86_64-simulator"
++ fi
++ elif [ "$EFFECTIVE_PLATFORM_NAME" = "-watchos" ]; then
++ echo "Installing Python modules for watchOS Device"
++ SLICE_FOLDER="watchos-arm64"
++ else
++ echo "Unsupported platform name $EFFECTIVE_PLATFORM_NAME"
++ exit 1
++ fi
++
++ # If the XCframework has a shared lib folder, then it's a full framework.
++ # Copy both the common and slice-specific part of the lib directory.
++ # Otherwise, it's a single-arch framework; use the "full" lib folder.
++ if [ -d "$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/lib" ]; then
++ rsync -au --delete "$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/lib/" "$CODESIGNING_FOLDER_PATH/python/lib/"
++ rsync -au "$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/$SLICE_FOLDER/lib-$ARCHS/" "$CODESIGNING_FOLDER_PATH/python/lib/"
++ else
++ # A single-arch framework will have a libpython symlink; that can't be included at runtime
++ rsync -au --delete "$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/$SLICE_FOLDER/lib/" "$CODESIGNING_FOLDER_PATH/python/lib/" --exclude 'libpython*.dylib'
++ fi
++}
++
++# Convert a single .so library into a framework that iOS can load.
++#
++# Accepts three arguments:
++# 1. The path, relative to the root of the Xcode project, where the Python
++# XCframework can be found.
++# 2. The base path, relative to the installed location in the app bundle, that
++# needs to be processed. Any .so file found in this path (or a subdirectory
++# of it) will be processed.
++# 2. The full path to a single .so file to process. This path should include
++# the base path.
++install_dylib () {
++ PYTHON_XCFRAMEWORK_PATH=$1
++ INSTALL_BASE=$2
++ FULL_EXT=$3
++
++ # The name of the extension file
++ EXT=$(basename "$FULL_EXT")
++ # The name and location of the module
++ MODULE_PATH=$(dirname "$FULL_EXT")
++ MODULE_NAME=$(echo $EXT | cut -d "." -f 1)
++ # The location of the extension file, relative to the bundle
++ RELATIVE_EXT=${FULL_EXT#$CODESIGNING_FOLDER_PATH/}
++ # The path to the extension file, relative to the install base
++ PYTHON_EXT=${RELATIVE_EXT/$INSTALL_BASE/}
++ # The full dotted name of the extension module, constructed from the file path.
++ FULL_MODULE_NAME=$(echo $PYTHON_EXT | cut -d "." -f 1 | tr "/" ".");
++ # A bundle identifier; not actually used, but required by Xcode framework packaging
++ FRAMEWORK_BUNDLE_ID=$(echo $PRODUCT_BUNDLE_IDENTIFIER.$FULL_MODULE_NAME | tr "_" "-")
++ # The name of the framework folder.
++ FRAMEWORK_FOLDER="Frameworks/$FULL_MODULE_NAME.framework"
++
++ # If the framework folder doesn't exist, create it.
++ if [ ! -d "$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER" ]; then
++ echo "Creating framework for $RELATIVE_EXT"
++ mkdir -p "$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER"
++ cp "$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/build/$PLATFORM_FAMILY_NAME-dylib-Info-template.plist" "$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/Info.plist"
++ plutil -replace CFBundleExecutable -string "$FULL_MODULE_NAME" "$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/Info.plist"
++ plutil -replace CFBundleIdentifier -string "$FRAMEWORK_BUNDLE_ID" "$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/Info.plist"
++ fi
++
++ echo "Installing binary for $FRAMEWORK_FOLDER/$FULL_MODULE_NAME"
++ mv "$FULL_EXT" "$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/$FULL_MODULE_NAME"
++ # Create a placeholder .fwork file where the .so was
++ echo "$FRAMEWORK_FOLDER/$FULL_MODULE_NAME" > ${FULL_EXT%.so}.fwork
++ # Create a back reference to the .so file location in the framework
++ echo "${RELATIVE_EXT%.so}.fwork" > "$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/$FULL_MODULE_NAME.origin"
++
++ # If the framework provides an xcprivacy file, install it.
++ if [ -e "$MODULE_PATH/$MODULE_NAME.xcprivacy" ]; then
++ echo "Installing XCPrivacy file for $FRAMEWORK_FOLDER/$FULL_MODULE_NAME"
++ XCPRIVACY_FILE="$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/PrivacyInfo.xcprivacy"
++ if [ -e "$XCPRIVACY_FILE" ]; then
++ rm -rf "$XCPRIVACY_FILE"
++ fi
++ mv "$MODULE_PATH/$MODULE_NAME.xcprivacy" "$XCPRIVACY_FILE"
++ fi
++
++ echo "Signing framework as $EXPANDED_CODE_SIGN_IDENTITY_NAME ($EXPANDED_CODE_SIGN_IDENTITY)..."
++ /usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" ${OTHER_CODE_SIGN_FLAGS:-} -o runtime --timestamp=none --preserve-metadata=identifier,entitlements,flags --generate-entitlement-der "$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER"
++}
++
++# Process all the dynamic libraries in a path into Framework format.
++#
++# Accepts two arguments:
++# 1. The path, relative to the root of the Xcode project, where the Python
++# XCframework can be found.
++# 2. The base path, relative to the installed location in the app bundle, that
++# needs to be processed. Any .so file found in this path (or a subdirectory
++# of it) will be processed.
++process_dylibs () {
++ PYTHON_XCFRAMEWORK_PATH=$1
++ LIB_PATH=$2
++ find "$CODESIGNING_FOLDER_PATH/$LIB_PATH" -name "*.so" | while read FULL_EXT; do
++ install_dylib $PYTHON_XCFRAMEWORK_PATH "$LIB_PATH/" "$FULL_EXT"
++ done
++}
++
++# The entry point for post-processing a Python XCframework.
++#
++# Accepts 1 or more arguments:
++# 1. The path, relative to the root of the Xcode project, where the Python
++# XCframework can be found. If the XCframework is in the root of the project,
++# 2+. The path of a package, relative to the root of the packaged app, that contains
++# library content that should be processed for binary libraries.
++install_python() {
++ PYTHON_XCFRAMEWORK_PATH=$1
++ shift
++
++ install_stdlib $PYTHON_XCFRAMEWORK_PATH
++ PYTHON_VER=$(ls -1 "$CODESIGNING_FOLDER_PATH/python/lib")
++ echo "Install Python $PYTHON_VER standard library extension modules..."
++ process_dylibs $PYTHON_XCFRAMEWORK_PATH python/lib/$PYTHON_VER/lib-dynload
++
++ for package_path in $@; do
++ echo "Installing $package_path extension modules ..."
++ process_dylibs $PYTHON_XCFRAMEWORK_PATH $package_path
++ done
++}
+--- /dev/null
++++ b/Apple/testbed/Python.xcframework/build/watchOS-dylib-Info-template.plist
+@@ -0,0 +1,26 @@
++
++
++
++
++ CFBundleDevelopmentRegion
++ en
++ CFBundleExecutable
++
++ CFBundleIdentifier
++
++ CFBundleInfoDictionaryVersion
++ 6.0
++ CFBundlePackageType
++ APPL
++ CFBundleShortVersionString
++ 1.0
++ CFBundleSupportedPlatforms
++
++ watchOS
++
++ MinimumOSVersion
++ 4.0
++ CFBundleVersion
++ 1
++
++
+--- /dev/null
++++ b/Apple/testbed/Python.xcframework/ios-arm64/README
+@@ -0,0 +1,4 @@
++This directory is intentionally empty.
++
++It should be used as a target for `--enable-framework` when compiling an iOS on-device
++build for testing purposes.
+--- /dev/null
++++ b/Apple/testbed/Python.xcframework/ios-arm64_x86_64-simulator/README
+@@ -0,0 +1,4 @@
++This directory is intentionally empty.
++
++It should be used as a target for `--enable-framework` when compiling an iOS simulator
++build for testing purposes (either x86_64 or ARM64).
+--- /dev/null
++++ b/Apple/testbed/Python.xcframework/tvos-arm64/README
+@@ -0,0 +1,4 @@
++This directory is intentionally empty.
++
++It should be used as a target for `--enable-framework` when compiling a tvOS
++on-device build for testing purposes.
+--- /dev/null
++++ b/Apple/testbed/Python.xcframework/tvos-arm64_x86_64-simulator/README
+@@ -0,0 +1,4 @@
++This directory is intentionally empty.
++
++It should be used as a target for `--enable-framework` when compiling a tvOS
++simulator build for testing purposes (either x86_64 or ARM64).
+--- /dev/null
++++ b/Apple/testbed/Python.xcframework/watchos-arm64_32/README
+@@ -0,0 +1,4 @@
++This directory is intentionally empty.
++
++It should be used as a target for `--enable-framework` when compiling a watchOS on-device
++build for testing purposes.
+--- /dev/null
++++ b/Apple/testbed/Python.xcframework/watchos-arm64_x86_64-simulator/README
+@@ -0,0 +1,4 @@
++This directory is intentionally empty.
++
++It should be used as a target for `--enable-framework` when compiling a watchOS
++simulator build for testing purposes (either x86_64 or ARM64).
+--- /dev/null
++++ b/Apple/testbed/Testbed.lldbinit
+@@ -0,0 +1,4 @@
++process handle SIGINT -n true -p true -s false
++process handle SIGUSR1 -n true -p true -s false
++process handle SIGUSR2 -n true -p true -s false
++process handle SIGXFSZ -n true -p true -s false
+--- /dev/null
++++ b/Apple/testbed/TestbedTests/TestbedTests.m
+@@ -0,0 +1,198 @@
++#import
++#import
++
++@interface TestbedTests : XCTestCase
++
++@end
++
++@implementation TestbedTests
++
++
++- (void)testPython {
++ const char **argv;
++ int exit_code;
++ int failed;
++ PyStatus status;
++ PyPreConfig preconfig;
++ PyConfig config;
++ PyObject *app_packages_path;
++ PyObject *method_args;
++ PyObject *result;
++ PyObject *site_module;
++ PyObject *site_addsitedir_attr;
++ PyObject *sys_module;
++ PyObject *sys_path_attr;
++ NSArray *test_args;
++ NSString *python_home;
++ NSString *path;
++ wchar_t *wtmp_str;
++
++ NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
++
++ // Set some other common environment indicators to disable color, as the
++ // Xcode log can't display color. Stdout will report that it is *not* a
++ // TTY.
++ setenv("NO_COLOR", "1", true);
++ setenv("PYTHON_COLORS", "0", true);
++
++ if (getenv("GITHUB_ACTIONS")) {
++ NSLog(@"Running in a GitHub Actions environment");
++ }
++ // Arguments to pass into the test suite runner.
++ // argv[0] must identify the process; any subsequent arg
++ // will be handled as if it were an argument to `python -m test`
++ // The processInfo arguments contain the binary that is running,
++ // followed by the arguments defined in the test plan. This means:
++ // run_module = test_args[1]
++ // argv = ["Testbed"] + test_args[2:]
++ test_args = [[NSProcessInfo processInfo] arguments];
++ if (test_args == NULL) {
++ NSLog(@"Unable to identify test arguments.");
++ }
++ NSLog(@"Test arguments: %@", test_args);
++ argv = malloc(sizeof(char *) * ([test_args count] - 1));
++ argv[0] = "Testbed";
++ for (int i = 1; i < [test_args count] - 1; i++) {
++ argv[i] = [[test_args objectAtIndex:i+1] UTF8String];
++ }
++
++ // Generate an isolated Python configuration.
++ NSLog(@"Configuring isolated Python...");
++ PyPreConfig_InitIsolatedConfig(&preconfig);
++ PyConfig_InitIsolatedConfig(&config);
++
++ // Configure the Python interpreter:
++ // Enforce UTF-8 encoding for stderr, stdout, file-system encoding and locale.
++ // See https://docs.python.org/3/library/os.html#python-utf-8-mode.
++ preconfig.utf8_mode = 1;
++ // Don't buffer stdio. We want output to appears in the log immediately
++ config.buffered_stdio = 0;
++ // Don't write bytecode; we can't modify the app bundle
++ // after it has been signed.
++ config.write_bytecode = 0;
++ // Ensure that signal handlers are installed
++ config.install_signal_handlers = 1;
++ // Run the test module.
++ config.run_module = Py_DecodeLocale([[test_args objectAtIndex:1] UTF8String], NULL);
++ // For debugging - enable verbose mode.
++ // config.verbose = 1;
++
++ NSLog(@"Pre-initializing Python runtime...");
++ status = Py_PreInitialize(&preconfig);
++ if (PyStatus_Exception(status)) {
++ XCTFail(@"Unable to pre-initialize Python interpreter: %s", status.err_msg);
++ PyConfig_Clear(&config);
++ return;
++ }
++
++ // Set the home for the Python interpreter
++ python_home = [NSString stringWithFormat:@"%@/python", resourcePath, nil];
++ NSLog(@"PythonHome: %@", python_home);
++ wtmp_str = Py_DecodeLocale([python_home UTF8String], NULL);
++ status = PyConfig_SetString(&config, &config.home, wtmp_str);
++ if (PyStatus_Exception(status)) {
++ XCTFail(@"Unable to set PYTHONHOME: %s", status.err_msg);
++ PyConfig_Clear(&config);
++ return;
++ }
++ PyMem_RawFree(wtmp_str);
++
++ // Read the site config
++ status = PyConfig_Read(&config);
++ if (PyStatus_Exception(status)) {
++ XCTFail(@"Unable to read site config: %s", status.err_msg);
++ PyConfig_Clear(&config);
++ return;
++ }
++
++ NSLog(@"Configure argc/argv...");
++ status = PyConfig_SetBytesArgv(&config, [test_args count] - 1, (char**) argv);
++ if (PyStatus_Exception(status)) {
++ XCTFail(@"Unable to configure argc/argv: %s", status.err_msg);
++ PyConfig_Clear(&config);
++ return;
++ }
++
++ NSLog(@"Initializing Python runtime...");
++ status = Py_InitializeFromConfig(&config);
++ if (PyStatus_Exception(status)) {
++ XCTFail(@"Unable to initialize Python interpreter: %s", status.err_msg);
++ PyConfig_Clear(&config);
++ return;
++ }
++
++ // Add app_packages as a site directory. This both adds to sys.path,
++ // and ensures that any .pth files in that directory will be executed.
++ site_module = PyImport_ImportModule("site");
++ if (site_module == NULL) {
++ XCTFail(@"Could not import site module");
++ return;
++ }
++
++ site_addsitedir_attr = PyObject_GetAttrString(site_module, "addsitedir");
++ if (site_addsitedir_attr == NULL || !PyCallable_Check(site_addsitedir_attr)) {
++ XCTFail(@"Could not access site.addsitedir");
++ return;
++ }
++
++ path = [NSString stringWithFormat:@"%@/app_packages", resourcePath, nil];
++ NSLog(@"App packages path: %@", path);
++ wtmp_str = Py_DecodeLocale([path UTF8String], NULL);
++ app_packages_path = PyUnicode_FromWideChar(wtmp_str, wcslen(wtmp_str));
++ if (app_packages_path == NULL) {
++ XCTFail(@"Could not convert app_packages path to unicode");
++ return;
++ }
++ PyMem_RawFree(wtmp_str);
++
++ method_args = Py_BuildValue("(O)", app_packages_path);
++ if (method_args == NULL) {
++ XCTFail(@"Could not create arguments for site.addsitedir");
++ return;
++ }
++
++ result = PyObject_CallObject(site_addsitedir_attr, method_args);
++ if (result == NULL) {
++ XCTFail(@"Could not add app_packages directory using site.addsitedir");
++ return;
++ }
++
++ // Add test code to sys.path
++ sys_module = PyImport_ImportModule("sys");
++ if (sys_module == NULL) {
++ XCTFail(@"Could not import sys module");
++ return;
++ }
++
++ sys_path_attr = PyObject_GetAttrString(sys_module, "path");
++ if (sys_path_attr == NULL) {
++ XCTFail(@"Could not access sys.path");
++ return;
++ }
++
++ path = [NSString stringWithFormat:@"%@/app", resourcePath, nil];
++ NSLog(@"App path: %@", path);
++ wtmp_str = Py_DecodeLocale([path UTF8String], NULL);
++ failed = PyList_Insert(sys_path_attr, 0, PyUnicode_FromString([path UTF8String]));
++ if (failed) {
++ XCTFail(@"Unable to add app to sys.path");
++ return;
++ }
++ PyMem_RawFree(wtmp_str);
++
++ // Ensure the working directory is the app folder.
++ chdir([path UTF8String]);
++
++ // Start the test suite. Print a separator to differentiate Python startup logs from app logs
++ NSLog(@"---------------------------------------------------------------------------");
++
++ exit_code = Py_RunMain();
++ XCTAssertEqual(exit_code, 0, @"Test suite did not pass");
++
++ NSLog(@"---------------------------------------------------------------------------");
++
++ Py_Finalize();
++}
++
++
++@end
+--- /dev/null
++++ b/Apple/testbed/__main__.py
+@@ -0,0 +1,472 @@
++import argparse
++import json
++import os
++import re
++import shlex
++import shutil
++import subprocess
++import sys
++from itertools import chain
++from pathlib import Path
++
++TEST_SLICES = {
++ "iOS": "ios-arm64_x86_64-simulator",
++ "tvOS": "tvos-arm64_x86_64-simulator",
++ "visionOS": "xros-arm64-simulator",
++ "watchOS": "watchos-arm64_x86_64-simulator",
++}
++
++DECODE_ARGS = ("UTF-8", "backslashreplace")
++
++# The system log prefixes each line:
++# 2025-01-17 16:14:29.093742+0800 iOSTestbed[23987:1fd393b4] ...
++# 2025-01-17 16:14:29.093742+0800 iOSTestbed[23987:1fd393b4] ...
++
++LOG_PREFIX_REGEX = re.compile(
++ r"^\d{4}-\d{2}-\d{2}" # YYYY-MM-DD
++ r"\s+\d+:\d{2}:\d{2}\.\d+\+\d{4}" # HH:MM:SS.ssssss+ZZZZ
++ r"\s+.*Testbed\[\d+:\w+\]" # Process/thread ID
++)
++
++
++# Select a simulator device to use.
++def select_simulator_device(platform):
++ # List the testing simulators, in JSON format
++ raw_json = subprocess.check_output(["xcrun", "simctl", "list", "-j"])
++ json_data = json.loads(raw_json)
++
++ if platform == "iOS":
++ # Any iOS device will do; we'll look for "SE" devices - but the name
++ # isn't consistent over time. Older Xcode versions will use "iPhone SE
++ # (Nth generation)"; As of 2025, they've started using "iPhone 16e".
++ #
++ # When Xcode is updated after a new release, new devices will be
++ # available and old ones will be dropped from the set available on the
++ # latest iOS version. Select the one with the highest minimum runtime
++ # version - this is an indicator of the "newest" released device, which
++ # should always be supported on the "most recent" iOS version.
++ se_simulators = sorted(
++ (devicetype["minRuntimeVersion"], devicetype["name"])
++ for devicetype in json_data["devicetypes"]
++ if devicetype["productFamily"] == "iPhone"
++ and (
++ (
++ "iPhone " in devicetype["name"]
++ and devicetype["name"].endswith("e")
++ )
++ or "iPhone SE " in devicetype["name"]
++ )
++ )
++ simulator = se_simulators[-1][1]
++ elif platform == "tvOS":
++ # Find the most recent tvOS release.
++ simulators = sorted(
++ (devicetype["minRuntimeVersion"], devicetype["name"])
++ for devicetype in json_data["devicetypes"]
++ if devicetype["productFamily"] == "Apple TV"
++ )
++ simulator = simulators[-1][1]
++ elif platform == "visionOS":
++ # Find the most recent visionOS release.
++ simulators = sorted(
++ (devicetype["minRuntimeVersion"], devicetype["name"])
++ for devicetype in json_data["devicetypes"]
++ if devicetype["productFamily"] == "Apple Vision"
++ )
++ simulator = simulators[-1][1]
++ elif platform == "watchOS":
++ raise NotImplementedError("Don't know how to launch watchOS (yet)")
++ else:
++ raise ValueError(f"Unknown platform {platform}")
++
++ return simulator
++
++
++# A backport of Path.relative_to(*, walk_up=True)
++def relative_to(target, other):
++ for step, path in enumerate(chain([other], other.parents)):
++ if path == target or path in target.parents:
++ break
++ else:
++ raise ValueError(
++ f"{str(target)!r} and {str(other)!r} have different anchors"
++ )
++ parts = [".."] * step + list(target.parts[len(path.parts) :])
++ return Path("/".join(parts))
++
++
++def xcode_test(location: Path, platform: str, simulator: str, verbose: bool):
++ # Build and run the test suite on the named simulator.
++ args = [
++ "-project",
++ str(location / f"{platform}Testbed.xcodeproj"),
++ "-scheme",
++ f"{platform}Testbed",
++ "-destination",
++ f"platform={platform} Simulator,name={simulator}",
++ "-derivedDataPath",
++ str(location / "DerivedData"),
++ ]
++ verbosity_args = [] if verbose else ["-quiet"]
++
++ print("Building test project...")
++ subprocess.run(
++ ["xcodebuild", "build-for-testing"] + args + verbosity_args,
++ check=True,
++ )
++
++ # Any environment variable prefixed with TEST_RUNNER_ is exposed into the
++ # test runner environment. There are some variables (like those identifying
++ # CI platforms) that can be useful to have access to.
++ test_env = os.environ.copy()
++ if "GITHUB_ACTIONS" in os.environ:
++ test_env["TEST_RUNNER_GITHUB_ACTIONS"] = os.environ["GITHUB_ACTIONS"]
++
++ print("Running test project...")
++ # Test execution *can't* be run -quiet; verbose mode
++ # is how we see the output of the test output.
++ process = subprocess.Popen(
++ ["xcodebuild", "test-without-building"] + args,
++ stdout=subprocess.PIPE,
++ stderr=subprocess.STDOUT,
++ env=test_env,
++ )
++ while line := (process.stdout.readline()).decode(*DECODE_ARGS):
++ # Strip the timestamp/process prefix from each log line
++ line = LOG_PREFIX_REGEX.sub("", line)
++ sys.stdout.write(line)
++ sys.stdout.flush()
++
++ status = process.wait(timeout=5)
++ exit(status)
++
++
++def copy(src, tgt):
++ """An all-purpose copy.
++
++ If src is a file, it is copied. If src is a symlink, it is copied *as a
++ symlink*. If src is a directory, the full tree is duplicated, with symlinks
++ being preserved.
++ """
++ if src.is_file() or src.is_symlink():
++ shutil.copyfile(src, tgt, follow_symlinks=False)
++ else:
++ shutil.copytree(src, tgt, symlinks=True)
++
++
++def clone_testbed(
++ source: Path,
++ target: Path,
++ framework: Path,
++ platform: str,
++ apps: list[Path],
++) -> None:
++ if target.exists():
++ print(f"{target} already exists; aborting without creating project.")
++ sys.exit(10)
++
++ if framework is None:
++ if not (
++ source / "Python.xcframework" / TEST_SLICES[platform] / "bin"
++ ).is_dir():
++ print(
++ f"The testbed being cloned ({source}) does not contain "
++ "a framework with slices. Re-run with --framework"
++ )
++ sys.exit(11)
++ else:
++ if not framework.is_dir():
++ print(f"{framework} does not exist.")
++ sys.exit(12)
++ elif not (
++ framework.suffix == ".xcframework"
++ or (framework / "Python.framework").is_dir()
++ ):
++ print(
++ f"{framework} is not an XCframework, "
++ f"or a simulator slice of a framework build."
++ )
++ sys.exit(13)
++
++ print("Cloning testbed project:")
++ print(f" Cloning {source}...", end="")
++ # Only copy the files for the platform being cloned plus the files common
++ # to all platforms. The XCframework will be copied later, if needed.
++ target.mkdir(parents=True)
++
++ for name in [
++ "__main__.py",
++ "TestbedTests",
++ "Testbed.lldbinit",
++ f"{platform}Testbed",
++ f"{platform}Testbed.xcodeproj",
++ f"{platform}Testbed.xctestplan",
++ ]:
++ copy(source / name, target / name)
++
++ print(" done")
++
++ orig_xc_framework_path = source / "Python.xcframework"
++ xc_framework_path = target / "Python.xcframework"
++ test_framework_path = xc_framework_path / TEST_SLICES[platform]
++ if framework is not None:
++ if framework.suffix == ".xcframework":
++ print(" Installing XCFramework...", end="")
++ xc_framework_path.symlink_to(
++ relative_to(framework, xc_framework_path.parent)
++ )
++ print(" done")
++ else:
++ print(" Installing simulator framework...", end="")
++ # We're only installing a slice of a framework; we need
++ # to do a full tree copy to make sure we don't damage
++ # symlinked content.
++ shutil.copytree(orig_xc_framework_path, xc_framework_path)
++ if test_framework_path.is_dir():
++ shutil.rmtree(test_framework_path)
++ else:
++ test_framework_path.unlink(missing_ok=True)
++ test_framework_path.symlink_to(
++ relative_to(framework, test_framework_path.parent)
++ )
++ print(" done")
++ else:
++ copy(orig_xc_framework_path, xc_framework_path)
++
++ if (
++ xc_framework_path.is_symlink()
++ and not xc_framework_path.readlink().is_absolute()
++ ):
++ # XCFramework is a relative symlink. Rewrite the symlink relative
++ # to the new location.
++ print(" Rewriting symlink to XCframework...", end="")
++ resolved_xc_framework_path = (
++ source / xc_framework_path.readlink()
++ ).resolve()
++ xc_framework_path.unlink()
++ xc_framework_path.symlink_to(
++ relative_to(
++ resolved_xc_framework_path,
++ xc_framework_path.parent,
++ )
++ )
++ print(" done")
++ elif (
++ test_framework_path.is_symlink()
++ and not test_framework_path.readlink().is_absolute()
++ ):
++ print(" Rewriting symlink to simulator framework...", end="")
++ # Simulator framework is a relative symlink. Rewrite the symlink
++ # relative to the new location.
++ orig_test_framework_path = (
++ source / "Python.XCframework" / test_framework_path.readlink()
++ ).resolve()
++ test_framework_path.unlink()
++ test_framework_path.symlink_to(
++ relative_to(
++ orig_test_framework_path,
++ test_framework_path.parent,
++ )
++ )
++ print(" done")
++ else:
++ print(" Using pre-existing Python framework.")
++
++ for app_src in apps:
++ print(f" Installing app {app_src.name!r}...", end="")
++ app_target = target / f"Testbed/app/{app_src.name}"
++ if app_target.is_dir():
++ shutil.rmtree(app_target)
++ shutil.copytree(app_src, app_target)
++ print(" done")
++
++ print(f"Successfully cloned testbed: {target.resolve()}")
++
++
++def update_test_plan(testbed_path, platform, args):
++ # Modify the test plan to use the requested test arguments.
++ test_plan_path = testbed_path / f"{platform}Testbed.xctestplan"
++ with test_plan_path.open("r", encoding="utf-8") as f:
++ test_plan = json.load(f)
++
++ test_plan["defaultOptions"]["commandLineArgumentEntries"] = [
++ {"argument": shlex.quote(arg)} for arg in args
++ ]
++
++ with test_plan_path.open("w", encoding="utf-8") as f:
++ json.dump(test_plan, f, indent=2)
++
++
++def run_testbed(
++ platform: str,
++ simulator: str | None,
++ args: list[str],
++ verbose: bool = False,
++):
++ location = Path(__file__).parent
++ print("Updating test plan...", end="")
++ update_test_plan(location, platform, args)
++ print(" done.")
++
++ if simulator is None:
++ simulator = select_simulator_device(platform)
++ print(f"Running test on {simulator}")
++
++ xcode_test(
++ location,
++ platform=platform,
++ simulator=simulator,
++ verbose=verbose,
++ )
++
++
++def main():
++ # Look for directories like `iOSTestbed` as an indicator of the platforms
++ # that the testbed folder supports. The original source testbed can support
++ # many platforms, but when cloned, only one platform is preserved.
++ available_platforms = [
++ platform
++ for platform in ["iOS", "tvOS", "visionOS", "watchOS"]
++ if (Path(__file__).parent / f"{platform}Testbed").is_dir()
++ ]
++
++ parser = argparse.ArgumentParser(
++ description=(
++ "Manages the process of testing an Apple Python project "
++ "through Xcode."
++ ),
++ )
++
++ subcommands = parser.add_subparsers(dest="subcommand")
++ clone = subcommands.add_parser(
++ "clone",
++ description=(
++ "Clone the testbed project, copying in a Python framework and"
++ "any specified application code."
++ ),
++ help="Clone a testbed project to a new location.",
++ )
++ clone.add_argument(
++ "--framework",
++ help=(
++ "The location of the XCFramework (or simulator-only slice of an "
++ "XCFramework) to use when running the testbed"
++ ),
++ )
++ clone.add_argument(
++ "--platform",
++ dest="platform",
++ choices=available_platforms,
++ default=available_platforms[0],
++ help=f"The platform to target (default: {available_platforms[0]})",
++ )
++ clone.add_argument(
++ "--app",
++ dest="apps",
++ action="append",
++ default=[],
++ help="The location of any code to include in the testbed project",
++ )
++ clone.add_argument(
++ "location",
++ help="The path where the testbed will be cloned.",
++ )
++
++ run = subcommands.add_parser(
++ "run",
++ usage=(
++ "%(prog)s [-h] [--simulator SIMULATOR] -- "
++ " [ ...]"
++ ),
++ description=(
++ "Run a testbed project. The arguments provided after `--` will be "
++ "passed to the running test process as if they were arguments to "
++ "`python -m`."
++ ),
++ help="Run a testbed project",
++ )
++ run.add_argument(
++ "--platform",
++ dest="platform",
++ choices=available_platforms,
++ default=available_platforms[0],
++ help=f"The platform to target (default: {available_platforms[0]})",
++ )
++ run.add_argument(
++ "--simulator",
++ help=(
++ "The name of the simulator to use (eg: 'iPhone 16e'). Defaults to "
++ "the most recently released 'entry level' iPhone device. Device "
++ "architecture and OS version can also be specified; e.g., "
++ "`--simulator 'iPhone 16 Pro,arch=arm64,OS=26.0'` would run on "
++ "an ARM64 iPhone 16 Pro simulator running iOS 26.0."
++ ),
++ )
++ run.add_argument(
++ "-v",
++ "--verbose",
++ action="store_true",
++ help="Enable verbose output",
++ )
++
++ try:
++ pos = sys.argv.index("--")
++ testbed_args = sys.argv[1:pos]
++ test_args = sys.argv[pos + 1 :]
++ except ValueError:
++ testbed_args = sys.argv[1:]
++ test_args = []
++
++ context = parser.parse_args(testbed_args)
++
++ if context.subcommand == "clone":
++ clone_testbed(
++ source=Path(__file__).parent.resolve(),
++ target=Path(context.location).resolve(),
++ framework=Path(context.framework).resolve()
++ if context.framework
++ else None,
++ platform=context.platform,
++ apps=[Path(app) for app in context.apps],
++ )
++ elif context.subcommand == "run":
++ if test_args:
++ if not (
++ Path(__file__).parent
++ / "Python.xcframework"
++ / TEST_SLICES[context.platform]
++ / "bin"
++ ).is_dir():
++ print(
++ "Testbed does not contain a compiled Python framework. "
++ f"Use `python {sys.argv[0]} clone ...` to create a "
++ "runnable clone of this testbed."
++ )
++ sys.exit(20)
++
++ run_testbed(
++ platform=context.platform,
++ simulator=context.simulator,
++ verbose=context.verbose,
++ args=test_args,
++ )
++ else:
++ print(
++ "Must specify test arguments "
++ f"(e.g., {sys.argv[0]} run -- test)"
++ )
++ print()
++ parser.print_help(sys.stderr)
++ sys.exit(21)
++ else:
++ parser.print_help(sys.stderr)
++ sys.exit(1)
++
++
++if __name__ == "__main__":
++ # Under the buildbot, stdout is not a TTY, but we must still flush after
++ # every line to make sure our output appears in the correct order relative
++ # to the output of our subprocesses.
++ for stream in [sys.stdout, sys.stderr]:
++ stream.reconfigure(line_buffering=True)
++ main()
+--- /dev/null
++++ b/Apple/testbed/iOSTestbed.xcodeproj/project.pbxproj
+@@ -0,0 +1,557 @@
++// !$*UTF8*$!
++{
++ archiveVersion = 1;
++ classes = {
++ };
++ objectVersion = 56;
++ objects = {
++
++/* Begin PBXBuildFile section */
++ 607A66172B0EFA380010BFC8 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 607A66162B0EFA380010BFC8 /* AppDelegate.m */; };
++ 607A66222B0EFA390010BFC8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607A66212B0EFA390010BFC8 /* Assets.xcassets */; };
++ 607A66252B0EFA390010BFC8 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607A66232B0EFA390010BFC8 /* LaunchScreen.storyboard */; };
++ 607A66282B0EFA390010BFC8 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 607A66272B0EFA390010BFC8 /* main.m */; };
++ 607A66322B0EFA3A0010BFC8 /* TestbedTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 607A66312B0EFA3A0010BFC8 /* TestbedTests.m */; };
++ 607A664C2B0EFC080010BFC8 /* Python.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 607A664A2B0EFB310010BFC8 /* Python.xcframework */; };
++ 607A664D2B0EFC080010BFC8 /* Python.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 607A664A2B0EFB310010BFC8 /* Python.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
++ 607A66502B0EFFE00010BFC8 /* Python.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 607A664A2B0EFB310010BFC8 /* Python.xcframework */; };
++ 607A66512B0EFFE00010BFC8 /* Python.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 607A664A2B0EFB310010BFC8 /* Python.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
++ 608619542CB77BA900F46182 /* app_packages in Resources */ = {isa = PBXBuildFile; fileRef = 608619532CB77BA900F46182 /* app_packages */; };
++ 608619562CB7819B00F46182 /* app in Resources */ = {isa = PBXBuildFile; fileRef = 608619552CB7819B00F46182 /* app */; };
++/* End PBXBuildFile section */
++
++/* Begin PBXContainerItemProxy section */
++ 607A662E2B0EFA3A0010BFC8 /* PBXContainerItemProxy */ = {
++ isa = PBXContainerItemProxy;
++ containerPortal = 607A660A2B0EFA380010BFC8 /* Project object */;
++ proxyType = 1;
++ remoteGlobalIDString = 607A66112B0EFA380010BFC8;
++ remoteInfo = iOSTestbed;
++ };
++/* End PBXContainerItemProxy section */
++
++/* Begin PBXCopyFilesBuildPhase section */
++ 607A664E2B0EFC080010BFC8 /* Embed Frameworks */ = {
++ isa = PBXCopyFilesBuildPhase;
++ buildActionMask = 2147483647;
++ dstPath = "";
++ dstSubfolderSpec = 10;
++ files = (
++ 607A664D2B0EFC080010BFC8 /* Python.xcframework in Embed Frameworks */,
++ );
++ name = "Embed Frameworks";
++ runOnlyForDeploymentPostprocessing = 0;
++ };
++ 607A66522B0EFFE00010BFC8 /* Embed Frameworks */ = {
++ isa = PBXCopyFilesBuildPhase;
++ buildActionMask = 2147483647;
++ dstPath = "";
++ dstSubfolderSpec = 10;
++ files = (
++ 607A66512B0EFFE00010BFC8 /* Python.xcframework in Embed Frameworks */,
++ );
++ name = "Embed Frameworks";
++ runOnlyForDeploymentPostprocessing = 0;
++ };
++/* End PBXCopyFilesBuildPhase section */
++
++/* Begin PBXFileReference section */
++ 607A66122B0EFA380010BFC8 /* iOSTestbed.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iOSTestbed.app; sourceTree = BUILT_PRODUCTS_DIR; };
++ 607A66152B0EFA380010BFC8 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
++ 607A66162B0EFA380010BFC8 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
++ 607A66212B0EFA390010BFC8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
++ 607A66242B0EFA390010BFC8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
++ 607A66272B0EFA390010BFC8 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
++ 607A662D2B0EFA3A0010BFC8 /* iOSTestbedTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iOSTestbedTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
++ 607A66312B0EFA3A0010BFC8 /* TestbedTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TestbedTests.m; sourceTree = ""; };
++ 607A664A2B0EFB310010BFC8 /* Python.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = Python.xcframework; sourceTree = ""; };
++ 607A66592B0F08600010BFC8 /* iOSTestbed-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "iOSTestbed-Info.plist"; sourceTree = ""; };
++ 608619532CB77BA900F46182 /* app_packages */ = {isa = PBXFileReference; lastKnownFileType = folder; path = app_packages; sourceTree = ""; };
++ 608619552CB7819B00F46182 /* app */ = {isa = PBXFileReference; lastKnownFileType = folder; path = app; sourceTree = ""; };
++ 60FE0EFB2E56BB6D00524F87 /* iOSTestbed.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = iOSTestbed.xctestplan; sourceTree = ""; };
++/* End PBXFileReference section */
++
++/* Begin PBXFrameworksBuildPhase section */
++ 607A660F2B0EFA380010BFC8 /* Frameworks */ = {
++ isa = PBXFrameworksBuildPhase;
++ buildActionMask = 2147483647;
++ files = (
++ 607A664C2B0EFC080010BFC8 /* Python.xcframework in Frameworks */,
++ );
++ runOnlyForDeploymentPostprocessing = 0;
++ };
++ 607A662A2B0EFA3A0010BFC8 /* Frameworks */ = {
++ isa = PBXFrameworksBuildPhase;
++ buildActionMask = 2147483647;
++ files = (
++ 607A66502B0EFFE00010BFC8 /* Python.xcframework in Frameworks */,
++ );
++ runOnlyForDeploymentPostprocessing = 0;
++ };
++/* End PBXFrameworksBuildPhase section */
++
++/* Begin PBXGroup section */
++ 607A66092B0EFA380010BFC8 = {
++ isa = PBXGroup;
++ children = (
++ 60FE0EFB2E56BB6D00524F87 /* iOSTestbed.xctestplan */,
++ 607A664A2B0EFB310010BFC8 /* Python.xcframework */,
++ 607A66142B0EFA380010BFC8 /* iOSTestbed */,
++ 607A66302B0EFA3A0010BFC8 /* TestbedTests */,
++ 607A66132B0EFA380010BFC8 /* Products */,
++ 607A664F2B0EFFE00010BFC8 /* Frameworks */,
++ );
++ sourceTree = "";
++ };
++ 607A66132B0EFA380010BFC8 /* Products */ = {
++ isa = PBXGroup;
++ children = (
++ 607A66122B0EFA380010BFC8 /* iOSTestbed.app */,
++ 607A662D2B0EFA3A0010BFC8 /* iOSTestbedTests.xctest */,
++ );
++ name = Products;
++ sourceTree = "";
++ };
++ 607A66142B0EFA380010BFC8 /* iOSTestbed */ = {
++ isa = PBXGroup;
++ children = (
++ 608619552CB7819B00F46182 /* app */,
++ 608619532CB77BA900F46182 /* app_packages */,
++ 607A66592B0F08600010BFC8 /* iOSTestbed-Info.plist */,
++ 607A66152B0EFA380010BFC8 /* AppDelegate.h */,
++ 607A66162B0EFA380010BFC8 /* AppDelegate.m */,
++ 607A66212B0EFA390010BFC8 /* Assets.xcassets */,
++ 607A66232B0EFA390010BFC8 /* LaunchScreen.storyboard */,
++ 607A66272B0EFA390010BFC8 /* main.m */,
++ );
++ path = iOSTestbed;
++ sourceTree = "";
++ };
++ 607A66302B0EFA3A0010BFC8 /* TestbedTests */ = {
++ isa = PBXGroup;
++ children = (
++ 607A66312B0EFA3A0010BFC8 /* TestbedTests.m */,
++ );
++ path = TestbedTests;
++ sourceTree = "";
++ };
++ 607A664F2B0EFFE00010BFC8 /* Frameworks */ = {
++ isa = PBXGroup;
++ children = (
++ );
++ name = Frameworks;
++ sourceTree = "";
++ };
++/* End PBXGroup section */
++
++/* Begin PBXNativeTarget section */
++ 607A66112B0EFA380010BFC8 /* iOSTestbed */ = {
++ isa = PBXNativeTarget;
++ buildConfigurationList = 607A66412B0EFA3A0010BFC8 /* Build configuration list for PBXNativeTarget "iOSTestbed" */;
++ buildPhases = (
++ 607A660E2B0EFA380010BFC8 /* Sources */,
++ 607A660F2B0EFA380010BFC8 /* Frameworks */,
++ 607A66102B0EFA380010BFC8 /* Resources */,
++ 607A66552B0F061D0010BFC8 /* Process Python libraries */,
++ 607A664E2B0EFC080010BFC8 /* Embed Frameworks */,
++ );
++ buildRules = (
++ );
++ dependencies = (
++ );
++ name = iOSTestbed;
++ productName = iOSTestbed;
++ productReference = 607A66122B0EFA380010BFC8 /* iOSTestbed.app */;
++ productType = "com.apple.product-type.application";
++ };
++ 607A662C2B0EFA3A0010BFC8 /* iOSTestbedTests */ = {
++ isa = PBXNativeTarget;
++ buildConfigurationList = 607A66442B0EFA3A0010BFC8 /* Build configuration list for PBXNativeTarget "iOSTestbedTests" */;
++ buildPhases = (
++ 607A66292B0EFA3A0010BFC8 /* Sources */,
++ 607A662A2B0EFA3A0010BFC8 /* Frameworks */,
++ 607A662B2B0EFA3A0010BFC8 /* Resources */,
++ 607A66522B0EFFE00010BFC8 /* Embed Frameworks */,
++ );
++ buildRules = (
++ );
++ dependencies = (
++ 607A662F2B0EFA3A0010BFC8 /* PBXTargetDependency */,
++ );
++ name = iOSTestbedTests;
++ productName = iOSTestbedTests;
++ productReference = 607A662D2B0EFA3A0010BFC8 /* iOSTestbedTests.xctest */;
++ productType = "com.apple.product-type.bundle.unit-test";
++ };
++/* End PBXNativeTarget section */
++
++/* Begin PBXProject section */
++ 607A660A2B0EFA380010BFC8 /* Project object */ = {
++ isa = PBXProject;
++ attributes = {
++ BuildIndependentTargetsInParallel = 1;
++ LastUpgradeCheck = 1500;
++ TargetAttributes = {
++ 607A66112B0EFA380010BFC8 = {
++ CreatedOnToolsVersion = 15.0.1;
++ };
++ 607A662C2B0EFA3A0010BFC8 = {
++ CreatedOnToolsVersion = 15.0.1;
++ TestTargetID = 607A66112B0EFA380010BFC8;
++ };
++ };
++ };
++ buildConfigurationList = 607A660D2B0EFA380010BFC8 /* Build configuration list for PBXProject "iOSTestbed" */;
++ compatibilityVersion = "Xcode 14.0";
++ developmentRegion = en;
++ hasScannedForEncodings = 0;
++ knownRegions = (
++ en,
++ Base,
++ );
++ mainGroup = 607A66092B0EFA380010BFC8;
++ productRefGroup = 607A66132B0EFA380010BFC8 /* Products */;
++ projectDirPath = "";
++ projectRoot = "";
++ targets = (
++ 607A66112B0EFA380010BFC8 /* iOSTestbed */,
++ 607A662C2B0EFA3A0010BFC8 /* iOSTestbedTests */,
++ );
++ };
++/* End PBXProject section */
++
++/* Begin PBXResourcesBuildPhase section */
++ 607A66102B0EFA380010BFC8 /* Resources */ = {
++ isa = PBXResourcesBuildPhase;
++ buildActionMask = 2147483647;
++ files = (
++ 607A66252B0EFA390010BFC8 /* LaunchScreen.storyboard in Resources */,
++ 608619562CB7819B00F46182 /* app in Resources */,
++ 607A66222B0EFA390010BFC8 /* Assets.xcassets in Resources */,
++ 608619542CB77BA900F46182 /* app_packages in Resources */,
++ );
++ runOnlyForDeploymentPostprocessing = 0;
++ };
++ 607A662B2B0EFA3A0010BFC8 /* Resources */ = {
++ isa = PBXResourcesBuildPhase;
++ buildActionMask = 2147483647;
++ files = (
++ );
++ runOnlyForDeploymentPostprocessing = 0;
++ };
++/* End PBXResourcesBuildPhase section */
++
++/* Begin PBXShellScriptBuildPhase section */
++ 607A66552B0F061D0010BFC8 /* Process Python libraries */ = {
++ isa = PBXShellScriptBuildPhase;
++ alwaysOutOfDate = 1;
++ buildActionMask = 2147483647;
++ files = (
++ );
++ inputFileListPaths = (
++ );
++ inputPaths = (
++ );
++ name = "Process Python libraries";
++ outputFileListPaths = (
++ );
++ outputPaths = (
++ );
++ runOnlyForDeploymentPostprocessing = 0;
++ shellPath = /bin/sh;
++ shellScript = "set -e\nsource $PROJECT_DIR/Python.xcframework/build/utils.sh\ninstall_python Python.xcframework app app_packages\n";
++ showEnvVarsInLog = 0;
++ };
++/* End PBXShellScriptBuildPhase section */
++
++/* Begin PBXSourcesBuildPhase section */
++ 607A660E2B0EFA380010BFC8 /* Sources */ = {
++ isa = PBXSourcesBuildPhase;
++ buildActionMask = 2147483647;
++ files = (
++ 607A66172B0EFA380010BFC8 /* AppDelegate.m in Sources */,
++ 607A66282B0EFA390010BFC8 /* main.m in Sources */,
++ );
++ runOnlyForDeploymentPostprocessing = 0;
++ };
++ 607A66292B0EFA3A0010BFC8 /* Sources */ = {
++ isa = PBXSourcesBuildPhase;
++ buildActionMask = 2147483647;
++ files = (
++ 607A66322B0EFA3A0010BFC8 /* TestbedTests.m in Sources */,
++ );
++ runOnlyForDeploymentPostprocessing = 0;
++ };
++/* End PBXSourcesBuildPhase section */
++
++/* Begin PBXTargetDependency section */
++ 607A662F2B0EFA3A0010BFC8 /* PBXTargetDependency */ = {
++ isa = PBXTargetDependency;
++ target = 607A66112B0EFA380010BFC8 /* iOSTestbed */;
++ targetProxy = 607A662E2B0EFA3A0010BFC8 /* PBXContainerItemProxy */;
++ };
++/* End PBXTargetDependency section */
++
++/* Begin PBXVariantGroup section */
++ 607A66232B0EFA390010BFC8 /* LaunchScreen.storyboard */ = {
++ isa = PBXVariantGroup;
++ children = (
++ 607A66242B0EFA390010BFC8 /* Base */,
++ );
++ name = LaunchScreen.storyboard;
++ sourceTree = "";
++ };
++/* End PBXVariantGroup section */
++
++/* Begin XCBuildConfiguration section */
++ 607A663F2B0EFA3A0010BFC8 /* Debug */ = {
++ isa = XCBuildConfiguration;
++ buildSettings = {
++ ALWAYS_SEARCH_USER_PATHS = NO;
++ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
++ CLANG_ANALYZER_NONNULL = YES;
++ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
++ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
++ CLANG_ENABLE_MODULES = YES;
++ CLANG_ENABLE_OBJC_ARC = YES;
++ CLANG_ENABLE_OBJC_WEAK = YES;
++ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
++ CLANG_WARN_BOOL_CONVERSION = YES;
++ CLANG_WARN_COMMA = YES;
++ CLANG_WARN_CONSTANT_CONVERSION = YES;
++ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
++ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
++ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
++ CLANG_WARN_EMPTY_BODY = YES;
++ CLANG_WARN_ENUM_CONVERSION = YES;
++ CLANG_WARN_INFINITE_RECURSION = YES;
++ CLANG_WARN_INT_CONVERSION = YES;
++ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
++ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
++ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
++ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
++ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
++ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
++ CLANG_WARN_STRICT_PROTOTYPES = YES;
++ CLANG_WARN_SUSPICIOUS_MOVE = YES;
++ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
++ CLANG_WARN_UNREACHABLE_CODE = YES;
++ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
++ COPY_PHASE_STRIP = NO;
++ DEBUG_INFORMATION_FORMAT = dwarf;
++ ENABLE_STRICT_OBJC_MSGSEND = YES;
++ ENABLE_TESTABILITY = YES;
++ ENABLE_USER_SCRIPT_SANDBOXING = YES;
++ GCC_C_LANGUAGE_STANDARD = gnu17;
++ GCC_DYNAMIC_NO_PIC = NO;
++ GCC_NO_COMMON_BLOCKS = YES;
++ GCC_OPTIMIZATION_LEVEL = 0;
++ GCC_PREPROCESSOR_DEFINITIONS = (
++ "DEBUG=1",
++ "$(inherited)",
++ );
++ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
++ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
++ GCC_WARN_UNDECLARED_SELECTOR = YES;
++ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
++ GCC_WARN_UNUSED_FUNCTION = YES;
++ GCC_WARN_UNUSED_VARIABLE = YES;
++ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
++ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
++ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
++ MTL_FAST_MATH = YES;
++ ONLY_ACTIVE_ARCH = YES;
++ SDKROOT = iphoneos;
++ };
++ name = Debug;
++ };
++ 607A66402B0EFA3A0010BFC8 /* Release */ = {
++ isa = XCBuildConfiguration;
++ buildSettings = {
++ ALWAYS_SEARCH_USER_PATHS = NO;
++ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
++ CLANG_ANALYZER_NONNULL = YES;
++ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
++ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
++ CLANG_ENABLE_MODULES = YES;
++ CLANG_ENABLE_OBJC_ARC = YES;
++ CLANG_ENABLE_OBJC_WEAK = YES;
++ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
++ CLANG_WARN_BOOL_CONVERSION = YES;
++ CLANG_WARN_COMMA = YES;
++ CLANG_WARN_CONSTANT_CONVERSION = YES;
++ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
++ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
++ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
++ CLANG_WARN_EMPTY_BODY = YES;
++ CLANG_WARN_ENUM_CONVERSION = YES;
++ CLANG_WARN_INFINITE_RECURSION = YES;
++ CLANG_WARN_INT_CONVERSION = YES;
++ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
++ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
++ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
++ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
++ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
++ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
++ CLANG_WARN_STRICT_PROTOTYPES = YES;
++ CLANG_WARN_SUSPICIOUS_MOVE = YES;
++ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
++ CLANG_WARN_UNREACHABLE_CODE = YES;
++ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
++ COPY_PHASE_STRIP = NO;
++ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
++ ENABLE_NS_ASSERTIONS = NO;
++ ENABLE_STRICT_OBJC_MSGSEND = YES;
++ ENABLE_USER_SCRIPT_SANDBOXING = YES;
++ GCC_C_LANGUAGE_STANDARD = gnu17;
++ GCC_NO_COMMON_BLOCKS = YES;
++ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
++ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
++ GCC_WARN_UNDECLARED_SELECTOR = YES;
++ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
++ GCC_WARN_UNUSED_FUNCTION = YES;
++ GCC_WARN_UNUSED_VARIABLE = YES;
++ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
++ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
++ MTL_ENABLE_DEBUG_INFO = NO;
++ MTL_FAST_MATH = YES;
++ SDKROOT = iphoneos;
++ VALIDATE_PRODUCT = YES;
++ };
++ name = Release;
++ };
++ 607A66422B0EFA3A0010BFC8 /* Debug */ = {
++ isa = XCBuildConfiguration;
++ buildSettings = {
++ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
++ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
++ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;
++ CODE_SIGN_STYLE = Automatic;
++ CURRENT_PROJECT_VERSION = 1;
++ DEVELOPMENT_TEAM = "";
++ ENABLE_USER_SCRIPT_SANDBOXING = NO;
++ HEADER_SEARCH_PATHS = "\"$(BUILT_PRODUCTS_DIR)/Python.framework/Headers\"";
++ INFOPLIST_FILE = "iOSTestbed/iOSTestbed-Info.plist";
++ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
++ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
++ INFOPLIST_KEY_UIMainStoryboardFile = Main;
++ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
++ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
++ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
++ LD_RUNPATH_SEARCH_PATHS = (
++ "$(inherited)",
++ "@executable_path/Frameworks",
++ );
++ MARKETING_VERSION = 3.13.0a1;
++ PRODUCT_BUNDLE_IDENTIFIER = org.python.iOSTestbed;
++ PRODUCT_NAME = "$(TARGET_NAME)";
++ SWIFT_EMIT_LOC_STRINGS = YES;
++ TARGETED_DEVICE_FAMILY = "1,2";
++ };
++ name = Debug;
++ };
++ 607A66432B0EFA3A0010BFC8 /* Release */ = {
++ isa = XCBuildConfiguration;
++ buildSettings = {
++ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
++ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
++ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;
++ CODE_SIGN_STYLE = Automatic;
++ CURRENT_PROJECT_VERSION = 1;
++ DEVELOPMENT_TEAM = "";
++ ENABLE_TESTABILITY = YES;
++ ENABLE_USER_SCRIPT_SANDBOXING = NO;
++ HEADER_SEARCH_PATHS = "\"$(BUILT_PRODUCTS_DIR)/Python.framework/Headers\"";
++ INFOPLIST_FILE = "iOSTestbed/iOSTestbed-Info.plist";
++ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
++ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
++ INFOPLIST_KEY_UIMainStoryboardFile = Main;
++ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
++ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
++ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
++ LD_RUNPATH_SEARCH_PATHS = (
++ "$(inherited)",
++ "@executable_path/Frameworks",
++ );
++ MARKETING_VERSION = 3.13.0a1;
++ PRODUCT_BUNDLE_IDENTIFIER = org.python.iOSTestbed;
++ PRODUCT_NAME = "$(TARGET_NAME)";
++ SWIFT_EMIT_LOC_STRINGS = YES;
++ TARGETED_DEVICE_FAMILY = "1,2";
++ };
++ name = Release;
++ };
++ 607A66452B0EFA3A0010BFC8 /* Debug */ = {
++ isa = XCBuildConfiguration;
++ buildSettings = {
++ BUNDLE_LOADER = "$(TEST_HOST)";
++ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;
++ CODE_SIGN_STYLE = Automatic;
++ CURRENT_PROJECT_VERSION = 1;
++ DEVELOPMENT_TEAM = 3HEZE76D99;
++ GENERATE_INFOPLIST_FILE = YES;
++ HEADER_SEARCH_PATHS = "\"$(BUILT_PRODUCTS_DIR)/Python.framework/Headers\"";
++ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
++ MARKETING_VERSION = 1.0;
++ PRODUCT_BUNDLE_IDENTIFIER = org.python.iOSTestbedTests;
++ PRODUCT_NAME = "$(TARGET_NAME)";
++ SWIFT_EMIT_LOC_STRINGS = NO;
++ TARGETED_DEVICE_FAMILY = "1,2";
++ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/iOSTestbed.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/iOSTestbed";
++ };
++ name = Debug;
++ };
++ 607A66462B0EFA3A0010BFC8 /* Release */ = {
++ isa = XCBuildConfiguration;
++ buildSettings = {
++ BUNDLE_LOADER = "$(TEST_HOST)";
++ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;
++ CODE_SIGN_STYLE = Automatic;
++ CURRENT_PROJECT_VERSION = 1;
++ DEVELOPMENT_TEAM = 3HEZE76D99;
++ GENERATE_INFOPLIST_FILE = YES;
++ HEADER_SEARCH_PATHS = "\"$(BUILT_PRODUCTS_DIR)/Python.framework/Headers\"";
++ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
++ MARKETING_VERSION = 1.0;
++ PRODUCT_BUNDLE_IDENTIFIER = org.python.iOSTestbedTests;
++ PRODUCT_NAME = "$(TARGET_NAME)";
++ SWIFT_EMIT_LOC_STRINGS = NO;
++ TARGETED_DEVICE_FAMILY = "1,2";
++ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/iOSTestbed.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/iOSTestbed";
++ };
++ name = Release;
++ };
++/* End XCBuildConfiguration section */
++
++/* Begin XCConfigurationList section */
++ 607A660D2B0EFA380010BFC8 /* Build configuration list for PBXProject "iOSTestbed" */ = {
++ isa = XCConfigurationList;
++ buildConfigurations = (
++ 607A663F2B0EFA3A0010BFC8 /* Debug */,
++ 607A66402B0EFA3A0010BFC8 /* Release */,
++ );
++ defaultConfigurationIsVisible = 0;
++ defaultConfigurationName = Release;
++ };
++ 607A66412B0EFA3A0010BFC8 /* Build configuration list for PBXNativeTarget "iOSTestbed" */ = {
++ isa = XCConfigurationList;
++ buildConfigurations = (
++ 607A66422B0EFA3A0010BFC8 /* Debug */,
++ 607A66432B0EFA3A0010BFC8 /* Release */,
++ );
++ defaultConfigurationIsVisible = 0;
++ defaultConfigurationName = Release;
++ };
++ 607A66442B0EFA3A0010BFC8 /* Build configuration list for PBXNativeTarget "iOSTestbedTests" */ = {
++ isa = XCConfigurationList;
++ buildConfigurations = (
++ 607A66452B0EFA3A0010BFC8 /* Debug */,
++ 607A66462B0EFA3A0010BFC8 /* Release */,
++ );
++ defaultConfigurationIsVisible = 0;
++ defaultConfigurationName = Release;
++ };
++/* End XCConfigurationList section */
++ };
++ rootObject = 607A660A2B0EFA380010BFC8 /* Project object */;
++}
+--- /dev/null
++++ b/Apple/testbed/iOSTestbed.xcodeproj/xcshareddata/xcschemes/iOSTestbed.xcscheme
+@@ -0,0 +1,97 @@
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+--- /dev/null
++++ b/Apple/testbed/iOSTestbed.xctestplan
+@@ -0,0 +1,46 @@
++{
++ "configurations" : [
++ {
++ "id" : "F5A95CE4-1ADE-4A6E-A0E1-CDBAE26DF0C5",
++ "name" : "Test Scheme Action",
++ "options" : {
++
++ }
++ }
++ ],
++ "defaultOptions" : {
++ "commandLineArgumentEntries" : [
++ {
++ "argument" : "test"
++ },
++ {
++ "argument" : "-uall"
++ },
++ {
++ "argument" : "--single-process"
++ },
++ {
++ "argument" : "--rerun"
++ },
++ {
++ "argument" : "-W"
++ }
++ ],
++ "targetForVariableExpansion" : {
++ "containerPath" : "container:iOSTestbed.xcodeproj",
++ "identifier" : "607A66112B0EFA380010BFC8",
++ "name" : "iOSTestbed"
++ }
++ },
++ "testTargets" : [
++ {
++ "parallelizable" : false,
++ "target" : {
++ "containerPath" : "container:iOSTestbed.xcodeproj",
++ "identifier" : "607A662C2B0EFA3A0010BFC8",
++ "name" : "iOSTestbedTests"
++ }
++ }
++ ],
++ "version" : 1
++}
+--- /dev/null
++++ b/Apple/testbed/iOSTestbed/AppDelegate.h
+@@ -0,0 +1,11 @@
++//
++// AppDelegate.h
++// iOSTestbed
++//
++
++#import
++
++@interface AppDelegate : UIResponder
++
++
++@end
+--- /dev/null
++++ b/Apple/testbed/iOSTestbed/AppDelegate.m
+@@ -0,0 +1,19 @@
++//
++// AppDelegate.m
++// iOSTestbed
++//
++
++#import "AppDelegate.h"
++
++@interface AppDelegate ()
++
++@end
++
++@implementation AppDelegate
++
++
++- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
++ return YES;
++}
++
++@end
+--- /dev/null
++++ b/Apple/testbed/iOSTestbed/Assets.xcassets/AccentColor.colorset/Contents.json
+@@ -0,0 +1,11 @@
++{
++ "colors" : [
++ {
++ "idiom" : "universal"
++ }
++ ],
++ "info" : {
++ "author" : "xcode",
++ "version" : 1
++ }
++}
+--- /dev/null
++++ b/Apple/testbed/iOSTestbed/Assets.xcassets/AppIcon.appiconset/Contents.json
+@@ -0,0 +1,13 @@
++{
++ "images" : [
++ {
++ "idiom" : "universal",
++ "platform" : "ios",
++ "size" : "1024x1024"
++ }
++ ],
++ "info" : {
++ "author" : "xcode",
++ "version" : 1
++ }
++}
+--- /dev/null
++++ b/Apple/testbed/iOSTestbed/Assets.xcassets/Contents.json
+@@ -0,0 +1,6 @@
++{
++ "info" : {
++ "author" : "xcode",
++ "version" : 1
++ }
++}
+--- /dev/null
++++ b/Apple/testbed/iOSTestbed/Base.lproj/LaunchScreen.storyboard
+@@ -0,0 +1,9 @@
++
++
++
++
++
++
++
++
++
+--- /dev/null
++++ b/Apple/testbed/iOSTestbed/app/README
+@@ -0,0 +1,7 @@
++This folder can contain any Python application code.
++
++During the build, any binary modules found in this folder will be processed into
++Framework form.
++
++When the test suite runs, this folder will be on the PYTHONPATH, and will be the
++working directory for the test suite.
+--- /dev/null
++++ b/Apple/testbed/iOSTestbed/app_packages/README
+@@ -0,0 +1,7 @@
++This folder can be a target for installing any Python dependencies needed by the
++test suite.
++
++During the build, any binary modules found in this folder will be processed into
++Framework form.
++
++When the test suite runs, this folder will be on the PYTHONPATH.
+--- /dev/null
++++ b/Apple/testbed/iOSTestbed/iOSTestbed-Info.plist
+@@ -0,0 +1,52 @@
++
++
++
++
++ CFBundleDevelopmentRegion
++ en
++ CFBundleDisplayName
++ ${PRODUCT_NAME}
++ CFBundleExecutable
++ ${EXECUTABLE_NAME}
++ CFBundleIdentifier
++ org.python.iOSTestbed
++ CFBundleInfoDictionaryVersion
++ 6.0
++ CFBundleName
++ ${PRODUCT_NAME}
++ CFBundlePackageType
++ APPL
++ CFBundleShortVersionString
++ 1.0
++ CFBundleSignature
++ ????
++ CFBundleVersion
++ 1
++ LSRequiresIPhoneOS
++
++ UIRequiresFullScreen
++
++ UILaunchStoryboardName
++ Launch Screen
++ UISupportedInterfaceOrientations
++
++ UIInterfaceOrientationPortrait
++ UIInterfaceOrientationLandscapeLeft
++ UIInterfaceOrientationLandscapeRight
++
++ UISupportedInterfaceOrientations~ipad
++
++ UIInterfaceOrientationPortrait
++ UIInterfaceOrientationPortraitUpsideDown
++ UIInterfaceOrientationLandscapeLeft
++ UIInterfaceOrientationLandscapeRight
++
++ UIApplicationSceneManifest
++
++ UIApplicationSupportsMultipleScenes
++
++ UISceneConfigurations
++
++
++
++
+--- /dev/null
++++ b/Apple/testbed/iOSTestbed/main.m
+@@ -0,0 +1,16 @@
++//
++// main.m
++// iOSTestbed
++//
++
++#import
++#import "AppDelegate.h"
++
++int main(int argc, char * argv[]) {
++ NSString * appDelegateClassName;
++ @autoreleasepool {
++ appDelegateClassName = NSStringFromClass([AppDelegate class]);
++
++ return UIApplicationMain(argc, argv, nil, appDelegateClassName);
++ }
++}
+--- /dev/null
++++ b/Apple/testbed/tvOSTestbed.xcodeproj/project.pbxproj
+@@ -0,0 +1,506 @@
++// !$*UTF8*$!
++{
++ archiveVersion = 1;
++ classes = {
++ };
++ objectVersion = 77;
++ objects = {
++
++/* Begin PBXBuildFile section */
++ EE7C8A1E2DCD6FF3003206DB /* Python.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE7C8A1C2DCD6FF3003206DB /* Python.xcframework */; };
++ EE7C8A1F2DCD70CD003206DB /* Python.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE7C8A1C2DCD6FF3003206DB /* Python.xcframework */; };
++ EE7C8A202DCD70CD003206DB /* Python.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = EE7C8A1C2DCD6FF3003206DB /* Python.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
++/* End PBXBuildFile section */
++
++/* Begin PBXContainerItemProxy section */
++ EE989E662DCD6E7A0036B268 /* PBXContainerItemProxy */ = {
++ isa = PBXContainerItemProxy;
++ containerPortal = EE989E462DCD6E780036B268 /* Project object */;
++ proxyType = 1;
++ remoteGlobalIDString = EE989E4D2DCD6E780036B268;
++ remoteInfo = tvOSTestbed;
++ };
++/* End PBXContainerItemProxy section */
++
++/* Begin PBXCopyFilesBuildPhase section */
++ EE7C8A212DCD70CD003206DB /* Embed Frameworks */ = {
++ isa = PBXCopyFilesBuildPhase;
++ buildActionMask = 2147483647;
++ dstPath = "";
++ dstSubfolderSpec = 10;
++ files = (
++ EE7C8A202DCD70CD003206DB /* Python.xcframework in Embed Frameworks */,
++ );
++ name = "Embed Frameworks";
++ runOnlyForDeploymentPostprocessing = 0;
++ };
++/* End PBXCopyFilesBuildPhase section */
++
++/* Begin PBXFileReference section */
++ 6077B3802E82A4BE00E3D6A3 /* tvOSTestbed.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = tvOSTestbed.xctestplan; sourceTree = ""; };
++ EE7C8A1C2DCD6FF3003206DB /* Python.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = Python.xcframework; sourceTree = ""; };
++ EE989E4E2DCD6E780036B268 /* tvOSTestbed.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = tvOSTestbed.app; sourceTree = BUILT_PRODUCTS_DIR; };
++ EE989E652DCD6E7A0036B268 /* TestbedTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TestbedTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
++/* End PBXFileReference section */
++
++/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
++ 6077B37F2E81892A00E3D6A3 /* Exceptions for "tvOSTestbed" folder in "tvOSTestbed" target */ = {
++ isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
++ membershipExceptions = (
++ "tvOSTestbed-Info.plist",
++ );
++ target = EE989E4D2DCD6E780036B268 /* tvOSTestbed */;
++ };
++/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
++
++/* Begin PBXFileSystemSynchronizedRootGroup section */
++ EE989E502DCD6E780036B268 /* tvOSTestbed */ = {
++ isa = PBXFileSystemSynchronizedRootGroup;
++ exceptions = (
++ 6077B37F2E81892A00E3D6A3 /* Exceptions for "tvOSTestbed" folder in "tvOSTestbed" target */,
++ );
++ explicitFolders = (
++ app,
++ app_packages,
++ );
++ path = tvOSTestbed;
++ sourceTree = "";
++ };
++ EE989E682DCD6E7A0036B268 /* TestbedTests */ = {
++ isa = PBXFileSystemSynchronizedRootGroup;
++ path = TestbedTests;
++ sourceTree = "";
++ };
++/* End PBXFileSystemSynchronizedRootGroup section */
++
++/* Begin PBXFrameworksBuildPhase section */
++ EE989E4B2DCD6E780036B268 /* Frameworks */ = {
++ isa = PBXFrameworksBuildPhase;
++ buildActionMask = 2147483647;
++ files = (
++ EE7C8A1F2DCD70CD003206DB /* Python.xcframework in Frameworks */,
++ );
++ runOnlyForDeploymentPostprocessing = 0;
++ };
++ EE989E622DCD6E7A0036B268 /* Frameworks */ = {
++ isa = PBXFrameworksBuildPhase;
++ buildActionMask = 2147483647;
++ files = (
++ EE7C8A1E2DCD6FF3003206DB /* Python.xcframework in Frameworks */,
++ );
++ runOnlyForDeploymentPostprocessing = 0;
++ };
++/* End PBXFrameworksBuildPhase section */
++
++/* Begin PBXGroup section */
++ EE989E452DCD6E780036B268 = {
++ isa = PBXGroup;
++ children = (
++ 6077B3802E82A4BE00E3D6A3 /* tvOSTestbed.xctestplan */,
++ EE7C8A1C2DCD6FF3003206DB /* Python.xcframework */,
++ EE989E502DCD6E780036B268 /* tvOSTestbed */,
++ EE989E682DCD6E7A0036B268 /* TestbedTests */,
++ EE989E4F2DCD6E780036B268 /* Products */,
++ );
++ sourceTree = "";
++ };
++ EE989E4F2DCD6E780036B268 /* Products */ = {
++ isa = PBXGroup;
++ children = (
++ EE989E4E2DCD6E780036B268 /* tvOSTestbed.app */,
++ EE989E652DCD6E7A0036B268 /* TestbedTests.xctest */,
++ );
++ name = Products;
++ sourceTree = "";
++ };
++/* End PBXGroup section */
++
++/* Begin PBXNativeTarget section */
++ EE989E4D2DCD6E780036B268 /* tvOSTestbed */ = {
++ isa = PBXNativeTarget;
++ buildConfigurationList = EE989E792DCD6E7A0036B268 /* Build configuration list for PBXNativeTarget "tvOSTestbed" */;
++ buildPhases = (
++ EE989E4A2DCD6E780036B268 /* Sources */,
++ EE989E4B2DCD6E780036B268 /* Frameworks */,
++ EE989E4C2DCD6E780036B268 /* Resources */,
++ EE7C8A222DCD70F4003206DB /* Process Python libraries */,
++ EE7C8A212DCD70CD003206DB /* Embed Frameworks */,
++ );
++ buildRules = (
++ );
++ dependencies = (
++ );
++ fileSystemSynchronizedGroups = (
++ EE989E502DCD6E780036B268 /* tvOSTestbed */,
++ );
++ name = tvOSTestbed;
++ packageProductDependencies = (
++ );
++ productName = tvOSTestbed;
++ productReference = EE989E4E2DCD6E780036B268 /* tvOSTestbed.app */;
++ productType = "com.apple.product-type.application";
++ };
++ EE989E642DCD6E7A0036B268 /* TestbedTests */ = {
++ isa = PBXNativeTarget;
++ buildConfigurationList = EE989E7C2DCD6E7A0036B268 /* Build configuration list for PBXNativeTarget "TestbedTests" */;
++ buildPhases = (
++ EE989E612DCD6E7A0036B268 /* Sources */,
++ EE989E622DCD6E7A0036B268 /* Frameworks */,
++ EE989E632DCD6E7A0036B268 /* Resources */,
++ );
++ buildRules = (
++ );
++ dependencies = (
++ EE989E672DCD6E7A0036B268 /* PBXTargetDependency */,
++ );
++ fileSystemSynchronizedGroups = (
++ EE989E682DCD6E7A0036B268 /* TestbedTests */,
++ );
++ name = TestbedTests;
++ packageProductDependencies = (
++ );
++ productName = TestbedTests;
++ productReference = EE989E652DCD6E7A0036B268 /* TestbedTests.xctest */;
++ productType = "com.apple.product-type.bundle.unit-test";
++ };
++/* End PBXNativeTarget section */
++
++/* Begin PBXProject section */
++ EE989E462DCD6E780036B268 /* Project object */ = {
++ isa = PBXProject;
++ attributes = {
++ BuildIndependentTargetsInParallel = 1;
++ LastUpgradeCheck = 1620;
++ TargetAttributes = {
++ EE989E4D2DCD6E780036B268 = {
++ CreatedOnToolsVersion = 16.2;
++ };
++ EE989E642DCD6E7A0036B268 = {
++ CreatedOnToolsVersion = 16.2;
++ TestTargetID = EE989E4D2DCD6E780036B268;
++ };
++ };
++ };
++ buildConfigurationList = EE989E492DCD6E780036B268 /* Build configuration list for PBXProject "tvOSTestbed" */;
++ developmentRegion = en;
++ hasScannedForEncodings = 0;
++ knownRegions = (
++ en,
++ Base,
++ );
++ mainGroup = EE989E452DCD6E780036B268;
++ minimizedProjectReferenceProxies = 1;
++ preferredProjectObjectVersion = 77;
++ productRefGroup = EE989E4F2DCD6E780036B268 /* Products */;
++ projectDirPath = "";
++ projectRoot = "";
++ targets = (
++ EE989E4D2DCD6E780036B268 /* tvOSTestbed */,
++ EE989E642DCD6E7A0036B268 /* TestbedTests */,
++ );
++ };
++/* End PBXProject section */
++
++/* Begin PBXResourcesBuildPhase section */
++ EE989E4C2DCD6E780036B268 /* Resources */ = {
++ isa = PBXResourcesBuildPhase;
++ buildActionMask = 2147483647;
++ files = (
++ );
++ runOnlyForDeploymentPostprocessing = 0;
++ };
++ EE989E632DCD6E7A0036B268 /* Resources */ = {
++ isa = PBXResourcesBuildPhase;
++ buildActionMask = 2147483647;
++ files = (
++ );
++ runOnlyForDeploymentPostprocessing = 0;
++ };
++/* End PBXResourcesBuildPhase section */
++
++/* Begin PBXShellScriptBuildPhase section */
++ EE7C8A222DCD70F4003206DB /* Process Python libraries */ = {
++ isa = PBXShellScriptBuildPhase;
++ alwaysOutOfDate = 1;
++ buildActionMask = 2147483647;
++ files = (
++ );
++ inputFileListPaths = (
++ );
++ inputPaths = (
++ );
++ name = "Process Python libraries";
++ outputFileListPaths = (
++ );
++ outputPaths = (
++ );
++ runOnlyForDeploymentPostprocessing = 0;
++ shellPath = /bin/sh;
++ shellScript = "set -e\n\nsource $PROJECT_DIR/Python.xcframework/build/utils.sh\n\ninstall_python Python.xcframework app app_packages\n";
++ showEnvVarsInLog = 0;
++ };
++/* End PBXShellScriptBuildPhase section */
++
++/* Begin PBXSourcesBuildPhase section */
++ EE989E4A2DCD6E780036B268 /* Sources */ = {
++ isa = PBXSourcesBuildPhase;
++ buildActionMask = 2147483647;
++ files = (
++ );
++ runOnlyForDeploymentPostprocessing = 0;
++ };
++ EE989E612DCD6E7A0036B268 /* Sources */ = {
++ isa = PBXSourcesBuildPhase;
++ buildActionMask = 2147483647;
++ files = (
++ );
++ runOnlyForDeploymentPostprocessing = 0;
++ };
++/* End PBXSourcesBuildPhase section */
++
++/* Begin PBXTargetDependency section */
++ EE989E672DCD6E7A0036B268 /* PBXTargetDependency */ = {
++ isa = PBXTargetDependency;
++ target = EE989E4D2DCD6E780036B268 /* tvOSTestbed */;
++ targetProxy = EE989E662DCD6E7A0036B268 /* PBXContainerItemProxy */;
++ };
++/* End PBXTargetDependency section */
++
++/* Begin XCBuildConfiguration section */
++ EE989E772DCD6E7A0036B268 /* Debug */ = {
++ isa = XCBuildConfiguration;
++ buildSettings = {
++ ALWAYS_SEARCH_USER_PATHS = NO;
++ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
++ CLANG_ANALYZER_NONNULL = YES;
++ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
++ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
++ CLANG_ENABLE_MODULES = YES;
++ CLANG_ENABLE_OBJC_ARC = YES;
++ CLANG_ENABLE_OBJC_WEAK = YES;
++ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
++ CLANG_WARN_BOOL_CONVERSION = YES;
++ CLANG_WARN_COMMA = YES;
++ CLANG_WARN_CONSTANT_CONVERSION = YES;
++ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
++ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
++ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
++ CLANG_WARN_EMPTY_BODY = YES;
++ CLANG_WARN_ENUM_CONVERSION = YES;
++ CLANG_WARN_INFINITE_RECURSION = YES;
++ CLANG_WARN_INT_CONVERSION = YES;
++ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
++ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
++ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
++ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
++ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;
++ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
++ CLANG_WARN_STRICT_PROTOTYPES = YES;
++ CLANG_WARN_SUSPICIOUS_MOVE = YES;
++ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
++ CLANG_WARN_UNREACHABLE_CODE = YES;
++ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
++ COPY_PHASE_STRIP = NO;
++ DEBUG_INFORMATION_FORMAT = dwarf;
++ ENABLE_STRICT_OBJC_MSGSEND = YES;
++ ENABLE_TESTABILITY = YES;
++ ENABLE_USER_SCRIPT_SANDBOXING = NO;
++ FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)";
++ GCC_C_LANGUAGE_STANDARD = gnu17;
++ GCC_DYNAMIC_NO_PIC = NO;
++ GCC_NO_COMMON_BLOCKS = YES;
++ GCC_OPTIMIZATION_LEVEL = 0;
++ GCC_PREPROCESSOR_DEFINITIONS = (
++ "DEBUG=1",
++ "$(inherited)",
++ );
++ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
++ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
++ GCC_WARN_UNDECLARED_SELECTOR = YES;
++ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
++ GCC_WARN_UNUSED_FUNCTION = YES;
++ GCC_WARN_UNUSED_VARIABLE = YES;
++ HEADER_SEARCH_PATHS = "$(BUILT_PRODUCTS_DIR)/Python.framework/Headers";
++ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
++ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
++ MTL_FAST_MATH = YES;
++ ONLY_ACTIVE_ARCH = YES;
++ SDKROOT = appletvos;
++ TVOS_DEPLOYMENT_TARGET = 18.2;
++ };
++ name = Debug;
++ };
++ EE989E782DCD6E7A0036B268 /* Release */ = {
++ isa = XCBuildConfiguration;
++ buildSettings = {
++ ALWAYS_SEARCH_USER_PATHS = NO;
++ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
++ CLANG_ANALYZER_NONNULL = YES;
++ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
++ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
++ CLANG_ENABLE_MODULES = YES;
++ CLANG_ENABLE_OBJC_ARC = YES;
++ CLANG_ENABLE_OBJC_WEAK = YES;
++ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
++ CLANG_WARN_BOOL_CONVERSION = YES;
++ CLANG_WARN_COMMA = YES;
++ CLANG_WARN_CONSTANT_CONVERSION = YES;
++ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
++ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
++ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
++ CLANG_WARN_EMPTY_BODY = YES;
++ CLANG_WARN_ENUM_CONVERSION = YES;
++ CLANG_WARN_INFINITE_RECURSION = YES;
++ CLANG_WARN_INT_CONVERSION = YES;
++ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
++ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
++ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
++ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
++ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;
++ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
++ CLANG_WARN_STRICT_PROTOTYPES = YES;
++ CLANG_WARN_SUSPICIOUS_MOVE = YES;
++ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
++ CLANG_WARN_UNREACHABLE_CODE = YES;
++ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
++ COPY_PHASE_STRIP = NO;
++ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
++ ENABLE_NS_ASSERTIONS = NO;
++ ENABLE_STRICT_OBJC_MSGSEND = YES;
++ ENABLE_TESTABILITY = YES;
++ ENABLE_USER_SCRIPT_SANDBOXING = NO;
++ FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)";
++ GCC_C_LANGUAGE_STANDARD = gnu17;
++ GCC_NO_COMMON_BLOCKS = YES;
++ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
++ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
++ GCC_WARN_UNDECLARED_SELECTOR = YES;
++ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
++ GCC_WARN_UNUSED_FUNCTION = YES;
++ GCC_WARN_UNUSED_VARIABLE = YES;
++ HEADER_SEARCH_PATHS = "$(BUILT_PRODUCTS_DIR)/Python.framework/Headers";
++ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
++ MTL_ENABLE_DEBUG_INFO = NO;
++ MTL_FAST_MATH = YES;
++ SDKROOT = appletvos;
++ TVOS_DEPLOYMENT_TARGET = 18.2;
++ VALIDATE_PRODUCT = YES;
++ };
++ name = Release;
++ };
++ EE989E7A2DCD6E7A0036B268 /* Debug */ = {
++ isa = XCBuildConfiguration;
++ buildSettings = {
++ ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
++ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
++ CODE_SIGN_STYLE = Automatic;
++ CURRENT_PROJECT_VERSION = 1;
++ GENERATE_INFOPLIST_FILE = NO;
++ INFOPLIST_FILE = "tvOSTestbed/tvOSTestbed-Info.plist";
++ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
++ INFOPLIST_KEY_UIMainStoryboardFile = Main;
++ INFOPLIST_KEY_UIUserInterfaceStyle = Automatic;
++ LD_RUNPATH_SEARCH_PATHS = (
++ "$(inherited)",
++ "@executable_path/Frameworks",
++ );
++ MARKETING_VERSION = 1.0;
++ PRODUCT_BUNDLE_IDENTIFIER = org.python.tvOSTestbed;
++ PRODUCT_NAME = "$(TARGET_NAME)";
++ SWIFT_EMIT_LOC_STRINGS = YES;
++ TARGETED_DEVICE_FAMILY = 3;
++ };
++ name = Debug;
++ };
++ EE989E7B2DCD6E7A0036B268 /* Release */ = {
++ isa = XCBuildConfiguration;
++ buildSettings = {
++ ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
++ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
++ CODE_SIGN_STYLE = Automatic;
++ CURRENT_PROJECT_VERSION = 1;
++ GENERATE_INFOPLIST_FILE = NO;
++ INFOPLIST_FILE = "tvOSTestbed/tvOSTestbed-Info.plist";
++ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
++ INFOPLIST_KEY_UIMainStoryboardFile = Main;
++ INFOPLIST_KEY_UIUserInterfaceStyle = Automatic;
++ LD_RUNPATH_SEARCH_PATHS = (
++ "$(inherited)",
++ "@executable_path/Frameworks",
++ );
++ MARKETING_VERSION = 1.0;
++ PRODUCT_BUNDLE_IDENTIFIER = org.python.tvOSTestbed;
++ PRODUCT_NAME = "$(TARGET_NAME)";
++ SWIFT_EMIT_LOC_STRINGS = YES;
++ TARGETED_DEVICE_FAMILY = 3;
++ };
++ name = Release;
++ };
++ EE989E7D2DCD6E7A0036B268 /* Debug */ = {
++ isa = XCBuildConfiguration;
++ buildSettings = {
++ BUNDLE_LOADER = "$(TEST_HOST)";
++ CODE_SIGN_STYLE = Automatic;
++ CURRENT_PROJECT_VERSION = 1;
++ GENERATE_INFOPLIST_FILE = YES;
++ MARKETING_VERSION = 1.0;
++ PRODUCT_BUNDLE_IDENTIFIER = org.python.TestbedTests;
++ PRODUCT_NAME = "$(TARGET_NAME)";
++ SWIFT_EMIT_LOC_STRINGS = NO;
++ TARGETED_DEVICE_FAMILY = 3;
++ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/tvOSTestbed.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/tvOSTestbed";
++ TVOS_DEPLOYMENT_TARGET = 18.2;
++ };
++ name = Debug;
++ };
++ EE989E7E2DCD6E7A0036B268 /* Release */ = {
++ isa = XCBuildConfiguration;
++ buildSettings = {
++ BUNDLE_LOADER = "$(TEST_HOST)";
++ CODE_SIGN_STYLE = Automatic;
++ CURRENT_PROJECT_VERSION = 1;
++ GENERATE_INFOPLIST_FILE = YES;
++ MARKETING_VERSION = 1.0;
++ PRODUCT_BUNDLE_IDENTIFIER = org.python.TestbedTests;
++ PRODUCT_NAME = "$(TARGET_NAME)";
++ SWIFT_EMIT_LOC_STRINGS = NO;
++ TARGETED_DEVICE_FAMILY = 3;
++ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/tvOSTestbed.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/tvOSTestbed";
++ TVOS_DEPLOYMENT_TARGET = 18.2;
++ };
++ name = Release;
++ };
++/* End XCBuildConfiguration section */
++
++/* Begin XCConfigurationList section */
++ EE989E492DCD6E780036B268 /* Build configuration list for PBXProject "tvOSTestbed" */ = {
++ isa = XCConfigurationList;
++ buildConfigurations = (
++ EE989E772DCD6E7A0036B268 /* Debug */,
++ EE989E782DCD6E7A0036B268 /* Release */,
++ );
++ defaultConfigurationIsVisible = 0;
++ defaultConfigurationName = Release;
++ };
++ EE989E792DCD6E7A0036B268 /* Build configuration list for PBXNativeTarget "tvOSTestbed" */ = {
++ isa = XCConfigurationList;
++ buildConfigurations = (
++ EE989E7A2DCD6E7A0036B268 /* Debug */,
++ EE989E7B2DCD6E7A0036B268 /* Release */,
++ );
++ defaultConfigurationIsVisible = 0;
++ defaultConfigurationName = Release;
++ };
++ EE989E7C2DCD6E7A0036B268 /* Build configuration list for PBXNativeTarget "TestbedTests" */ = {
++ isa = XCConfigurationList;
++ buildConfigurations = (
++ EE989E7D2DCD6E7A0036B268 /* Debug */,
++ EE989E7E2DCD6E7A0036B268 /* Release */,
++ );
++ defaultConfigurationIsVisible = 0;
++ defaultConfigurationName = Release;
++ };
++/* End XCConfigurationList section */
++ };
++ rootObject = EE989E462DCD6E780036B268 /* Project object */;
++}
+--- /dev/null
++++ b/Apple/testbed/tvOSTestbed.xcodeproj/xcshareddata/xcschemes/tvOSTestbed.xcscheme
+@@ -0,0 +1,97 @@
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+--- /dev/null
++++ b/Apple/testbed/tvOSTestbed.xctestplan
+@@ -0,0 +1,46 @@
++{
++ "configurations" : [
++ {
++ "id" : "F5A95CE4-1ADE-4A6E-A0E1-CDBAE26DF0C5",
++ "name" : "Test Scheme Action",
++ "options" : {
++
++ }
++ }
++ ],
++ "defaultOptions" : {
++ "commandLineArgumentEntries" : [
++ {
++ "argument" : "test"
++ },
++ {
++ "argument" : "-uall"
++ },
++ {
++ "argument" : "--single-process"
++ },
++ {
++ "argument" : "--rerun"
++ },
++ {
++ "argument" : "-W"
++ }
++ ],
++ "targetForVariableExpansion" : {
++ "containerPath" : "container:tvOSTestbed.xcodeproj",
++ "identifier" : "607A66112B0EFA380010BFC8",
++ "name" : "tvOSTestbed"
++ }
++ },
++ "testTargets" : [
++ {
++ "parallelizable" : false,
++ "target" : {
++ "containerPath" : "container:tvOSTestbed.xcodeproj",
++ "identifier" : "EE989E642DCD6E7A0036B268",
++ "name" : "TestbedTests"
++ }
++ }
++ ],
++ "version" : 1
++}
+\ No newline at end of file
+--- /dev/null
++++ b/Apple/testbed/tvOSTestbed/AppDelegate.h
+@@ -0,0 +1,11 @@
++//
++// AppDelegate.h
++// tvOSTestbed
++//
++
++#import
++
++@interface AppDelegate : UIResponder
++
++
++@end
+--- /dev/null
++++ b/Apple/testbed/tvOSTestbed/AppDelegate.m
+@@ -0,0 +1,19 @@
++//
++// AppDelegate.m
++// tvOSTestbed
++//
++
++#import "AppDelegate.h"
++
++@interface AppDelegate ()
++
++@end
++
++@implementation AppDelegate
++
++
++- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
++ return YES;
++}
++
++@end
+--- /dev/null
++++ b/Apple/testbed/tvOSTestbed/Base.lproj/LaunchScreen.storyboard
+@@ -0,0 +1,24 @@
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+--- /dev/null
++++ b/Apple/testbed/tvOSTestbed/app/README
+@@ -0,0 +1,7 @@
++This folder can contain any Python application code.
++
++During the build, any binary modules found in this folder will be processed into
++Framework form.
++
++When the test suite runs, this folder will be on the PYTHONPATH, and will be the
++working directory for the test suite.
+--- /dev/null
++++ b/Apple/testbed/tvOSTestbed/app_packages/README
+@@ -0,0 +1,7 @@
++This folder can be a target for installing any Python dependencies needed by the
++test suite.
++
++During the build, any binary modules found in this folder will be processed into
++Framework form.
++
++When the test suite runs, this folder will be on the PYTHONPATH.
+--- /dev/null
++++ b/Apple/testbed/tvOSTestbed/main.m
+@@ -0,0 +1,16 @@
++//
++// main.m
++// tvOSTestbed
++//
+
- /*[clinic input]
- module marshal
- [clinic start generated code]*/
-@@ -33,9 +37,12 @@
- * #if defined(MS_WINDOWS) && defined(_DEBUG)
- */
- #if defined(MS_WINDOWS)
--#define MAX_MARSHAL_STACK_DEPTH 1000
-+# define MAX_MARSHAL_STACK_DEPTH 1000
-+// TARGET_OS_IPHONE covers any non-macOS Apple platform.
-+#elif defined(__APPLE__) && TARGET_OS_IPHONE
-+# define MAX_MARSHAL_STACK_DEPTH 1500
- #else
--#define MAX_MARSHAL_STACK_DEPTH 2000
-+# define MAX_MARSHAL_STACK_DEPTH 2000
- #endif
-
- #define TYPE_NULL '0'
-diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
-index b0c5da56c4f..ec53e7484fc 100644
---- a/Python/pylifecycle.c
-+++ b/Python/pylifecycle.c
-@@ -18,7 +18,21 @@
- #include // setlocale()
-
- #if defined(__APPLE__)
--#include
-+# include
-+# include
-+# include
-+// The os_log unified logging APIs were introduced in macOS 10.12, iOS 10.0,
-+// tvOS 10.0, and watchOS 3.0; we enable the use of the system logger
-+// automatically on non-macOS platforms.
-+# if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
-+# define USE_APPLE_SYSTEM_LOG 1
-+# else
-+# define USE_APPLE_SYSTEM_LOG 0
-+# endif
++#import
++#import "AppDelegate.h"
++
++int main(int argc, char * argv[]) {
++ NSString * appDelegateClassName;
++ @autoreleasepool {
++ appDelegateClassName = NSStringFromClass([AppDelegate class]);
++
++ return UIApplicationMain(argc, argv, nil, appDelegateClassName);
++ }
++}
+--- /dev/null
++++ b/Apple/testbed/tvOSTestbed/tvOSTestbed-Info.plist
+@@ -0,0 +1,52 @@
++
++
++
++
++ CFBundleDevelopmentRegion
++ en
++ CFBundleDisplayName
++ ${PRODUCT_NAME}
++ CFBundleExecutable
++ ${EXECUTABLE_NAME}
++ CFBundleIdentifier
++ org.python.tvOSTestbed
++ CFBundleInfoDictionaryVersion
++ 6.0
++ CFBundleName
++ ${PRODUCT_NAME}
++ CFBundlePackageType
++ APPL
++ CFBundleShortVersionString
++ 1.0
++ CFBundleSignature
++ ????
++ CFBundleVersion
++ 1
++ LSRequiresIPhoneOS
++
++ UIRequiresFullScreen
++
++ UILaunchStoryboardName
++ Launch Screen
++ UISupportedInterfaceOrientations
++
++ UIInterfaceOrientationPortrait
++ UIInterfaceOrientationLandscapeLeft
++ UIInterfaceOrientationLandscapeRight
++
++ UISupportedInterfaceOrientations~ipad
++
++ UIInterfaceOrientationPortrait
++ UIInterfaceOrientationPortraitUpsideDown
++ UIInterfaceOrientationLandscapeLeft
++ UIInterfaceOrientationLandscapeRight
++
++ UIApplicationSceneManifest
++
++ UIApplicationSupportsMultipleScenes
++
++ UISceneConfigurations
++
++
++
++
+--- /dev/null
++++ b/Apple/tvOS/README.rst
+@@ -0,0 +1,108 @@
++=====================
++Python on tvOS README
++=====================
++
++:Authors:
++ Russell Keith-Magee (2023-11)
++
++This document provides a quick overview of some tvOS specific features in the
++Python distribution.
++
++Compilers for building on tvOS
++==============================
++
++Building for tvOS requires the use of Apple's Xcode tooling. It is strongly
++recommended that you use the most recent stable release of Xcode, on the
++most recently released macOS.
++
++tvOS specific arguments to configure
++===================================
++
++* ``--enable-framework[=DIR]``
++
++ This argument specifies the location where the Python.framework will
++ be installed.
++
++* ``--with-framework-name=NAME``
++
++ Specify the name for the python framework, defaults to ``Python``.
++
++
++Building and using Python on tvOS
++=================================
++
++ABIs and Architectures
++----------------------
++
++tvOS apps can be deployed on physical devices, and on the tvOS simulator.
++Although the API used on these devices is identical, the ABI is different - you
++need to link against different libraries for an tvOS device build
++(``appletvos``) or an tvOS simulator build (``appletvsimulator``). Apple uses
++the XCframework format to allow specifying a single dependency that supports
++multiple ABIs. An XCframework is a wrapper around multiple ABI-specific
++frameworks.
++
++tvOS can also support different CPU architectures within each ABI. At present,
++there is only a single support ed architecture on physical devices - ARM64.
++However, the *simulator* supports 2 architectures - ARM64 (for running on Apple
++Silicon machines), and x86_64 (for running on older Intel-based machines.)
++
++To support multiple CPU architectures on a single platform, Apple uses a "fat
++binary" format - a single physical file that contains support for multiple
++architectures.
++
++How do I build Python for tvOS?
++-------------------------------
++
++The Python build system will build a ``Python.framework`` that supports a
++*single* ABI with a *single* architecture. If you want to use Python in an tvOS
++project, you need to:
++
++1. Produce multiple ``Python.framework`` builds, one for each ABI and architecture;
++2. Merge the binaries for each architecture on a given ABI into a single "fat" binary;
++3. Merge the "fat" frameworks for each ABI into a single XCframework.
++
++tvOS builds of Python *must* be constructed as framework builds. To support this,
++you must provide the ``--enable-framework`` flag when configuring the build.
++
++The build also requires the use of cross-compilation. The commands for building
++Python for tvOS will look somethign like::
++
++ $ ./configure \
++ --enable-framework=/path/to/install \
++ --host=aarch64-apple-tvos \
++ --build=aarch64-apple-darwin \
++ --with-build-python=/path/to/python.exe
++ $ make
++ $ make install
++
++In this invocation:
++
++* ``/path/to/install`` is the location where the final Python.framework will be
++ output.
++
++* ``--host`` is the architecture and ABI that you want to build, in GNU compiler
++ triple format. This will be one of:
++
++ - ``aarch64-apple-tvos`` for ARM64 tvOS devices.
++ - ``aarch64-apple-tvos-simulator`` for the tvOS simulator running on Apple
++ Silicon devices.
++ - ``x86_64-apple-tvos-simulator`` for the tvOS simulator running on Intel
++ devices.
++
++* ``--build`` is the GNU compiler triple for the machine that will be running
++ the compiler. This is one of:
++
++ - ``aarch64-apple-darwin`` for Apple Silicon devices.
++ - ``x86_64-apple-darwin`` for Intel devices.
++
++* ``/path/to/python.exe`` is the path to a Python binary on the machine that
++ will be running the compiler. This is needed because the Python compilation
++ process involves running some Python code. On a normal desktop build of
++ Python, you can compile a python interpreter and then use that interpreter to
++ run Python code. However, the binaries produced for tvOS won't run on macOS, so
++ you need to provide an external Python interpreter. This interpreter must be
++ the version as the Python that is being compiled.
++
++Using a framework-based Python on tvOS
++======================================
+--- /dev/null
++++ b/Apple/tvOS/Resources/Info.plist.in
+@@ -0,0 +1,34 @@
++
++
++
++
++ CFBundleDevelopmentRegion
++ en
++ CFBundleExecutable
++ Python
++ CFBundleGetInfoString
++ Python Runtime and Library
++ CFBundleIdentifier
++ @PYTHONFRAMEWORKIDENTIFIER@
++ CFBundleInfoDictionaryVersion
++ 6.0
++ CFBundleName
++ Python
++ CFBundlePackageType
++ FMWK
++ CFBundleShortVersionString
++ %VERSION%
++ CFBundleLongVersionString
++ %VERSION%, (c) 2001-2024 Python Software Foundation.
++ CFBundleSignature
++ ????
++ CFBundleVersion
++ 1
++ CFBundleSupportedPlatforms
++
++ tvOS
++
++ MinimumOSVersion
++ @TVOS_DEPLOYMENT_TARGET@
++
++
+--- /dev/null
++++ b/Apple/tvOS/Resources/bin/arm64-apple-tvos-ar
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk appletvos${TVOS_SDK_VERSION} ar "$@"
+--- /dev/null
++++ b/Apple/tvOS/Resources/bin/arm64-apple-tvos-clang
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk appletvos${TVOS_SDK_VERSION} clang -target arm64-apple-tvos${TVOS_DEPLOYMENT_TARGET} "$@"
+--- /dev/null
++++ b/Apple/tvOS/Resources/bin/arm64-apple-tvos-clang++
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk appletvos${TVOS_SDK_VERSION} clang++ -target arm64-apple-tvos${TVOS_DEPLOYMENT_TARGET} "$@"
+--- /dev/null
++++ b/Apple/tvOS/Resources/bin/arm64-apple-tvos-cpp
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk appletvos${TVOS_SDK_VERSION} clang -target arm64-apple-tvos${TVOS_DEPLOYMENT_TARGET} -E "$@"
+--- /dev/null
++++ b/Apple/tvOS/Resources/bin/arm64-apple-tvos-simulator-ar
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk appletvsimulator${TVOS_SDK_VERSION} ar "$@"
+--- /dev/null
++++ b/Apple/tvOS/Resources/bin/arm64-apple-tvos-simulator-clang
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk appletvsimulator${TVOS_SDK_VERSION} clang -target arm64-apple-tvos${TVOS_DEPLOYMENT_TARGET}-simulator "$@"
+--- /dev/null
++++ b/Apple/tvOS/Resources/bin/arm64-apple-tvos-simulator-clang++
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk appletvsimulator${TVOS_SDK_VERSION} clang++ -target arm64-apple-tvos${TVOS_DEPLOYMENT_TARGET}-simulator "$@"
+--- /dev/null
++++ b/Apple/tvOS/Resources/bin/arm64-apple-tvos-simulator-cpp
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk appletvsimulator${TVOS_SDK_VERSION} clang -target arm64-apple-tvos${TVOS_DEPLOYMENT_TARGET}-simulator -E "$@"
+--- /dev/null
++++ b/Apple/tvOS/Resources/bin/arm64-apple-tvos-simulator-strip
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk appletvsimulator${TVOS_SDK_VERSION} strip -arch arm64 "$@"
+--- /dev/null
++++ b/Apple/tvOS/Resources/bin/arm64-apple-tvos-strip
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphoneos${TVOS_SDK_VERSION} strip -arch arm64 "$@"
+--- /dev/null
++++ b/Apple/tvOS/Resources/bin/x86_64-apple-tvos-simulator-ar
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk appletvsimulator${TVOS_SDK_VERSION} ar "$@"
+--- /dev/null
++++ b/Apple/tvOS/Resources/bin/x86_64-apple-tvos-simulator-clang
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk appletvsimulator${TVOS_SDK_VERSION} clang -target x86_64-apple-tvos${TVOS_DEPLOYMENT_TARGET}-simulator "$@"
+--- /dev/null
++++ b/Apple/tvOS/Resources/bin/x86_64-apple-tvos-simulator-clang++
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk appletvsimulator${TVOS_SDK_VERSION} clang++ -target x86_64-apple-tvos${TVOS_DEPLOYMENT_TARGET}-simulator "$@"
+--- /dev/null
++++ b/Apple/tvOS/Resources/bin/x86_64-apple-tvos-simulator-cpp
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk appletvsimulator${TVOS_SDK_VERSION} clang -target x86_64-apple-tvos${TVOS_DEPLOYMENT_TARGET}-simulator -E "$@"
+--- /dev/null
++++ b/Apple/tvOS/Resources/bin/x86_64-apple-tvos-simulator-strip
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk appletvsimulator${TVOS_SDK_VERSION} strip -arch x86_64 "$@"
+--- /dev/null
++++ b/Apple/tvOS/Resources/pyconfig.h
+@@ -0,0 +1,7 @@
++#ifdef __arm64__
++#include "pyconfig-arm64.h"
++#endif
+
-+# if USE_APPLE_SYSTEM_LOG
-+# include
-+# endif
- #endif
-
- #ifdef HAVE_SIGNAL_H
-@@ -58,6 +72,9 @@
- static PyStatus init_import_site(void);
- static PyStatus init_set_builtins_open(void);
- static PyStatus init_sys_streams(PyThreadState *tstate);
-+#if defined(__APPLE__) && USE_APPLE_SYSTEM_LOG
-+static PyStatus init_apple_streams(PyThreadState *tstate);
++#ifdef __x86_64__
++#include "pyconfig-x86_64.h"
+#endif
- static void wait_for_thread_shutdown(PyThreadState *tstate);
- static void call_ll_exitfuncs(_PyRuntimeState *runtime);
-
-@@ -1126,6 +1143,17 @@
- return status;
- }
-
-+#if defined(__APPLE__) && USE_APPLE_SYSTEM_LOG
-+ status = init_apple_streams(tstate);
-+ if (_PyStatus_EXCEPTION(status)) {
-+ return status;
-+ }
+--- /dev/null
++++ b/Apple/watchOS/README.rst
+@@ -0,0 +1,108 @@
++========================
++Python on watchOS README
++========================
++
++:Authors:
++ Russell Keith-Magee (2023-11)
++
++This document provides a quick overview of some watchOS specific features in the
++Python distribution.
++
++Compilers for building on watchOS
++=================================
++
++Building for watchOS requires the use of Apple's Xcode tooling. It is strongly
++recommended that you use the most recent stable release of Xcode, on the
++most recently released macOS.
++
++watchOS specific arguments to configure
++=======================================
++
++* ``--enable-framework[=DIR]``
++
++ This argument specifies the location where the Python.framework will
++ be installed.
++
++* ``--with-framework-name=NAME``
++
++ Specify the name for the python framework, defaults to ``Python``.
++
++
++Building and using Python on watchOS
++====================================
++
++ABIs and Architectures
++----------------------
++
++watchOS apps can be deployed on physical devices, and on the watchOS simulator.
++Although the API used on these devices is identical, the ABI is different - you
++need to link against different libraries for an watchOS device build
++(``watchos``) or an watchOS simulator build (``watchsimulator``). Apple uses the
++XCframework format to allow specifying a single dependency that supports
++multiple ABIs. An XCframework is a wrapper around multiple ABI-specific
++frameworks.
++
++watchOS can also support different CPU architectures within each ABI. At present,
++there is only a single support ed architecture on physical devices - ARM64.
++However, the *simulator* supports 2 architectures - ARM64 (for running on Apple
++Silicon machines), and x86_64 (for running on older Intel-based machines.)
++
++To support multiple CPU architectures on a single platform, Apple uses a "fat
++binary" format - a single physical file that contains support for multiple
++architectures.
++
++How do I build Python for watchOS?
++-------------------------------
++
++The Python build system will build a ``Python.framework`` that supports a
++*single* ABI with a *single* architecture. If you want to use Python in an watchOS
++project, you need to:
++
++1. Produce multiple ``Python.framework`` builds, one for each ABI and architecture;
++2. Merge the binaries for each architecture on a given ABI into a single "fat" binary;
++3. Merge the "fat" frameworks for each ABI into a single XCframework.
++
++watchOS builds of Python *must* be constructed as framework builds. To support this,
++you must provide the ``--enable-framework`` flag when configuring the build.
++
++The build also requires the use of cross-compilation. The commands for building
++Python for watchOS will look somethign like::
++
++ $ ./configure \
++ --enable-framework=/path/to/install \
++ --host=aarch64-apple-watchos \
++ --build=aarch64-apple-darwin \
++ --with-build-python=/path/to/python.exe
++ $ make
++ $ make install
++
++In this invocation:
++
++* ``/path/to/install`` is the location where the final Python.framework will be
++ output.
++
++* ``--host`` is the architecture and ABI that you want to build, in GNU compiler
++ triple format. This will be one of:
++
++ - ``arm64_32-apple-watchos`` for ARM64-32 watchOS devices.
++ - ``aarch64-apple-watchos-simulator`` for the watchOS simulator running on Apple
++ Silicon devices.
++ - ``x86_64-apple-watchos-simulator`` for the watchOS simulator running on Intel
++ devices.
++
++* ``--build`` is the GNU compiler triple for the machine that will be running
++ the compiler. This is one of:
++
++ - ``aarch64-apple-darwin`` for Apple Silicon devices.
++ - ``x86_64-apple-darwin`` for Intel devices.
++
++* ``/path/to/python.exe`` is the path to a Python binary on the machine that
++ will be running the compiler. This is needed because the Python compilation
++ process involves running some Python code. On a normal desktop build of
++ Python, you can compile a python interpreter and then use that interpreter to
++ run Python code. However, the binaries produced for watchOS won't run on macOS, so
++ you need to provide an external Python interpreter. This interpreter must be
++ the version as the Python that is being compiled.
++
++Using a framework-based Python on watchOS
++======================================
+--- /dev/null
++++ b/Apple/watchOS/Resources/Info.plist.in
+@@ -0,0 +1,34 @@
++
++
++
++
++ CFBundleDevelopmentRegion
++ en
++ CFBundleExecutable
++ Python
++ CFBundleGetInfoString
++ Python Runtime and Library
++ CFBundleIdentifier
++ @PYTHONFRAMEWORKIDENTIFIER@
++ CFBundleInfoDictionaryVersion
++ 6.0
++ CFBundleName
++ Python
++ CFBundlePackageType
++ FMWK
++ CFBundleShortVersionString
++ %VERSION%
++ CFBundleLongVersionString
++ %VERSION%, (c) 2001-2023 Python Software Foundation.
++ CFBundleSignature
++ ????
++ CFBundleVersion
++ %VERSION%
++ CFBundleSupportedPlatforms
++
++ watchOS
++
++ MinimumOSVersion
++ @WATCHOS_DEPLOYMENT_TARGET@
++
++
+--- /dev/null
++++ b/Apple/watchOS/Resources/bin/arm64-apple-watchos-simulator-ar
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk watchsimulator${WATCHOS_SDK_VERSION} ar "$@"
+--- /dev/null
++++ b/Apple/watchOS/Resources/bin/arm64-apple-watchos-simulator-clang
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk watchsimulator${WATCHOS_SDK_VERSION} clang -target arm64-apple-watchos${WATCHOS_DEPLOYMENT_TARGET}-simulator "$@"
+--- /dev/null
++++ b/Apple/watchOS/Resources/bin/arm64-apple-watchos-simulator-clang++
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk watchsimulator${WATCHOS_SDK_VERSION} clang++ -target arm64-apple-watchos${WATCHOS_DEPLOYMENT_TARGET}-simulator "$@"
+--- /dev/null
++++ b/Apple/watchOS/Resources/bin/arm64-apple-watchos-simulator-cpp
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk watchsimulator clang -target arm64-apple-watchos${WATCHOS_DEPLOYMENT_TARGET}-simulator -E "$@"
+--- /dev/null
++++ b/Apple/watchOS/Resources/bin/arm64-apple-watchos-simulator-strip
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk watchsimulator${WATCHOS_SDK_VERSION} strip -arch arm64 "$@"
+--- /dev/null
++++ b/Apple/watchOS/Resources/bin/arm64-apple-watchos-strip
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk watchos${WATCHOS_SDK_VERSION} strip -arch arm64 "$@"
+--- /dev/null
++++ b/Apple/watchOS/Resources/bin/arm64_32-apple-watchos-ar
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk watchos${WATCHOS_SDK_VERSION} ar "$@"
+--- /dev/null
++++ b/Apple/watchOS/Resources/bin/arm64_32-apple-watchos-clang
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk watchos${WATCHOS_SDK_VERSION} clang -target arm64_32-apple-watchos${WATCHOS_DEPLOYMENT_TARGET} "$@"
+--- /dev/null
++++ b/Apple/watchOS/Resources/bin/arm64_32-apple-watchos-clang++
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk watchos${WATCHOS_SDK_VERSION} clang++ -target arm64_32-apple-watchos${WATCHOS_DEPLOYMENT_TARGET} "$@"
+--- /dev/null
++++ b/Apple/watchOS/Resources/bin/arm64_32-apple-watchos-cpp
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk watchos${WATCHOS_SDK_VERSION} clang -target arm64_32-apple-watchos${WATCHOS_DEPLOYMENT_TARGET} -E "$@"
+--- /dev/null
++++ b/Apple/watchOS/Resources/bin/x86_64-apple-watchos-simulator-ar
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk watchsimulator${WATCHOS_SDK_VERSION} ar "$@"
+--- /dev/null
++++ b/Apple/watchOS/Resources/bin/x86_64-apple-watchos-simulator-clang
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk watchsimulator${WATCHOS_SDK_VERSION} clang -target x86_64-apple-watchos${WATCHOS_DEPLOYMENT_TARGET}-simulator "$@"
+--- /dev/null
++++ b/Apple/watchOS/Resources/bin/x86_64-apple-watchos-simulator-clang++
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk watchsimulator${WATCHOS_SDK_VERSION} clang++ -target x86_64-apple-watchos${WATCHOS_DEPLOYMENT_TARGET}-simulator "$@"
+--- /dev/null
++++ b/Apple/watchOS/Resources/bin/x86_64-apple-watchos-simulator-cpp
+@@ -0,0 +1,2 @@
++#!/bin/bash
++xcrun --sdk watchsimulator${WATCHOS_SDK_VERSION} clang -target x86_64-apple-watchos${WATCHOS_DEPLOYMENT_TARGET}-simulator -E "$@"
+--- /dev/null
++++ b/Apple/watchOS/Resources/bin/x86_64-apple-watchos-simulator-strip
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk watchsimulator${WATCHOS_SDK_VERSION} strip -arch x86_64 "$@"
+--- /dev/null
++++ b/Apple/watchOS/Resources/pyconfig.h
+@@ -0,0 +1,11 @@
++#ifdef __arm64__
++# ifdef __LP64__
++#include "pyconfig-arm64.h"
++# else
++#include "pyconfig-arm64_32.h"
++# endif
+#endif
+
-+#ifdef Py_DEBUG
-+ run_presite(tstate);
++#ifdef __x86_64__
++#include "pyconfig-x86_64.h"
+#endif
-+
- status = add_main_module(interp);
- if (_PyStatus_EXCEPTION(status)) {
- return status;
-@@ -2408,6 +2436,69 @@
- return res;
- }
+diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst
+index 21c19903464..61baa722359 100644
+--- a/Doc/library/importlib.rst
++++ b/Doc/library/importlib.rst
+@@ -1466,6 +1466,69 @@
+ Boolean indicating whether or not the module's "origin"
+ attribute refers to a loadable location.
-+#if defined(__APPLE__) && USE_APPLE_SYSTEM_LOG
++.. class:: AppleFrameworkLoader(name, path)
+
-+static PyObject *
-+apple_log_write_impl(PyObject *self, PyObject *args)
-+{
-+ int logtype = 0;
-+ const char *text = NULL;
-+ if (!PyArg_ParseTuple(args, "iy", &logtype, &text)) {
-+ return NULL;
-+ }
++ A specialization of :class:`importlib.machinery.ExtensionFileLoader` that
++ is able to load extension modules in Framework format.
+
-+ // Pass the user-provided text through explicit %s formatting
-+ // to avoid % literals being interpreted as a formatting directive.
-+ os_log_with_type(OS_LOG_DEFAULT, logtype, "%s", text);
-+ Py_RETURN_NONE;
-+}
++ For compatibility with the iOS App Store, *all* binary modules in an iOS app
++ must be dynamic libraries, contained in a framework with appropriate
++ metadata, stored in the ``Frameworks`` folder of the packaged app. There can
++ be only a single binary per framework, and there can be no executable binary
++ material outside the Frameworks folder.
+
++ To accomodate this requirement, when running on iOS, extension module
++ binaries are *not* packaged as ``.so`` files on ``sys.path``, but as
++ individual standalone frameworks. To discover those frameworks, this loader
++ is be registered against the ``.fwork`` file extension, with a ``.fwork``
++ file acting as a placeholder in the original location of the binary on
++ ``sys.path``. The ``.fwork`` file contains the path of the actual binary in
++ the ``Frameworks`` folder, relative to the app bundle. To allow for
++ resolving a framework-packaged binary back to the original location, the
++ framework is expected to contain a ``.origin`` file that contains the
++ location of the ``.fwork`` file, relative to the app bundle.
+
-+static PyMethodDef apple_log_write_method = {
-+ "apple_log_write", apple_log_write_impl, METH_VARARGS
-+};
++ For example, consider the case of an import ``from foo.bar import _whiz``,
++ where ``_whiz`` is implemented with the binary module
++ ``sources/foo/bar/_whiz.abi3.so``, with ``sources`` being the location
++ registered on ``sys.path``, relative to the application bundle. This module
++ *must* be distributed as
++ ``Frameworks/foo.bar._whiz.framework/foo.bar._whiz`` (creating the framework
++ name from the full import path of the module), with an ``Info.plist`` file
++ in the ``.framework`` directory identifying the binary as a framework. The
++ ``foo.bar._whiz`` module would be represented in the original location with
++ a ``sources/foo/bar/_whiz.abi3.fwork`` marker file, containing the path
++ ``Frameworks/foo.bar._whiz/foo.bar._whiz``. The framework would also contain
++ ``Frameworks/foo.bar._whiz.framework/foo.bar._whiz.origin``, containing the
++ path to the ``.fwork`` file.
+
++ When a module is loaded with this loader, the ``__file__`` for the module
++ will report as the location of the ``.fwork`` file. This allows code to use
++ the ``__file__`` of a module as an anchor for file system traveral.
++ However, the spec origin will reference the location of the *actual* binary
++ in the ``.framework`` folder.
+
-+static PyStatus
-+init_apple_streams(PyThreadState *tstate)
-+{
-+ PyStatus status = _PyStatus_OK();
-+ PyObject *_apple_support = NULL;
-+ PyObject *apple_log_write = NULL;
-+ PyObject *result = NULL;
++ The Xcode project building the app is responsible for converting any ``.so``
++ files from wherever they exist in the ``PYTHONPATH`` into frameworks in the
++ ``Frameworks`` folder (including stripping extensions from the module file,
++ the addition of framework metadata, and signing the resulting framework),
++ and creating the ``.fwork`` and ``.origin`` files. This will usually be done
++ with a build step in the Xcode project; see the iOS documentation for
++ details on how to construct this build step.
+
-+ _apple_support = PyImport_ImportModule("_apple_support");
-+ if (_apple_support == NULL) {
-+ goto error;
-+ }
++ .. versionadded:: 3.13
+
-+ apple_log_write = PyCFunction_New(&apple_log_write_method, NULL);
-+ if (apple_log_write == NULL) {
-+ goto error;
-+ }
++ .. availability:: iOS.
+
-+ // Initialize the logging streams, sending stdout -> Default; stderr -> Error
-+ result = PyObject_CallMethod(
-+ _apple_support, "init_streams", "Oii",
-+ apple_log_write, OS_LOG_TYPE_DEFAULT, OS_LOG_TYPE_ERROR);
-+ if (result == NULL) {
-+ goto error;
-+ }
-+ goto done;
++ .. attribute:: name
+
-+error:
-+ _PyErr_Print(tstate);
-+ status = _PyStatus_ERR("failed to initialize Apple log streams");
++ Name of the module the loader supports.
+
-+done:
-+ Py_XDECREF(result);
-+ Py_XDECREF(apple_log_write);
-+ Py_XDECREF(_apple_support);
-+ return status;
-+}
++ .. attribute:: path
++
++ Path to the ``.fwork`` file for the extension module.
+
-+#endif // __APPLE__ && USE_APPLE_SYSTEM_LOG
+
+ :mod:`importlib.util` -- Utility code for importers
+ ---------------------------------------------------
- static void
- _Py_FatalError_DumpTracebacks(int fd, PyInterpreterState *interp,
-diff --git a/Python/stdlib_module_names.h b/Python/stdlib_module_names.h
-index 50cf340e543..c1d391e5229 100644
---- a/Python/stdlib_module_names.h
-+++ b/Python/stdlib_module_names.h
-@@ -5,6 +5,7 @@
- "__future__",
- "_abc",
- "_aix_support",
-+"_apple_support",
- "_ast",
- "_asyncio",
- "_bisect",
-@@ -40,6 +41,7 @@
- "_heapq",
- "_imp",
- "_io",
-+"_ios_support",
- "_json",
- "_locale",
- "_lsprof",
-diff --git a/config.sub b/config.sub
-index d74fb6deac9..1bb6a05dc11 100755
---- a/config.sub
-+++ b/config.sub
-@@ -1,14 +1,15 @@
- #! /bin/sh
- # Configuration validation subroutine script.
--# Copyright 1992-2021 Free Software Foundation, Inc.
-+# Copyright 1992-2024 Free Software Foundation, Inc.
+diff --git a/Doc/library/os.rst b/Doc/library/os.rst
+index 8405fb1917e..79db1891a1a 100644
+--- a/Doc/library/os.rst
++++ b/Doc/library/os.rst
+@@ -710,6 +710,11 @@
+ :func:`socket.gethostname` or even
+ ``socket.gethostbyaddr(socket.gethostname())``.
- # shellcheck disable=SC2006,SC2268 # see below for rationale
++ On macOS, iOS and Android, this returns the *kernel* name and version (i.e.,
++ ``'Darwin'`` on macOS and iOS; ``'Linux'`` on Android). :func:`platform.uname()`
++ can be used to get the user-facing operating system name and version on iOS and
++ Android.
++
+ .. availability:: recent flavors of Unix.
--timestamp='2021-08-14'
-+# Patched 2024-02-03 to include support for arm64_32 and iOS/tvOS/watchOS simulators
-+timestamp='2024-01-01'
+ .. versionchanged:: 3.3
+diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst
+index dc2d871b47d..57dc421bb6c 100644
+--- a/Doc/library/platform.rst
++++ b/Doc/library/platform.rst
+@@ -148,6 +148,9 @@
+ Returns the system/OS name, such as ``'Linux'``, ``'Darwin'``, ``'Java'``,
+ ``'Windows'``. An empty string is returned if the value cannot be determined.
- # This file is free software; you can redistribute it and/or modify it
- # under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 3 of the License, or
-+# the Free Software Foundation, either version 3 of the License, or
- # (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful, but
-@@ -76,13 +77,13 @@
- version="\
- GNU config.sub ($timestamp)
++ On iOS and Android, this returns the user-facing OS name (i.e, ``'iOS``,
++ ``'iPadOS'`` or ``'Android'``). To obtain the kernel name (``'Darwin'`` or
++ ``'Linux'``), use :func:`os.uname()`.
+
+ .. function:: system_alias(system, release, version)
+
+@@ -161,6 +164,8 @@
+ Returns the system's release version, e.g. ``'#3 on degas'``. An empty string is
+ returned if the value cannot be determined.
+
++ On iOS and Android, this is the user-facing OS version. To obtain the
++ Darwin or Linux kernel version, use :func:`os.uname()`.
+
+ .. function:: uname()
+
+@@ -230,7 +235,6 @@
+ macOS Platform
+ --------------
+
+-
+ .. function:: mac_ver(release='', versioninfo=('','',''), machine='')
+
+ Get macOS version information and return it as tuple ``(release, versioninfo,
+@@ -240,6 +244,24 @@
+ Entries which cannot be determined are set to ``''``. All tuple entries are
+ strings.
+
++iOS Platform
++------------
++
++.. function:: ios_ver(system='', release='', model='', is_simulator=False)
++
++ Get iOS version information and return it as a
++ :func:`~collections.namedtuple` with the following attributes:
++
++ * ``system`` is the OS name; either ``'iOS'`` or ``'iPadOS'``.
++ * ``release`` is the iOS version number as a string (e.g., ``'17.2'``).
++ * ``model`` is the device model identifier; this will be a string like
++ ``'iPhone13,2'`` for a physical device, or ``'iPhone'`` on a simulator.
++ * ``is_simulator`` is a boolean describing if the app is running on a
++ simulator or a physical device.
++
++ Entries which cannot be determined are set to the defaults given as
++ parameters.
++
+
+ Unix Platforms
+ --------------
+diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst
+index 1e85602951c..8f5af980dee 100644
+--- a/Doc/library/urllib.parse.rst
++++ b/Doc/library/urllib.parse.rst
+@@ -27,6 +27,14 @@
+ ``shttp``, ``sip``, ``sips``, ``snews``, ``svn``, ``svn+ssh``, ``telnet``,
+ ``wais``, ``ws``, ``wss``.
--Copyright 1992-2021 Free Software Foundation, Inc.
-+Copyright 1992-2024 Free Software Foundation, Inc.
++.. impl-detail::
++
++ The inclusion of the ``itms-services`` URL scheme can prevent an app from
++ passing Apple's App Store review process for the macOS and iOS App Stores.
++ Handling for the ``itms-services`` scheme is always removed on iOS; on
++ macOS, it *may* be removed if CPython has been built with the
++ :option:`--with-app-store-compliance` option.
++
+ The :mod:`urllib.parse` module defines functions that fall into two broad
+ categories: URL parsing and URL quoting. These are covered in detail in
+ the following sections.
+diff --git a/Doc/library/webbrowser.rst b/Doc/library/webbrowser.rst
+index c0990882e58..e5cc007d2b8 100644
+--- a/Doc/library/webbrowser.rst
++++ b/Doc/library/webbrowser.rst
+@@ -33,6 +33,13 @@
+ browsers are not available on Unix, the controlling process will launch a new
+ browser and wait.
- This is free software; see the source for copying conditions. There is NO
- warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
++On iOS, the :envvar:`BROWSER` environment variable, as well as any arguments
++controlling autoraise, browser preference, and new tab/window creation will be
++ignored. Web pages will *always* be opened in the user's preferred browser, in
++a new tab, with the browser being brought to the foreground. The use of the
++:mod:`webbrowser` module on iOS requires the :mod:`ctypes` module. If
++:mod:`ctypes` isn't available, calls to :func:`.open` will fail.
++
+ The script :program:`webbrowser` can be used as a command-line interface for the
+ module. It accepts a URL as the argument. It accepts the following optional
+ parameters: ``-n`` opens the URL in a new browser window, if possible;
+@@ -155,6 +162,8 @@
+ +------------------------+-----------------------------------------+-------+
+ | ``'chromium-browser'`` | :class:`Chromium('chromium-browser')` | |
+ +------------------------+-----------------------------------------+-------+
++| ``'iosbrowser'`` | ``IOSBrowser`` | \(4) |
+++------------------------+-----------------------------------------+-------+
- help="
--Try \`$me --help' for more information."
-+Try '$me --help' for more information."
+ Notes:
- # Parse command line
- while test $# -gt 0 ; do
-@@ -130,7 +131,7 @@
- # Separate into logical components for further validation
- case $1 in
- *-*-*-*-*)
-- echo Invalid configuration \`"$1"\': more than four components >&2
-+ echo "Invalid configuration '$1': more than four components" >&2
- exit 1
- ;;
- *-*-*-*)
-@@ -145,7 +146,8 @@
- nto-qnx* | linux-* | uclinux-uclibc* \
- | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
- | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
-- | storm-chaos* | os2-emx* | rtmk-nova*)
-+ | storm-chaos* | os2-emx* | rtmk-nova* | managarm-* \
-+ | windows-* )
- basic_machine=$field1
- basic_os=$maybe_os
- ;;
-@@ -943,7 +945,7 @@
- EOF
- IFS=$saved_IFS
- ;;
-- # We use `pc' rather than `unknown'
-+ # We use 'pc' rather than 'unknown'
- # because (1) that's what they normally are, and
- # (2) the word "unknown" tends to confuse beginning users.
- i*86 | x86_64)
-@@ -1020,6 +1022,11 @@
- ;;
+@@ -169,11 +178,18 @@
+ Only on Windows platforms.
- # Here we normalize CPU types with a missing or matching vendor
-+ armh-unknown | armh-alt)
-+ cpu=armv7l
-+ vendor=alt
-+ basic_os=${basic_os:-linux-gnueabihf}
-+ ;;
- dpx20-unknown | dpx20-bull)
- cpu=rs6000
- vendor=bull
-@@ -1070,7 +1077,7 @@
- pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
- cpu=i586
- ;;
-- pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
-+ pentiumpro-* | p6-* | 6x86-* | athlon-* | athlon_*-*)
- cpu=i686
- ;;
- pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-@@ -1121,7 +1128,7 @@
- xscale-* | xscalee[bl]-*)
- cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
- ;;
-- arm64-*)
-+ arm64-* | aarch64le-* | arm64_32-*)
- cpu=aarch64
- ;;
+ (3)
+- Only on macOS platform.
++ Only on macOS.
++
++(4)
++ Only on iOS.
++
-@@ -1175,7 +1182,7 @@
- case $cpu in
- 1750a | 580 \
- | a29k \
-- | aarch64 | aarch64_be \
-+ | aarch64 | aarch64_be | aarch64c | arm64ec \
- | abacus \
- | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
- | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
-@@ -1194,50 +1201,29 @@
- | d10v | d30v | dlx | dsp16xx \
- | e2k | elxsi | epiphany \
- | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
-+ | javascript \
- | h8300 | h8500 \
- | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
- | hexagon \
- | i370 | i*86 | i860 | i960 | ia16 | ia64 \
- | ip2k | iq2000 \
- | k1om \
-+ | kvx \
- | le32 | le64 \
- | lm32 \
-- | loongarch32 | loongarch64 | loongarchx32 \
-+ | loongarch32 | loongarch64 \
- | m32c | m32r | m32rle \
- | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
- | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
- | m88110 | m88k | maxq | mb | mcore | mep | metag \
- | microblaze | microblazeel \
-- | mips | mipsbe | mipseb | mipsel | mipsle \
-- | mips16 \
-- | mips64 | mips64eb | mips64el \
-- | mips64octeon | mips64octeonel \
-- | mips64orion | mips64orionel \
-- | mips64r5900 | mips64r5900el \
-- | mips64vr | mips64vrel \
-- | mips64vr4100 | mips64vr4100el \
-- | mips64vr4300 | mips64vr4300el \
-- | mips64vr5000 | mips64vr5000el \
-- | mips64vr5900 | mips64vr5900el \
-- | mipsisa32 | mipsisa32el \
-- | mipsisa32r2 | mipsisa32r2el \
-- | mipsisa32r3 | mipsisa32r3el \
-- | mipsisa32r5 | mipsisa32r5el \
-- | mipsisa32r6 | mipsisa32r6el \
-- | mipsisa64 | mipsisa64el \
-- | mipsisa64r2 | mipsisa64r2el \
-- | mipsisa64r3 | mipsisa64r3el \
-- | mipsisa64r5 | mipsisa64r5el \
-- | mipsisa64r6 | mipsisa64r6el \
-- | mipsisa64sb1 | mipsisa64sb1el \
-- | mipsisa64sr71k | mipsisa64sr71kel \
-- | mipsr5900 | mipsr5900el \
-- | mipstx39 | mipstx39el \
-+ | mips* \
- | mmix \
- | mn10200 | mn10300 \
- | moxie \
- | mt \
- | msp430 \
-+ | nanomips* \
- | nds32 | nds32le | nds32be \
- | nfp \
- | nios | nios2 | nios2eb | nios2el \
-@@ -1269,6 +1255,7 @@
- | ubicom32 \
- | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
- | vax \
-+ | vc4 \
- | visium \
- | w65 \
- | wasm32 | wasm64 \
-@@ -1280,7 +1267,7 @@
- ;;
+ .. versionadded:: 3.3
+ Support for Chrome/Chromium has been added.
- *)
-- echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
-+ echo "Invalid configuration '$1': machine '$cpu-$vendor' not recognized" 1>&2
- exit 1
- ;;
- esac
-@@ -1301,11 +1288,12 @@
++.. versionchanged:: 3.13
++ Support for iOS has been added.
++
+ Here are some simple examples::
- # Decode manufacturer-specific aliases for certain operating systems.
+ url = 'https://docs.python.org/'
+diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst
+index ab33e0a06f5..6fe63e9ce2d 100644
+--- a/Doc/using/configure.rst
++++ b/Doc/using/configure.rst
+@@ -506,6 +506,75 @@
+ Specify the name for the python framework on macOS only valid when
+ :option:`--enable-framework` is set (default: ``Python``).
--if test x$basic_os != x
-+if test x"$basic_os" != x
- then
++.. option:: --with-app-store-compliance
++.. option:: --with-app-store-compliance=PATCH-FILE
++
++ The Python standard library contains strings that are known to trigger
++ automated inspection tool errors when submitted for distribution by
++ the macOS and iOS App Stores. If enabled, this option will apply the list of
++ patches that are known to correct app store compliance. A custom patch
++ file can also be specified. This option is disabled by default.
++
++ .. versionadded:: 3.13
++
++iOS Options
++-----------
++
++See :source:`iOS/README.rst`.
++
++.. option:: --enable-framework=INSTALLDIR
++
++ Create a Python.framework. Unlike macOS, the *INSTALLDIR* argument
++ specifying the installation path is mandatory.
++
++.. option:: --with-framework-name=FRAMEWORK
++
++ Specify the name for the framework (default: ``Python``).
++
++
++Cross Compiling Options
++-----------------------
++
++Cross compiling, also known as cross building, can be used to build Python
++for another CPU architecture or platform. Cross compiling requires a Python
++interpreter for the build platform. The version of the build Python must match
++the version of the cross compiled host Python.
++
++.. option:: --build=BUILD
++
++ configure for building on BUILD, usually guessed by :program:`config.guess`.
++
++.. option:: --host=HOST
++
++ cross-compile to build programs to run on HOST (target platform)
++
++.. option:: --with-build-python=path/to/python
++
++ path to build ``python`` binary for cross compiling
++
++ .. versionadded:: 3.11
++
++.. option:: CONFIG_SITE=file
++
++ An environment variable that points to a file with configure overrides.
++
++ Example *config.site* file:
++
++ .. code-block:: ini
++
++ # config.site-aarch64
++ ac_cv_buggy_getaddrinfo=no
++ ac_cv_file__dev_ptmx=yes
++ ac_cv_file__dev_ptc=no
++
++
++Cross compiling example::
++
++ CONFIG_SITE=config.site-aarch64 ../configure \
++ --build=x86_64-pc-linux-gnu \
++ --host=aarch64-unknown-linux-gnu \
++ --with-build-python=../x86_64/python
++
--# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just
-+# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just
- # set os.
-+obj=
- case $basic_os in
- gnu/linux*)
- kernel=linux
-@@ -1336,6 +1324,10 @@
- kernel=linux
- os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
- ;;
-+ managarm*)
-+ kernel=managarm
-+ os=`echo "$basic_os" | sed -e 's|managarm|mlibc|'`
-+ ;;
- *)
- kernel=
- os=$basic_os
-@@ -1501,10 +1493,16 @@
- os=eabi
- ;;
- *)
-- os=elf
-+ os=
-+ obj=elf
- ;;
- esac
- ;;
-+ aout* | coff* | elf* | pe*)
-+ # These are machine code file formats, not OSes
-+ obj=$os
-+ os=
-+ ;;
- *)
- # No normalization, but not necessarily accepted, that comes below.
- ;;
-@@ -1523,12 +1521,15 @@
- # system, and we'll never get to this point.
+ Python Build System
+ ===================
+diff --git a/Doc/using/mac.rst b/Doc/using/mac.rst
+index 9ae0270eaee..2bb14d88dc9 100644
+--- a/Doc/using/mac.rst
++++ b/Doc/using/mac.rst
+@@ -164,6 +164,28 @@
+ at https://pypi.org/project/py2app/.
- kernel=
-+obj=
- case $cpu-$vendor in
- score-*)
-- os=elf
-+ os=
-+ obj=elf
- ;;
- spu-*)
-- os=elf
-+ os=
-+ obj=elf
- ;;
- *-acorn)
- os=riscix1.2
-@@ -1538,28 +1539,35 @@
- os=gnu
- ;;
- arm*-semi)
-- os=aout
-+ os=
-+ obj=aout
- ;;
- c4x-* | tic4x-*)
-- os=coff
-+ os=
-+ obj=coff
- ;;
- c8051-*)
-- os=elf
-+ os=
-+ obj=elf
- ;;
- clipper-intergraph)
- os=clix
- ;;
- hexagon-*)
-- os=elf
-+ os=
-+ obj=elf
- ;;
- tic54x-*)
-- os=coff
-+ os=
-+ obj=coff
- ;;
- tic55x-*)
-- os=coff
-+ os=
-+ obj=coff
- ;;
- tic6x-*)
-- os=coff
-+ os=
-+ obj=coff
- ;;
- # This must come before the *-dec entry.
- pdp10-*)
-@@ -1581,19 +1589,24 @@
- os=sunos3
- ;;
- m68*-cisco)
-- os=aout
-+ os=
-+ obj=aout
- ;;
- mep-*)
-- os=elf
-+ os=
-+ obj=elf
- ;;
- mips*-cisco)
-- os=elf
-+ os=
-+ obj=elf
- ;;
-- mips*-*)
-- os=elf
-+ mips*-*|nanomips*-*)
-+ os=
-+ obj=elf
- ;;
- or32-*)
-- os=coff
-+ os=
-+ obj=coff
- ;;
- *-tti) # must be before sparc entry or we get the wrong os.
- os=sysv3
-@@ -1602,7 +1615,8 @@
- os=sunos4.1.1
- ;;
- pru-*)
-- os=elf
-+ os=
-+ obj=elf
- ;;
- *-be)
- os=beos
-@@ -1683,10 +1697,12 @@
- os=uxpv
- ;;
- *-rom68k)
-- os=coff
-+ os=
-+ obj=coff
- ;;
- *-*bug)
-- os=coff
-+ os=
-+ obj=coff
- ;;
- *-apple)
- os=macos
-@@ -1704,10 +1720,11 @@
- fi
++App Store Compliance
++--------------------
++
++Apps submitted for distribution through the macOS App Store must pass Apple's
++app review process. This process includes a set of automated validation rules
++that inspect the submitted application bundle for problematic code.
++
++The Python standard library contains some code that is known to violate these
++automated rules. While these violations appear to be false positives, Apple's
++review rules cannot be challenged. Therefore, it is necessary to modify the
++Python standard library for an app to pass App Store review.
++
++The Python source tree contains
++:source:`a patch file ` that will remove
++all code that is known to cause issues with the App Store review process. This
++patch is applied automatically when CPython is configured with the
++:option:`--with-app-store-compliance` option.
++
++This patch is not normally required to use CPython on a Mac; nor is it required
++if you are distributing an app *outside* the macOS App Store. It is *only*
++required if you are using the macOS App Store as a distribution channel.
++
+ Other Resources
+ ===============
--# Now, validate our (potentially fixed-up) OS.
-+# Now, validate our (potentially fixed-up) individual pieces (OS, OBJ).
+--- /dev/null
++++ b/Lib/_apple_support.py
+@@ -0,0 +1,66 @@
++import io
++import sys
++
++
++def init_streams(log_write, stdout_level, stderr_level):
++ # Redirect stdout and stderr to the Apple system log. This method is
++ # invoked by init_apple_streams() (initconfig.c) if config->use_system_logger
++ # is enabled.
++ sys.stdout = SystemLog(log_write, stdout_level, errors=sys.stderr.errors)
++ sys.stderr = SystemLog(log_write, stderr_level, errors=sys.stderr.errors)
++
++
++class SystemLog(io.TextIOWrapper):
++ def __init__(self, log_write, level, **kwargs):
++ kwargs.setdefault("encoding", "UTF-8")
++ kwargs.setdefault("line_buffering", True)
++ super().__init__(LogStream(log_write, level), **kwargs)
++
++ def __repr__(self):
++ return f""
++
++ def write(self, s):
++ if not isinstance(s, str):
++ raise TypeError(
++ f"write() argument must be str, not {type(s).__name__}")
++
++ # In case `s` is a str subclass that writes itself to stdout or stderr
++ # when we call its methods, convert it to an actual str.
++ s = str.__str__(s)
++
++ # We want to emit one log message per line, so split
++ # the string before sending it to the superclass.
++ for line in s.splitlines(keepends=True):
++ super().write(line)
++
++ return len(s)
++
++
++class LogStream(io.RawIOBase):
++ def __init__(self, log_write, level):
++ self.log_write = log_write
++ self.level = level
+
- case $os in
- # Sometimes we do "kernel-libc", so those need to count as OSes.
-- musl* | newlib* | relibc* | uclibc*)
-+ llvm* | musl* | newlib* | relibc* | uclibc*)
- ;;
- # Likewise for "kernel-abi"
- eabi* | gnueabi*)
-@@ -1715,6 +1732,9 @@
- # VxWorks passes extra cpu info in the 4th filed.
- simlinux | simwindows | spe)
- ;;
-+ # See `case $cpu-$os` validation below
-+ ghcjs)
-+ ;;
- # Now accept the basic system types.
- # The portable systems comes first.
- # Each alternative MUST end in a * to match a version number.
-@@ -1723,7 +1743,7 @@
- | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
- | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \
- | hiux* | abug | nacl* | netware* | windows* \
-- | os9* | macos* | osx* | ios* \
-+ | os9* | macos* | osx* | ios* | tvos* | watchos* \
- | mpw* | magic* | mmixware* | mon960* | lnews* \
- | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
- | aos* | aros* | cloudabi* | sortix* | twizzler* \
-@@ -1732,11 +1752,11 @@
- | mirbsd* | netbsd* | dicos* | openedition* | ose* \
- | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \
- | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
-- | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
-- | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
-+ | bosx* | nextstep* | cxux* | oabi* \
-+ | ptx* | ecoff* | winnt* | domain* | vsta* \
- | udi* | lites* | ieee* | go32* | aux* | hcos* \
- | chorusrdb* | cegcc* | glidix* | serenity* \
-- | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
-+ | cygwin* | msys* | moss* | proelf* | rtems* \
- | midipix* | mingw32* | mingw64* | mint* \
- | uxpv* | beos* | mpeix* | udk* | moxiebox* \
- | interix* | uwin* | mks* | rhapsody* | darwin* \
-@@ -1748,49 +1768,119 @@
- | skyos* | haiku* | rdos* | toppers* | drops* | es* \
- | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
- | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
-- | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr*)
-+ | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \
-+ | fiwix* | mlibc* | cos* | mbr* | ironclad* )
- ;;
- # This one is extra strict with allowed versions
- sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
- # Don't forget version if it is 3.2v4 or newer.
- ;;
-+ # This refers to builds using the UEFI calling convention
-+ # (which depends on the architecture) and PE file format.
-+ # Note that this is both a different calling convention and
-+ # different file format than that of GNU-EFI
-+ # (x86_64-w64-mingw32).
-+ uefi)
-+ ;;
- none)
- ;;
-+ kernel* | msvc* )
-+ # Restricted further below
-+ ;;
-+ '')
-+ if test x"$obj" = x
-+ then
-+ echo "Invalid configuration '$1': Blank OS only allowed with explicit machine code file format" 1>&2
-+ fi
-+ ;;
- *)
-- echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
-+ echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2
-+ exit 1
-+ ;;
-+esac
++ def __repr__(self):
++ return f""
+
-+case $obj in
-+ aout* | coff* | elf* | pe*)
-+ ;;
-+ '')
-+ # empty is fine
-+ ;;
-+ *)
-+ echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2
-+ exit 1
-+ ;;
-+esac
++ def writable(self):
++ return True
+
-+# Here we handle the constraint that a (synthetic) cpu and os are
-+# valid only in combination with each other and nowhere else.
-+case $cpu-$os in
-+ # The "javascript-unknown-ghcjs" triple is used by GHC; we
-+ # accept it here in order to tolerate that, but reject any
-+ # variations.
-+ javascript-ghcjs)
-+ ;;
-+ javascript-* | *-ghcjs)
-+ echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2
- exit 1
- ;;
- esac
++ def write(self, b):
++ if type(b) is not bytes:
++ try:
++ b = bytes(memoryview(b))
++ except TypeError:
++ raise TypeError(
++ f"write() argument must be bytes-like, not {type(b).__name__}"
++ ) from None
++
++ # Writing an empty string to the stream should have no effect.
++ if b:
++ # Encode null bytes using "modified UTF-8" to avoid truncating the
++ # message. This should not affect the return value, as the caller
++ # may be expecting it to match the length of the input.
++ self.log_write(self.level, b.replace(b"\x00", b"\xc0\x80"))
++
++ return len(b)
+--- /dev/null
++++ b/Lib/_ios_support.py
+@@ -0,0 +1,71 @@
++import sys
++try:
++ from ctypes import cdll, c_void_p, c_char_p, util
++except ImportError:
++ # ctypes is an optional module. If it's not present, we're limited in what
++ # we can tell about the system, but we don't want to prevent the module
++ # from working.
++ print("ctypes isn't available; iOS system calls will not be available")
++ objc = None
++else:
++ # ctypes is available. Load the ObjC library, and wrap the objc_getClass,
++ # sel_registerName methods
++ lib = util.find_library("objc")
++ if lib is None:
++ # Failed to load the objc library
++ raise RuntimeError("ObjC runtime library couldn't be loaded")
++
++ objc = cdll.LoadLibrary(lib)
++ objc.objc_getClass.restype = c_void_p
++ objc.objc_getClass.argtypes = [c_char_p]
++ objc.sel_registerName.restype = c_void_p
++ objc.sel_registerName.argtypes = [c_char_p]
++
++
++def get_platform_ios():
++ # Determine if this is a simulator using the multiarch value
++ is_simulator = sys.implementation._multiarch.endswith("simulator")
++
++ # We can't use ctypes; abort
++ if not objc:
++ return None
++
++ # Most of the methods return ObjC objects
++ objc.objc_msgSend.restype = c_void_p
++ # All the methods used have no arguments.
++ objc.objc_msgSend.argtypes = [c_void_p, c_void_p]
++
++ # Equivalent of:
++ # device = [UIDevice currentDevice]
++ UIDevice = objc.objc_getClass(b"UIDevice")
++ SEL_currentDevice = objc.sel_registerName(b"currentDevice")
++ device = objc.objc_msgSend(UIDevice, SEL_currentDevice)
++
++ # Equivalent of:
++ # device_systemVersion = [device systemVersion]
++ SEL_systemVersion = objc.sel_registerName(b"systemVersion")
++ device_systemVersion = objc.objc_msgSend(device, SEL_systemVersion)
++
++ # Equivalent of:
++ # device_systemName = [device systemName]
++ SEL_systemName = objc.sel_registerName(b"systemName")
++ device_systemName = objc.objc_msgSend(device, SEL_systemName)
++
++ # Equivalent of:
++ # device_model = [device model]
++ SEL_model = objc.sel_registerName(b"model")
++ device_model = objc.objc_msgSend(device, SEL_model)
++
++ # UTF8String returns a const char*;
++ SEL_UTF8String = objc.sel_registerName(b"UTF8String")
++ objc.objc_msgSend.restype = c_char_p
++
++ # Equivalent of:
++ # system = [device_systemName UTF8String]
++ # release = [device_systemVersion UTF8String]
++ # model = [device_model UTF8String]
++ system = objc.objc_msgSend(device_systemName, SEL_UTF8String).decode()
++ release = objc.objc_msgSend(device_systemVersion, SEL_UTF8String).decode()
++ model = objc.objc_msgSend(device_model, SEL_UTF8String).decode()
++
++ return system, release, model, is_simulator
+diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py
+index 4afa4ebd422..dca2081bea4 100644
+--- a/Lib/ctypes/__init__.py
++++ b/Lib/ctypes/__init__.py
+@@ -341,6 +341,19 @@
+ use_errno=False,
+ use_last_error=False,
+ winmode=None):
++ if name:
++ name = _os.fspath(name)
++
++ # If the filename that has been provided is an iOS/tvOS/watchOS
++ # .fwork file, dereference the location to the true origin of the
++ # binary.
++ if name.endswith(".fwork"):
++ with open(name) as f:
++ name = _os.path.join(
++ _os.path.dirname(_sys.executable),
++ f.read().strip()
++ )
++
+ self._name = name
+ flags = self._func_flags_
+ if use_errno:
+diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py
+index 0c2510e1619..438f2713563 100644
+--- a/Lib/ctypes/util.py
++++ b/Lib/ctypes/util.py
+@@ -67,7 +67,7 @@
+ return fname
+ return None
+
+-elif os.name == "posix" and sys.platform == "darwin":
++elif os.name == "posix" and sys.platform in {"darwin", "ios", "tvos", "watchos"}:
+ from ctypes.macholib.dyld import dyld_find as _dyld_find
+ def find_library(name):
+ possible = ['lib%s.dylib' % name,
+diff --git a/Lib/distutils/tests/test_cygwinccompiler.py b/Lib/distutils/tests/test_cygwinccompiler.py
+index 9dc869de4c8..646b24faa86 100644
+--- a/Lib/distutils/tests/test_cygwinccompiler.py
++++ b/Lib/distutils/tests/test_cygwinccompiler.py
+@@ -5,6 +5,9 @@
+ from io import BytesIO
+ from test.support import run_unittest
+
++if sys.platform != 'win32':
++ raise unittest.SkipTest("Cygwin tests only needed on Windows")
++
+ from distutils import cygwinccompiler
+ from distutils.cygwinccompiler import (check_config_h,
+ CONFIG_H_OK, CONFIG_H_NOTOK,
+diff --git a/Lib/distutils/tests/test_sysconfig.py b/Lib/distutils/tests/test_sysconfig.py
+index 59676b0e0b0..ba7bb5b7693 100644
+--- a/Lib/distutils/tests/test_sysconfig.py
++++ b/Lib/distutils/tests/test_sysconfig.py
+@@ -10,7 +10,7 @@
+ from distutils import sysconfig
+ from distutils.ccompiler import get_default_compiler
+ from distutils.tests import support
+-from test.support import run_unittest, swap_item
++from test.support import is_apple_mobile, requires_subprocess, run_unittest, swap_item
+ from test.support.os_helper import TESTFN
+ from test.support.warnings_helper import check_warnings
- # As a final step for OS-related things, validate the OS-kernel combination
- # (given a valid OS), if there is a kernel.
--case $kernel-$os in
-- linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \
-- | linux-musl* | linux-relibc* | linux-uclibc* )
-+case $kernel-$os-$obj in
-+ linux-gnu*- | linux-android*- | linux-dietlibc*- | linux-llvm*- \
-+ | linux-mlibc*- | linux-musl*- | linux-newlib*- \
-+ | linux-relibc*- | linux-uclibc*- )
-+ ;;
-+ uclinux-uclibc*- )
- ;;
-- uclinux-uclibc* )
-+ managarm-mlibc*- | managarm-kernel*- )
- ;;
-- -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* )
-+ windows*-msvc*-)
-+ ;;
-+ -dietlibc*- | -llvm*- | -mlibc*- | -musl*- | -newlib*- | -relibc*- \
-+ | -uclibc*- )
- # These are just libc implementations, not actual OSes, and thus
- # require a kernel.
-- echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
-+ echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2
- exit 1
- ;;
-- kfreebsd*-gnu* | kopensolaris*-gnu*)
-+ -kernel*- )
-+ echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2
-+ exit 1
- ;;
-- vxworks-simlinux | vxworks-simwindows | vxworks-spe)
-+ *-kernel*- )
-+ echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2
-+ exit 1
- ;;
-- nto-qnx*)
-+ *-msvc*- )
-+ echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2
-+ exit 1
- ;;
-- os2-emx)
-+ kfreebsd*-gnu*- | kopensolaris*-gnu*-)
- ;;
-- *-eabi* | *-gnueabi*)
-+ vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-)
- ;;
-- -*)
-+ nto-qnx*-)
-+ ;;
-+ os2-emx-)
-+ ;;
-+ *-eabi*- | *-gnueabi*-)
-+ ;;
-+ ios*-simulator- | tvos*-simulator- | watchos*-simulator- )
-+ ;;
-+ none--*)
-+ # None (no kernel, i.e. freestanding / bare metal),
-+ # can be paired with an machine code file format
-+ ;;
-+ -*-)
- # Blank kernel with real OS is always fine.
- ;;
-- *-*)
-- echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
-+ --*)
-+ # Blank kernel and OS with real machine code file format is always fine.
-+ ;;
-+ *-*-*)
-+ echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2
- exit 1
- ;;
- esac
-@@ -1873,7 +1963,7 @@
- ;;
- esac
+@@ -32,6 +32,7 @@
+ elif os.path.isdir(TESTFN):
+ shutil.rmtree(TESTFN)
--echo "$cpu-$vendor-${kernel:+$kernel-}$os"
-+echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}"
- exit
++ @unittest.skipIf(is_apple_mobile, "Header files not distributed with Apple mobile")
+ def test_get_config_h_filename(self):
+ config_h = sysconfig.get_config_h_filename()
+ self.assertTrue(os.path.isfile(config_h), config_h)
+@@ -48,6 +49,7 @@
+ self.assertIsInstance(cvars, dict)
+ self.assertTrue(cvars)
- # Local variables:
-diff --git a/configure b/configure
-index 4b71c4e00f8..ffd219bff19 100755
---- a/configure
-+++ b/configure
-@@ -660,6 +660,8 @@
- DTRACE
- TCLTK_LIBS
- TCLTK_INCLUDES
-+LIBFFI_LIB
-+LIBFFI_LIBDIR
- LIBFFI_INCLUDEDIR
- PKG_CONFIG_LIBDIR
- PKG_CONFIG_PATH
-@@ -736,10 +738,14 @@
- LDFLAGS
- CFLAGS
- CC
-+WATCHOS_DEPLOYMENT_TARGET
-+TVOS_DEPLOYMENT_TARGET
-+IPHONEOS_DEPLOYMENT_TARGET
- EXPORT_MACOSX_DEPLOYMENT_TARGET
- CONFIGURE_MACOSX_DEPLOYMENT_TARGET
- _PYTHON_HOST_PLATFORM
--MACHDEP
-+APP_STORE_COMPLIANCE_PATCH
-+INSTALLTARGETS
- FRAMEWORKINSTALLAPPSPREFIX
- FRAMEWORKUNIXTOOLSPREFIX
- FRAMEWORKPYTHONW
-@@ -747,6 +753,8 @@
- FRAMEWORKALTINSTALLFIRST
- FRAMEWORKINSTALLLAST
- FRAMEWORKINSTALLFIRST
-+RESSRCDIR
-+PYTHONFRAMEWORKINSTALLNAMEPREFIX
- PYTHONFRAMEWORKINSTALLDIR
- PYTHONFRAMEWORKPREFIX
- PYTHONFRAMEWORKDIR
-@@ -756,6 +764,7 @@
- LIPO_32BIT_FLAGS
- ARCH_RUN_32BIT
- UNIVERSALSDK
-+MACHDEP
- CONFIG_ARGS
- SOVERSION
- VERSION
-@@ -793,7 +802,6 @@
- docdir
- oldincludedir
- includedir
--runstatedir
- localstatedir
- sharedstatedir
- sysconfdir
-@@ -820,6 +828,7 @@
- with_universal_archs
- with_framework_name
- enable_framework
-+with_app_store_compliance
- with_cxx_main
- with_suffix
- enable_shared
-@@ -917,7 +926,6 @@
- sysconfdir='${prefix}/etc'
- sharedstatedir='${prefix}/com'
- localstatedir='${prefix}/var'
--runstatedir='${localstatedir}/run'
- includedir='${prefix}/include'
- oldincludedir='/usr/include'
- docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
-@@ -1170,15 +1178,6 @@
- | -silent | --silent | --silen | --sile | --sil)
- silent=yes ;;
++ @unittest.skipIf(is_apple_mobile, "Header files not distributed with Apple mobile")
+ def test_srcdir(self):
+ # See Issues #15322, #15364.
+ srcdir = sysconfig.get_config_var('srcdir')
+@@ -247,6 +249,7 @@
+ self.assertIsNotNone(vars['SO'])
+ self.assertEqual(vars['SO'], vars['EXT_SUFFIX'])
-- -runstatedir | --runstatedir | --runstatedi | --runstated \
-- | --runstate | --runstat | --runsta | --runst | --runs \
-- | --run | --ru | --r)
-- ac_prev=runstatedir ;;
-- -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
-- | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
-- | --run=* | --ru=* | --r=*)
-- runstatedir=$ac_optarg ;;
--
- -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
- ac_prev=sbindir ;;
- -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-@@ -1316,7 +1315,7 @@
- for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
- datadir sysconfdir sharedstatedir localstatedir includedir \
- oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-- libdir localedir mandir runstatedir
-+ libdir localedir mandir
- do
- eval ac_val=\$$ac_var
- # Remove trailing slashes.
-@@ -1469,7 +1468,6 @@
- --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
- --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
- --localstatedir=DIR modifiable single-machine data [PREFIX/var]
-- --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
- --libdir=DIR object code libraries [EPREFIX/lib]
- --includedir=DIR C header files [PREFIX/include]
- --oldincludedir=DIR C header files for non-gcc [/usr/include]
-@@ -1542,6 +1540,10 @@
- specify the name for the python framework on macOS
- only valid when --enable-framework is set. see
- Mac/README.rst (default is 'Python')
-+ --with-app-store-compliance=[PATCH-FILE]
-+ Enable any patches required for compiliance with app
-+ stores. Optional PATCH-FILE specifies the custom
-+ patch to apply.
- --with-cxx-main[=COMPILER]
- compile main() and link Python executable with C++
- compiler specified in COMPILER (default is $CXX)
-@@ -3007,7 +3009,7 @@
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for python interpreter for cross build" >&5
- $as_echo_n "checking for python interpreter for cross build... " >&6; }
- if test -z "$PYTHON_FOR_BUILD"; then
-- for interp in python$PACKAGE_VERSION python3 python; do
-+ for interp in $PYTHON_FOR_REGEN python$PACKAGE_VERSION python3 python; do
- which $interp >/dev/null 2>&1 || continue
- if $interp -c "import sys;sys.exit(not '.'.join(str(n) for n in sys.version_info[:2]) == '$PACKAGE_VERSION')"; then
- break
-@@ -3025,6 +3027,8 @@
- as_fn_error $? "Cross compiling required --host=HOST-TUPLE and --build=ARCH" "$LINENO" 5
- else
- PYTHON_FOR_BUILD='./$(BUILDPYTHON) -E'
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $interp" >&5
-+$as_echo "$interp" >&6; }
- fi
++ @requires_subprocess()
+ def test_customize_compiler_before_get_config_vars(self):
+ # Issue #21923: test that a Distribution compiler
+ # instance can be called without an explicit call to
+diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py
+index d00c48981eb..5d12b4779db 100644
+--- a/Lib/distutils/unixccompiler.py
++++ b/Lib/distutils/unixccompiler.py
+@@ -270,9 +270,9 @@
+ static_f = self.library_filename(lib, lib_type='static')
+
+ if sys.platform == 'darwin':
+- # On OSX users can specify an alternate SDK using
+- # '-isysroot', calculate the SDK root if it is specified
+- # (and use it further on)
++ # On macOS users can specify an alternate SDK using
++ # '-isysroot ' or --sysroot=, calculate the SDK root
++ # if it is specified (and use it further on)
+ #
+ # Note that, as of Xcode 7, Apple SDKs may contain textual stub
+ # libraries with .tbd extensions rather than the normal .dylib
+@@ -291,12 +291,14 @@
+ cflags = sysconfig.get_config_var('CFLAGS')
+ m = re.search(r'-isysroot\s*(\S+)', cflags)
+ if m is None:
+- sysroot = _osx_support._default_sysroot(sysconfig.get_config_var('CC'))
++ m = re.search(r'--sysroot=(\S+)', cflags)
++ if m is None:
++ sysroot = _osx_support._default_sysroot(sysconfig.get_config_var('CC'))
++ else:
++ sysroot = m.group(1)
+ else:
+ sysroot = m.group(1)
+-
+-
+ for dir in dirs:
+ shared = os.path.join(dir, shared_f)
+ dylib = os.path.join(dir, dylib_f)
+diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py
+index 2ce5c5b64d6..e927f4af938 100644
+--- a/Lib/distutils/util.py
++++ b/Lib/distutils/util.py
+@@ -89,10 +89,25 @@
+ if m:
+ release = m.group()
+ elif osname[:6] == "darwin":
+- import _osx_support, distutils.sysconfig
+- osname, release, machine = _osx_support.get_platform_osx(
+- distutils.sysconfig.get_config_vars(),
+- osname, release, machine)
++ import distutils.sysconfig
++ config_vars = distutils.sysconfig.get_config_vars()
++ if sys.platform == "ios":
++ release = config_vars.get("IPHONEOS_DEPLOYMENT_TARGET", "13.0")
++ osname = sys.platform
++ machine = sys.implementation._multiarch
++ elif sys.platform == "tvos":
++ release = config_vars.get("TVOS_DEPLOYMENT_TARGET", "9.0")
++ osname = sys.platform
++ machine = sys.implementation._multiarch
++ elif sys.platform == "watchos":
++ release = config_vars.get("WATCHOS_DEPLOYMENT_TARGET", "4.0")
++ osname = sys.platform
++ machine = sys.implementation._multiarch
++ else:
++ import _osx_support
++ osname, release, machine = _osx_support.get_platform_osx(
++ config_vars,
++ osname, release, machine)
-@@ -3083,6 +3087,166 @@
+ return "%s-%s-%s" % (osname, release, machine)
- CONFIG_ARGS="$ac_configure_args"
+@@ -170,7 +185,7 @@
+ if _environ_checked:
+ return
-+# Set name for machine-dependent library files
-+
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking MACHDEP" >&5
-+$as_echo_n "checking MACHDEP... " >&6; }
-+if test -z "$MACHDEP"
-+then
-+ # avoid using uname for cross builds
-+ if test "$cross_compiling" = yes; then
-+ # ac_sys_system and ac_sys_release are used for setting
-+ # a lot of different things including 'define_xopen_source'
-+ # in the case statement below.
-+ case "$host" in
-+ *-*-linux-android*)
-+ ac_sys_system=Linux-android
-+ ;;
-+ *-*-linux*)
-+ ac_sys_system=Linux
-+ ;;
-+ *-*-cygwin*)
-+ ac_sys_system=Cygwin
-+ ;;
-+ *-apple-ios*)
-+ ac_sys_system=iOS
-+ ;;
-+ *-apple-tvos*)
-+ ac_sys_system=tvOS
-+ ;;
-+ *-apple-watchos*)
-+ ac_sys_system=watchOS
-+ ;;
-+ *-*-vxworks*)
-+ ac_sys_system=VxWorks
-+ ;;
-+ *-*-emscripten)
-+ ac_sys_system=Emscripten
-+ ;;
-+ *-*-wasi)
-+ ac_sys_system=WASI
-+ ;;
-+ *)
-+ # for now, limit cross builds to known configurations
-+ MACHDEP="unknown"
-+ as_fn_error $? "cross build not supported for $host" "$LINENO" 5
-+ esac
-+ ac_sys_release=
-+ else
-+ ac_sys_system=`uname -s`
-+ if test "$ac_sys_system" = "AIX" \
-+ -o "$ac_sys_system" = "UnixWare" -o "$ac_sys_system" = "OpenUNIX"; then
-+ ac_sys_release=`uname -v`
-+ else
-+ ac_sys_release=`uname -r`
-+ fi
-+ fi
-+ ac_md_system=`echo $ac_sys_system |
-+ tr -d '/ ' | tr '[A-Z]' '[a-z]'`
-+ ac_md_release=`echo $ac_sys_release |
-+ tr -d '/ ' | sed 's/^[A-Z]\.//' | sed 's/\..*//'`
-+ MACHDEP="$ac_md_system$ac_md_release"
-+
-+ case $MACHDEP in
-+ aix*) MACHDEP="aix";;
-+ linux*) MACHDEP="linux";;
-+ cygwin*) MACHDEP="cygwin";;
-+ darwin*) MACHDEP="darwin";;
-+ '') MACHDEP="unknown";;
-+ esac
-+
-+ if test "$ac_sys_system" = "SunOS"; then
-+ # For Solaris, there isn't an OS version specific macro defined
-+ # in most compilers, so we define one here.
-+ SUNOS_VERSION=`echo $ac_sys_release | sed -e 's!\.\(0-9\)$!.0\1!g' | tr -d '.'`
-+
-+cat >>confdefs.h <<_ACEOF
-+#define Py_SUNOS_VERSION $SUNOS_VERSION
-+_ACEOF
-+
-+ fi
-+fi
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$MACHDEP\"" >&5
-+$as_echo "\"$MACHDEP\"" >&6; }
-+
-+# On cross-compile builds, configure will look for a host-specific compiler by
-+# prepending the user-provided host triple to the required binary name.
-+#
-+# On iOS/tvOS/watchOS, this results in binaries like "arm64-apple-ios13.0-simulator-gcc",
-+# which isn't a binary that exists, and isn't very convenient, as it contains the
-+# iOS version. As the default cross-compiler name won't exist, configure falls
-+# back to gcc, which *definitely* won't work. We're providing wrapper scripts for
-+# these tools; the binary names of these scripts are better defaults than "gcc".
-+# This only requires that the user put the platform scripts folder (e.g.,
-+# "iOS/Resources/bin") in their path, rather than defining platform-specific
-+# names/paths for AR, CC, CPP, and CXX explicitly; and if the user forgets to
-+# either put the platform scripts folder in the path, or specify CC etc,
-+# configure will fail.
-+if test -z "$AR"; then
-+ case "$host" in
-+ aarch64-apple-ios*-simulator) AR=arm64-apple-ios-simulator-ar ;;
-+ aarch64-apple-ios*) AR=arm64-apple-ios-ar ;;
-+ x86_64-apple-ios*-simulator) AR=x86_64-apple-ios-simulator-ar ;;
-+
-+ aarch64-apple-tvos*-simulator) AR=arm64-apple-tvos-simulator-ar ;;
-+ aarch64-apple-tvos*) AR=arm64-apple-tvos-ar ;;
-+ x86_64-apple-tvos*-simulator) AR=x86_64-apple-tvos-simulator-ar ;;
-+
-+ aarch64-apple-watchos*-simulator) AR=arm64-apple-watchos-simulator-ar ;;
-+ aarch64-apple-watchos*) AR=arm64_32-apple-watchos-ar ;;
-+ x86_64-apple-watchos*-simulator) AR=x86_64-apple-watchos-simulator-ar ;;
-+ *)
-+ esac
-+fi
-+if test -z "$CC"; then
-+ case "$host" in
-+ aarch64-apple-ios*-simulator) CC=arm64-apple-ios-simulator-clang ;;
-+ aarch64-apple-ios*) CC=arm64-apple-ios-clang ;;
-+ x86_64-apple-ios*-simulator) CC=x86_64-apple-ios-simulator-clang ;;
-+
-+ aarch64-apple-tvos*-simulator) CC=arm64-apple-tvos-simulator-clang ;;
-+ aarch64-apple-tvos*) CC=arm64-apple-tvos-clang ;;
-+ x86_64-apple-tvos*-simulator) CC=x86_64-apple-tvos-simulator-clang ;;
-+
-+ aarch64-apple-watchos*-simulator) CC=arm64-apple-watchos-simulator-clang ;;
-+ aarch64-apple-watchos*) CC=arm64_32-apple-watchos-clang ;;
-+ x86_64-apple-watchos*-simulator) CC=x86_64-apple-watchos-simulator-clang ;;
-+ *)
-+ esac
-+fi
-+if test -z "$CPP"; then
-+ case "$host" in
-+ aarch64-apple-ios*-simulator) CPP=arm64-apple-ios-simulator-cpp ;;
-+ aarch64-apple-ios*) CPP=arm64-apple-ios-cpp ;;
-+ x86_64-apple-ios*-simulator) CPP=x86_64-apple-ios-simulator-cpp ;;
-+
-+ aarch64-apple-tvos*-simulator) CPP=arm64-apple-tvos-simulator-cpp ;;
-+ aarch64-apple-tvos*) CPP=arm64-apple-tvos-cpp ;;
-+ x86_64-apple-tvos*-simulator) CPP=x86_64-apple-tvos-simulator-cpp ;;
+- if os.name == 'posix' and 'HOME' not in os.environ:
++ if os.name == 'posix' and 'HOME' not in os.environ and sys.platform not in {"ios", "tvos", "watchos"}:
+ try:
+ import pwd
+ os.environ['HOME'] = pwd.getpwuid(os.getuid())[5]
+diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py
+index 49bcaea78d7..94052fc72e4 100644
+--- a/Lib/importlib/_bootstrap_external.py
++++ b/Lib/importlib/_bootstrap_external.py
+@@ -52,7 +52,7 @@
+
+ # Bootstrap-related code ######################################################
+ _CASE_INSENSITIVE_PLATFORMS_STR_KEY = 'win',
+-_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY = 'cygwin', 'darwin'
++_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY = 'cygwin', 'darwin', 'ios', 'tvos', 'watchos'
+ _CASE_INSENSITIVE_PLATFORMS = (_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY
+ + _CASE_INSENSITIVE_PLATFORMS_STR_KEY)
+
+@@ -1637,6 +1637,46 @@
+ return 'FileFinder({!r})'.format(self.path)
+
+
++class AppleFrameworkLoader(ExtensionFileLoader):
++ """A loader for modules that have been packaged as frameworks for
++ compatibility with Apple's iOS App Store policies.
++ """
++ def create_module(self, spec):
++ # If the ModuleSpec has been created by the FileFinder, it will have
++ # been created with an origin pointing to the .fwork file. We need to
++ # redirect this to the location in the Frameworks folder, using the
++ # content of the .fwork file.
++ if spec.origin.endswith(".fwork"):
++ with _io.FileIO(spec.origin, 'r') as file:
++ framework_binary = file.read().decode().strip()
++ bundle_path = _path_split(sys.executable)[0]
++ spec.origin = _path_join(bundle_path, framework_binary)
+
-+ aarch64-apple-watchos*-simulator) CPP=arm64-apple-watchos-simulator-cpp ;;
-+ aarch64-apple-watchos*) CPP=arm64_32-apple-watchos-cpp ;;
-+ x86_64-apple-watchos*-simulator) CPP=x86_64-apple-watchos-simulator-cpp ;;
-+ *)
-+ esac
-+fi
-+if test -z "$CXX"; then
-+ case "$host" in
-+ aarch64-apple-ios*-simulator) CXX=arm64-apple-ios-simulator-clang++ ;;
-+ aarch64-apple-ios*) CXX=arm64-apple-ios-clang++ ;;
-+ x86_64-apple-ios*-simulator) CXX=x86_64-apple-ios-simulator-clang++ ;;
++ # If the loader is created based on the spec for a loaded module, the
++ # path will be pointing at the Framework location. If this occurs,
++ # get the original .fwork location to use as the module's __file__.
++ if self.path.endswith(".fwork"):
++ path = self.path
++ else:
++ with _io.FileIO(self.path + ".origin", 'r') as file:
++ origin = file.read().decode().strip()
++ bundle_path = _path_split(sys.executable)[0]
++ path = _path_join(bundle_path, origin)
+
-+ aarch64-apple-tvos*-simulator) CXX=arm64-apple-tvos-simulator-clang++ ;;
-+ aarch64-apple-tvos*) CXX=arm64-apple-tvos-clang++ ;;
-+ x86_64-apple-tvos*-simulator) CXX=x86_64-apple-tvos-simulator-clang++ ;;
++ module = _bootstrap._call_with_frames_removed(_imp.create_dynamic, spec)
+
-+ aarch64-apple-watchos*-simulator) CXX=arm64-apple-watchos-simulator-clang++ ;;
-+ aarch64-apple-watchos*) CXX=arm64_32-apple-watchos-clang++ ;;
-+ x86_64-apple-watchos*-simulator) CXX=x86_64-apple-watchos-simulator-clang++ ;;
-+ *)
-+ esac
-+fi
++ _bootstrap._verbose_message(
++ "Apple framework extension module {!r} loaded from {!r} (path {!r})",
++ spec.name,
++ spec.origin,
++ path,
++ )
+
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --enable-universalsdk" >&5
- $as_echo_n "checking for --enable-universalsdk... " >&6; }
- # Check whether --enable-universalsdk was given.
-@@ -3194,111 +3358,201 @@
- enableval=$enable_framework;
- case $enableval in
- yes)
-- enableval=/Library/Frameworks
-+ case $ac_sys_system in
-+ Darwin) enableval=/Library/Frameworks ;;
-+ iOS) enableval=iOS/Frameworks/\$\(MULTIARCH\) ;;
-+ tvOS) enableval=tvOS/Frameworks/\$\(MULTIARCH\) ;;
-+ watchOS) enableval=watchOS/Frameworks/\$\(MULTIARCH\) ;;
-+ *) as_fn_error $? "Unknown platform for framework build" "$LINENO" 5
-+ esac
- esac
++ # Ensure that the __file__ points at the .fwork location
++ module.__file__ = path
+
- case $enableval in
- no)
-- PYTHONFRAMEWORK=
-- PYTHONFRAMEWORKDIR=no-framework
-- PYTHONFRAMEWORKPREFIX=
-- PYTHONFRAMEWORKINSTALLDIR=
-- FRAMEWORKINSTALLFIRST=
-- FRAMEWORKINSTALLLAST=
-- FRAMEWORKALTINSTALLFIRST=
-- FRAMEWORKALTINSTALLLAST=
-- FRAMEWORKPYTHONW=
-- if test "x${prefix}" = "xNONE"; then
-- FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
-- else
-- FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
-- fi
-- enable_framework=
-+ case $ac_sys_system in
-+ iOS) as_fn_error $? "iOS builds must use --enable-framework" "$LINENO" 5 ;;
-+ tvOS) as_fn_error $? "tvOS builds must use --enable-framework" "$LINENO" 5 ;;
-+ watchOS) as_fn_error $? "watchOS builds must use --enable-framework" "$LINENO" 5 ;;
-+ *)
-+ PYTHONFRAMEWORK=
-+ PYTHONFRAMEWORKDIR=no-framework
-+ PYTHONFRAMEWORKPREFIX=
-+ PYTHONFRAMEWORKINSTALLDIR=
-+ PYTHONFRAMEWORKINSTALLNAMEPREFIX=
-+ RESSRCDIR=
-+ FRAMEWORKINSTALLFIRST=
-+ FRAMEWORKINSTALLLAST=
-+ FRAMEWORKALTINSTALLFIRST=
-+ FRAMEWORKALTINSTALLLAST=
-+ FRAMEWORKPYTHONW=
-+ INSTALLTARGETS="commoninstall bininstall maninstall"
++ return module
+
-+ if test "x${prefix}" = "xNONE"; then
-+ FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
-+ else
-+ FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
-+ fi
-+ enable_framework=
-+ esac
- ;;
- *)
- PYTHONFRAMEWORKPREFIX="${enableval}"
- PYTHONFRAMEWORKINSTALLDIR=$PYTHONFRAMEWORKPREFIX/$PYTHONFRAMEWORKDIR
-- FRAMEWORKINSTALLFIRST="frameworkinstallstructure"
-- FRAMEWORKALTINSTALLFIRST="frameworkinstallstructure "
-- FRAMEWORKINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools"
-- FRAMEWORKALTINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkaltinstallunixtools"
-- FRAMEWORKPYTHONW="frameworkpythonw"
-- FRAMEWORKINSTALLAPPSPREFIX="/Applications"
+ # Import setup ###############################################################
-- if test "x${prefix}" = "xNONE" ; then
-- FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
-+ case $ac_sys_system in #(
-+ Darwin) :
-+ FRAMEWORKINSTALLFIRST="frameworkinstallversionedstructure"
-+ FRAMEWORKALTINSTALLFIRST="frameworkinstallversionedstructure "
-+ FRAMEWORKINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools"
-+ FRAMEWORKALTINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkaltinstallunixtools"
-+ FRAMEWORKPYTHONW="frameworkpythonw"
-+ FRAMEWORKINSTALLAPPSPREFIX="/Applications"
-+ INSTALLTARGETS="commoninstall bininstall maninstall"
-+
-+ if test "x${prefix}" = "xNONE" ; then
-+ FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
+ def _fix_up_module(ns, name, pathname, cpathname=None):
+@@ -1667,10 +1707,17 @@
+
+ Each item is a tuple (loader, suffixes).
+ """
+- extensions = ExtensionFileLoader, _imp.extension_suffixes()
++ if sys.platform in {"ios", "tvos", "watchos"}:
++ extension_loaders = [(AppleFrameworkLoader, [
++ suffix.replace(".so", ".fwork")
++ for suffix in _imp.extension_suffixes()
++ ])]
++ else:
++ extension_loaders = []
++ extension_loaders.append((ExtensionFileLoader, _imp.extension_suffixes()))
+ source = SourceFileLoader, SOURCE_SUFFIXES
+ bytecode = SourcelessFileLoader, BYTECODE_SUFFIXES
+- return [extensions, source, bytecode]
++ return extension_loaders + [source, bytecode]
+
+
+ def _set_bootstrap_module(_bootstrap_module):
+diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py
+index 0b4a3f80717..5c97d45d2fc 100644
+--- a/Lib/importlib/abc.py
++++ b/Lib/importlib/abc.py
+@@ -250,7 +250,11 @@
+ else:
+ return self.source_to_code(source, path)
+
+-_register(ExecutionLoader, machinery.ExtensionFileLoader)
++_register(
++ ExecutionLoader,
++ machinery.ExtensionFileLoader,
++ machinery.AppleFrameworkLoader,
++)
+
+
+ class FileLoader(_bootstrap_external.FileLoader, ResourceLoader, ExecutionLoader):
+diff --git a/Lib/importlib/machinery.py b/Lib/importlib/machinery.py
+index 9a7757fb6e4..cdf6385ea98 100644
+--- a/Lib/importlib/machinery.py
++++ b/Lib/importlib/machinery.py
+@@ -12,7 +12,11 @@
+ from ._bootstrap_external import SourceFileLoader
+ from ._bootstrap_external import SourcelessFileLoader
+ from ._bootstrap_external import ExtensionFileLoader
+-
++try:
++ # For cross-build purposes, allow this import to fail
++ from ._bootstrap_external import AppleFrameworkLoader
++except ImportError:
++ pass
+
+ def all_suffixes():
+ """Returns a list of all recognized module suffixes for this process"""
+diff --git a/Lib/inspect.py b/Lib/inspect.py
+index 2999a6019e0..d28a98539d5 100644
+--- a/Lib/inspect.py
++++ b/Lib/inspect.py
+@@ -853,6 +853,7 @@
+ return object
+ if hasattr(object, '__module__'):
+ return sys.modules.get(object.__module__)
+
-+ else
-+ FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
-+ fi
+ # Try the filename to modulename cache
+ if _filename is not None and _filename in modulesbyfile:
+ return sys.modules.get(modulesbyfile[_filename])
+@@ -946,7 +947,7 @@
+ # Allow filenames in form of "" to pass through.
+ # `doctest` monkeypatches `linecache` module to enable
+ # inspection, so let `linecache.getlines` to be called.
+- if not (file.startswith('<') and file.endswith('>')):
++ if (not (file.startswith('<') and file.endswith('>'))) or file.endswith('.fwork'):
+ raise OSError('source code not available')
+
+ module = getmodule(object, file)
+diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py
+index 90a1b34b5ff..2e07663de43 100644
+--- a/Lib/lib2to3/tests/test_parser.py
++++ b/Lib/lib2to3/tests/test_parser.py
+@@ -62,6 +62,7 @@
+ shutil.rmtree(tmpdir)
+
+ @unittest.skipIf(sys.executable is None, 'sys.executable required')
++ @test.support.requires_subprocess()
+ def test_load_grammar_from_subprocess(self):
+ tmpdir = tempfile.mkdtemp()
+ tmpsubdir = os.path.join(tmpdir, 'subdir')
+diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py
+index cb455f40c4d..55a4c78e768 100644
+--- a/Lib/modulefinder.py
++++ b/Lib/modulefinder.py
+@@ -80,7 +80,12 @@
+ if isinstance(spec.loader, importlib.machinery.SourceFileLoader):
+ kind = _PY_SOURCE
+
+- elif isinstance(spec.loader, importlib.machinery.ExtensionFileLoader):
++ elif isinstance(
++ spec.loader, (
++ importlib.machinery.ExtensionFileLoader,
++ importlib.machinery.AppleFrameworkLoader,
++ )
++ ):
+ kind = _C_EXTENSION
+
+ elif isinstance(spec.loader, importlib.machinery.SourcelessFileLoader):
+diff --git a/Lib/platform.py b/Lib/platform.py
+index 6a820c90a1a..28bd77fcf3d 100755
+--- a/Lib/platform.py
++++ b/Lib/platform.py
+@@ -449,6 +449,78 @@
+ # If that also doesn't work return the default values
+ return release, versioninfo, machine
-- else
-- FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
-- fi
-+ case "${enableval}" in
-+ /System*)
-+ FRAMEWORKINSTALLAPPSPREFIX="/Applications"
-+ if test "${prefix}" = "NONE" ; then
-+ # See below
-+ FRAMEWORKUNIXTOOLSPREFIX="/usr"
-+ fi
-+ ;;
+
-+ /Library*)
-+ FRAMEWORKINSTALLAPPSPREFIX="/Applications"
-+ ;;
++# A namedtuple for iOS version information.
++IOSVersionInfo = collections.namedtuple(
++ "IOSVersionInfo",
++ ["system", "release", "model", "is_simulator"]
++)
+
-+ */Library/Frameworks)
-+ MDIR="`dirname "${enableval}"`"
-+ MDIR="`dirname "${MDIR}"`"
-+ FRAMEWORKINSTALLAPPSPREFIX="${MDIR}/Applications"
+
-+ if test "${prefix}" = "NONE"; then
-+ # User hasn't specified the
-+ # --prefix option, but wants to install
-+ # the framework in a non-default location,
-+ # ensure that the compatibility links get
-+ # installed relative to that prefix as well
-+ # instead of in /usr/local.
-+ FRAMEWORKUNIXTOOLSPREFIX="${MDIR}"
-+ fi
-+ ;;
-
-- case "${enableval}" in
-- /System*)
-- FRAMEWORKINSTALLAPPSPREFIX="/Applications"
-- if test "${prefix}" = "NONE" ; then
-- # See below
-- FRAMEWORKUNIXTOOLSPREFIX="/usr"
-- fi
-- ;;
-+ *)
-+ FRAMEWORKINSTALLAPPSPREFIX="/Applications"
-+ ;;
-+ esac
-
-- /Library*)
-- FRAMEWORKINSTALLAPPSPREFIX="/Applications"
-- ;;
-+ prefix=$PYTHONFRAMEWORKINSTALLDIR/Versions/$VERSION
-+ PYTHONFRAMEWORKINSTALLNAMEPREFIX=${prefix}
-+ RESSRCDIR=Mac/Resources/framework
++def ios_ver(system="", release="", model="", is_simulator=False):
++ """Get iOS version information, and return it as a namedtuple:
++ (system, release, model, is_simulator).
++
++ If values can't be determined, they are set to values provided as
++ parameters.
++ """
++ if sys.platform == "ios":
++ import _ios_support
++ result = _ios_support.get_platform_ios()
++ if result is not None:
++ return IOSVersionInfo(*result)
+
-+ # Add files for Mac specific code to the list of output
-+ # files:
-+ ac_config_files="$ac_config_files Mac/Makefile"
++ return IOSVersionInfo(system, release, model, is_simulator)
+
-+ ac_config_files="$ac_config_files Mac/PythonLauncher/Makefile"
+
-+ ac_config_files="$ac_config_files Mac/Resources/framework/Info.plist"
++# A namedtuple for tvOS version information.
++TVOSVersionInfo = collections.namedtuple(
++ "TVOSVersionInfo",
++ ["system", "release", "model", "is_simulator"]
++)
+
-+ ac_config_files="$ac_config_files Mac/Resources/app/Info.plist"
+
-+ ;;
-+ iOS) :
-+ FRAMEWORKINSTALLFIRST="frameworkinstallunversionedstructure"
-+ FRAMEWORKALTINSTALLFIRST="frameworkinstallunversionedstructure "
-+ FRAMEWORKINSTALLLAST="frameworkinstallmobileheaders"
-+ FRAMEWORKALTINSTALLLAST="frameworkinstallmobileheaders"
-+ FRAMEWORKPYTHONW=
-+ INSTALLTARGETS="libinstall inclinstall sharedinstall"
++def tvos_ver(system="", release="", model="", is_simulator=False):
++ """Get tvOS version information, and return it as a namedtuple:
++ (system, release, model, is_simulator).
+
-+ prefix=$PYTHONFRAMEWORKPREFIX
-+ PYTHONFRAMEWORKINSTALLNAMEPREFIX="@rpath/$PYTHONFRAMEWORKDIR"
-+ RESSRCDIR=iOS/Resources
++ If values can't be determined, they are set to values provided as
++ parameters.
++ """
++ if sys.platform == "tvos":
++ # TODO: Can the iOS implementation be used here?
++ import _ios_support
++ result = _ios_support.get_platform_ios()
++ if result is not None:
++ return TVOSVersionInfo(*result)
+
-+ ac_config_files="$ac_config_files iOS/Resources/Info.plist"
++ return TVOSVersionInfo(system, release, model, is_simulator)
+
-+ ;;
-+ tvOS) :
-+ FRAMEWORKINSTALLFIRST="frameworkinstallunversionedstructure"
-+ FRAMEWORKALTINSTALLFIRST="frameworkinstallunversionedstructure "
-+ FRAMEWORKINSTALLLAST="frameworkinstallmobileheaders"
-+ FRAMEWORKALTINSTALLLAST="frameworkinstallmobileheaders"
-+ FRAMEWORKPYTHONW=
-+ INSTALLTARGETS="libinstall inclinstall sharedinstall"
+
-+ prefix=$PYTHONFRAMEWORKPREFIX
-+ PYTHONFRAMEWORKINSTALLNAMEPREFIX="@rpath/$PYTHONFRAMEWORKDIR"
-+ RESSRCDIR=tvOS/Resources
++# A namedtuple for watchOS version information.
++WatchOSVersionInfo = collections.namedtuple(
++ "WatchOSVersionInfo",
++ ["system", "release", "model", "is_simulator"]
++)
+
-+ ac_config_files="$ac_config_files tvOS/Resources/Info.plist"
+
-+ ;;
-+ watchOS) :
-+ FRAMEWORKINSTALLFIRST="frameworkinstallunversionedstructure"
-+ FRAMEWORKALTINSTALLFIRST="frameworkinstallunversionedstructure "
-+ FRAMEWORKINSTALLLAST="frameworkinstallmobileheaders"
-+ FRAMEWORKALTINSTALLLAST="frameworkinstallmobileheaders"
-+ FRAMEWORKPYTHONW=
-+ INSTALLTARGETS="libinstall inclinstall sharedinstall"
++def watchos_ver(system="", release="", model="", is_simulator=False):
++ """Get watchOS version information, and return it as a namedtuple:
++ (system, release, model, is_simulator).
+
-+ prefix=$PYTHONFRAMEWORKPREFIX
-+ PYTHONFRAMEWORKINSTALLNAMEPREFIX="@rpath/$PYTHONFRAMEWORKDIR"
-+ RESSRCDIR=watchOS/Resources
++ If values can't be determined, they are set to values provided as
++ parameters.
++ """
++ if sys.platform == "watchos":
++ # TODO: Can the iOS implementation be used here?
++ import _ios_support
++ result = _ios_support.get_platform_ios()
++ if result is not None:
++ return WatchOSVersionInfo(*result)
+
-+ ac_config_files="$ac_config_files watchOS/Resources/Info.plist"
++ return WatchOSVersionInfo(system, release, model, is_simulator)
+
-+ ;;
-+ *)
-+ as_fn_error $? "Unknown platform for framework build" "$LINENO" 5
-+ ;;
-+ esac
-+ esac
-
-- */Library/Frameworks)
-- MDIR="`dirname "${enableval}"`"
-- MDIR="`dirname "${MDIR}"`"
-- FRAMEWORKINSTALLAPPSPREFIX="${MDIR}/Applications"
--
-- if test "${prefix}" = "NONE"; then
-- # User hasn't specified the
-- # --prefix option, but wants to install
-- # the framework in a non-default location,
-- # ensure that the compatibility links get
-- # installed relative to that prefix as well
-- # instead of in /usr/local.
-- FRAMEWORKUNIXTOOLSPREFIX="${MDIR}"
-- fi
-- ;;
-+else
-
-+ case $ac_sys_system in
-+ iOS) as_fn_error $? "iOS builds must use --enable-framework" "$LINENO" 5 ;;
-+ tvOS) as_fn_error $? "tvOS builds must use --enable-framework" "$LINENO" 5 ;;
-+ watchOS) as_fn_error $? "watchOS builds must use --enable-framework" "$LINENO" 5 ;;
- *)
-- FRAMEWORKINSTALLAPPSPREFIX="/Applications"
-- ;;
-- esac
-+ PYTHONFRAMEWORK=
-+ PYTHONFRAMEWORKDIR=no-framework
-+ PYTHONFRAMEWORKPREFIX=
-+ PYTHONFRAMEWORKINSTALLDIR=
-+ PYTHONFRAMEWORKINSTALLNAMEPREFIX=
-+ RESSRCDIR=
-+ FRAMEWORKINSTALLFIRST=
-+ FRAMEWORKINSTALLLAST=
-+ FRAMEWORKALTINSTALLFIRST=
-+ FRAMEWORKALTINSTALLLAST=
-+ FRAMEWORKPYTHONW=
-+ INSTALLTARGETS="commoninstall bininstall maninstall"
-+ if test "x${prefix}" = "xNONE" ; then
-+ FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
-+ else
-+ FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
-+ fi
-+ enable_framework=
-+ esac
-
-- prefix=$PYTHONFRAMEWORKINSTALLDIR/Versions/$VERSION
-+fi
-
-- # Add files for Mac specific code to the list of output
-- # files:
-- ac_config_files="$ac_config_files Mac/Makefile"
-
-- ac_config_files="$ac_config_files Mac/PythonLauncher/Makefile"
-
-- ac_config_files="$ac_config_files Mac/Resources/framework/Info.plist"
-
-- ac_config_files="$ac_config_files Mac/Resources/app/Info.plist"
-
-- esac
-
--else
-
-- PYTHONFRAMEWORK=
-- PYTHONFRAMEWORKDIR=no-framework
-- PYTHONFRAMEWORKPREFIX=
-- PYTHONFRAMEWORKINSTALLDIR=
-- FRAMEWORKINSTALLFIRST=
-- FRAMEWORKINSTALLLAST=
-- FRAMEWORKALTINSTALLFIRST=
-- FRAMEWORKALTINSTALLLAST=
-- FRAMEWORKPYTHONW=
-- if test "x${prefix}" = "xNONE" ; then
-- FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
-- else
-- FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
-- fi
-- enable_framework=
-
-
--fi
-
++
+ def _java_getprop(name, default):
+ from java.lang import System
+@@ -564,7 +636,7 @@
+ if cleaned == platform:
+ break
+ platform = cleaned
+- while platform[-1] == '-':
++ while platform and platform[-1] == '-':
+ platform = platform[:-1]
-@@ -3308,21 +3562,59 @@
+ return platform
+@@ -605,7 +677,7 @@
+ default in case the command should fail.
+ """
+- if sys.platform in ('dos', 'win32', 'win16'):
++ if sys.platform in {'dos', 'win32', 'win16', 'ios', 'tvos', 'watchos'}:
+ # XXX Others too ?
+ return default
+@@ -744,6 +816,25 @@
+ csid, cpu_number = vms_lib.getsyi('SYI$_CPU', 0)
+ return 'Alpha' if cpu_number >= 128 else 'VAX'
-+cat >>confdefs.h <<_ACEOF
-+#define _PYTHONFRAMEWORK "${PYTHONFRAMEWORK}"
-+_ACEOF
++ # On the iOS/tvOS/watchOS simulator, os.uname returns the architecture as
++ # uname.machine. On device it returns the model name for some reason; but
++ # there's only one CPU architecture for devices, so we know the right
++ # answer.
++ def get_ios():
++ if sys.implementation._multiarch.endswith("simulator"):
++ return os.uname().machine
++ return 'arm64'
+
-
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-app-store-compliance" >&5
-+$as_echo_n "checking for --with-app-store-compliance... " >&6; }
++ def get_tvos():
++ if sys.implementation._multiarch.endswith("simulator"):
++ return os.uname().machine
++ return 'arm64'
+
-+# Check whether --with-app_store_compliance was given.
-+if test "${with_app_store_compliance+set}" = set; then :
-+ withval=$with_app_store_compliance;
-+ case "$withval" in
-+ yes)
-+ case $ac_sys_system in
-+ Darwin|iOS|tvOS|watchOS)
-+ # iOS/tvOS/watchOS is able to share the macOS patch
-+ APP_STORE_COMPLIANCE_PATCH="Mac/Resources/app-store-compliance.patch"
-+ ;;
-+ *) as_fn_error $? "no default app store compliance patch available for $ac_sys_system" "$LINENO" 5 ;;
-+ esac
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: applying default app store compliance patch" >&5
-+$as_echo "applying default app store compliance patch" >&6; }
-+ ;;
-+ *)
-+ APP_STORE_COMPLIANCE_PATCH="${withval}"
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: applying custom app store compliance patch" >&5
-+$as_echo "applying custom app store compliance patch" >&6; }
-+ ;;
-+ esac
-
-+else
-
-+ case $ac_sys_system in
-+ iOS|tvOS|watchOS)
-+ # Always apply the compliance patch on iOS/tvOS/watchOS; we can use the macOS patch
-+ APP_STORE_COMPLIANCE_PATCH="Mac/Resources/app-store-compliance.patch"
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: applying default app store compliance patch" >&5
-+$as_echo "applying default app store compliance patch" >&6; }
-+ ;;
-+ *)
-+ # No default app compliance patching on any other platform
-+ APP_STORE_COMPLIANCE_PATCH=
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not patching for app store compliance" >&5
-+$as_echo "not patching for app store compliance" >&6; }
-+ ;;
-+ esac
++ def get_watchos():
++ if sys.implementation._multiarch.endswith("simulator"):
++ return os.uname().machine
++ return 'arm64_32'
++
+ def from_subprocess():
+ """
+ Fall back to `uname -p`
+@@ -893,6 +984,14 @@
+ system = 'Windows'
+ release = 'Vista'
+
++ # Normalize responses on Apple mobile platforms
++ if sys.platform == 'ios':
++ system, release, _, _ = ios_ver()
++ if sys.platform == 'tvos':
++ system, release, _, _ = tvos_ver()
++ if sys.platform == 'watchos':
++ system, release, _, _ = watchos_ver()
+
-+fi
+ vals = system, node, release, version, machine
+ # Replace 'unknown' values with the more portable ''
+ _uname_cache = uname_result(*map(_unknown_as_blank, vals))
+@@ -1205,11 +1304,18 @@
+ system, release, version = system_alias(system, release, version)
+ if system == 'Darwin':
+- # macOS (darwin kernel)
+- macos_release = mac_ver()[0]
+- if macos_release:
+- system = 'macOS'
+- release = macos_release
++ # macOS and iOS both report as a "Darwin" kernel
++ if sys.platform == "ios":
++ system, release, _, _ = ios_ver()
++ elif sys.platform == "tvos":
++ system, release, _, _ = tvos_ver()
++ elif sys.platform == "watchos":
++ system, release, _, _ = watchos_ver()
++ else:
++ macos_release = mac_ver()[0]
++ if macos_release:
++ system = 'macOS'
++ release = macos_release
+ if system == 'Windows':
+ # MS platforms
+diff --git a/Lib/site.py b/Lib/site.py
+index 5302037e0bf..35bf9b03d35 100644
+--- a/Lib/site.py
++++ b/Lib/site.py
+@@ -276,8 +276,8 @@
+ if env_base:
+ return env_base
--cat >>confdefs.h <<_ACEOF
--#define _PYTHONFRAMEWORK "${PYTHONFRAMEWORK}"
--_ACEOF
+- # VxWorks has no home directories
+- if sys.platform == "vxworks":
++ # iOS, tvOS, VxWorks and watchOS have no home directories
++ if sys.platform in {"ios", "tvos", "vxworks", "watchos"}:
+ return None
+ def joinuser(*args):
+diff --git a/Lib/sqlite3/test/dbapi.py b/Lib/sqlite3/test/dbapi.py
+index a764c82b0d3..8b23cd3f733 100644
+--- a/Lib/sqlite3/test/dbapi.py
++++ b/Lib/sqlite3/test/dbapi.py
+@@ -26,7 +26,7 @@
+ import sqlite3 as sqlite
+ import sys
--##AC_ARG_WITH(dyld,
--## AS_HELP_STRING([--with-dyld],
--## [use (OpenStep|Rhapsody) dynamic linker]))
--##
- # Set name for machine-dependent library files
+-from test.support import check_disallow_instantiation, SHORT_TIMEOUT
++from test.support import check_disallow_instantiation, SHORT_TIMEOUT, is_apple, requires_subprocess
+ from test.support.os_helper import TESTFN, unlink
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking MACHDEP" >&5
-@@ -3347,6 +3639,12 @@
- *-*-vxworks*)
- ac_sys_system=VxWorks
- ;;
-+ *-*-emscripten)
-+ ac_sys_system=Emscripten
-+ ;;
-+ *-*-wasi)
-+ ac_sys_system=WASI
-+ ;;
- *)
- # for now, limit cross builds to known configurations
- MACHDEP="unknown"
-@@ -3375,34 +3673,110 @@
- darwin*) MACHDEP="darwin";;
- '') MACHDEP="unknown";;
- esac
-+
-+ if test "$ac_sys_system" = "SunOS"; then
-+ # For Solaris, there isn't an OS version specific macro defined
-+ # in most compilers, so we define one here.
-+ SUNOS_VERSION=`echo $ac_sys_release | sed -e 's!\.\(0-9\)$!.0\1!g' | tr -d '.'`
-+
-+cat >>confdefs.h <<_ACEOF
-+#define Py_SUNOS_VERSION $SUNOS_VERSION
-+_ACEOF
-+
-+ fi
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$MACHDEP\"" >&5
- $as_echo "\"$MACHDEP\"" >&6; }
--
- if test "$cross_compiling" = yes; then
- case "$host" in
- *-*-linux*)
- case "$host_cpu" in
- arm*)
-- _host_cpu=arm
-+ _host_ident=arm
- ;;
- *)
-- _host_cpu=$host_cpu
-+ _host_ident=$host_cpu
- esac
- ;;
- *-*-cygwin*)
-- _host_cpu=
-+ _host_ident=
-+ ;;
-+ *-apple-ios*)
-+ _host_os=`echo $host | cut -d '-' -f3`
-+ _host_device=`echo $host | cut -d '-' -f4`
-+ _host_device=${_host_device:=os}
-+
-+ # IPHONEOS_DEPLOYMENT_TARGET is the minimum supported iOS version
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking iOS deployment target" >&5
-+$as_echo_n "checking iOS deployment target... " >&6; }
-+ IPHONEOS_DEPLOYMENT_TARGET=${_host_os:3}
-+ IPHONEOS_DEPLOYMENT_TARGET=${IPHONEOS_DEPLOYMENT_TARGET:=13.0}
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $IPHONEOS_DEPLOYMENT_TARGET" >&5
-+$as_echo "$IPHONEOS_DEPLOYMENT_TARGET" >&6; }
-+
-+ case "$host_cpu" in
-+ aarch64)
-+ _host_ident=${IPHONEOS_DEPLOYMENT_TARGET}-arm64-iphone${_host_device}
-+ ;;
-+ *)
-+ _host_ident=${IPHONEOS_DEPLOYMENT_TARGET}-$host_cpu-iphone${_host_device}
-+ ;;
-+ esac
-+ ;;
-+ *-apple-tvos*)
-+ _host_os=`echo $host | cut -d '-' -f3`
-+ _host_device=`echo $host | cut -d '-' -f4`
-+ _host_device=${_host_device:=os}
-+
-+ # TVOS_DEPLOYMENT_TARGET is the minimum supported tvOS version
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking tvOS deployment target" >&5
-+$as_echo_n "checking tvOS deployment target... " >&6; }
-+ TVOS_DEPLOYMENT_TARGET=${_host_os:4}
-+ TVOS_DEPLOYMENT_TARGET=${TVOS_DEPLOYMENT_TARGET:=12.0}
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TVOS_DEPLOYMENT_TARGET" >&5
-+$as_echo "$TVOS_DEPLOYMENT_TARGET" >&6; }
-+
-+ case "$host_cpu" in
-+ aarch64)
-+ _host_ident=${TVOS_DEPLOYMENT_TARGET}-arm64-appletv${_host_device}
-+ ;;
-+ *)
-+ _host_ident=${TVOS_DEPLOYMENT_TARGET}-$host_cpu-appletv${_host_device}
-+ ;;
-+ esac
-+ ;;
-+ *-apple-watchos*)
-+ _host_os=`echo $host | cut -d '-' -f3`
-+ _host_device=`echo $host | cut -d '-' -f4`
-+ _host_device=${_host_device:=os}
-+
-+ # WATCHOS_DEPLOYMENT_TARGET is the minimum supported watchOS version
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking watchOS deployment target" >&5
-+$as_echo_n "checking watchOS deployment target... " >&6; }
-+ WATCHOS_DEPLOYMENT_TARGET=${_host_os:7}
-+ WATCHOS_DEPLOYMENT_TARGET=${WATCHOS_DEPLOYMENT_TARGET:=4.0}
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WATCHOS_DEPLOYMENT_TARGET" >&5
-+$as_echo "$WATCHOS_DEPLOYMENT_TARGET" >&6; }
-+
-+ case "$host_cpu" in
-+ aarch64)
-+ _host_ident=${WATCHOS_DEPLOYMENT_TARGET}-arm64-watch${_host_device}
-+ ;;
-+ *)
-+ _host_ident=${WATCHOS_DEPLOYMENT_TARGET}-$host_cpu-watch${_host_device}
-+ ;;
-+ esac
- ;;
- *-*-vxworks*)
-- _host_cpu=$host_cpu
-+ _host_ident=$host_cpu
- ;;
- *)
- # for now, limit cross builds to known configurations
- MACHDEP="unknown"
- as_fn_error $? "cross build not supported for $host" "$LINENO" 5
- esac
-- _PYTHON_HOST_PLATFORM="$MACHDEP${_host_cpu:+-$_host_cpu}"
-+ _PYTHON_HOST_PLATFORM="$MACHDEP${_host_ident:+-$_host_ident}"
- fi
+@@ -87,7 +87,7 @@
- # Some systems cannot stand _XOPEN_SOURCE being defined at all; they
-@@ -3469,6 +3843,13 @@
- define_xopen_source=no;;
- Darwin/[12][0-9].*)
- define_xopen_source=no;;
-+ # On iOS/tvOS/watchOS, defining _POSIX_C_SOURCE also disables platform specific features.
-+ iOS/*)
-+ define_xopen_source=no;;
-+ tvOS/*)
-+ define_xopen_source=no;;
-+ watchOS/*)
-+ define_xopen_source=no;;
- # On QNX 6.3.2, defining _XOPEN_SOURCE prevents netdb.h from
- # defining NI_NUMERICHOST.
- QNX/6.3.2)
-@@ -3531,6 +3912,12 @@
- CONFIGURE_MACOSX_DEPLOYMENT_TARGET=
- EXPORT_MACOSX_DEPLOYMENT_TARGET='#'
+ # sqlite3_enable_shared_cache() is deprecated on macOS and calling it may raise
+ # OperationalError on some buildbots.
+- @unittest.skipIf(sys.platform == "darwin", "shared cache is deprecated on macOS")
++ @unittest.skipIf(is_apple, "shared cache is deprecated on Apple platforms")
+ def test_shared_cache_deprecated(self):
+ for enable in (True, False):
+ with self.assertWarns(DeprecationWarning) as cm:
+@@ -976,6 +976,7 @@
+ def tearDown(self):
+ unlink(TESTFN)
-+# Record the value of IPHONEOS_DEPLOYMENT_TARGET / TVOS_DEPLOYMENT_TARGET /
-+# WATCHOS_DEPLOYMENT_TARGET enforced by the selected host triple.
-+
++ @requires_subprocess()
+ def test_ctx_mgr_rollback_if_commit_failed(self):
+ # bpo-27334: ctx manager does not rollback if commit fails
+ SCRIPT = f"""if 1:
+diff --git a/Lib/subprocess.py b/Lib/subprocess.py
+index f1e3d64dfe0..bd82a633158 100644
+--- a/Lib/subprocess.py
++++ b/Lib/subprocess.py
+@@ -65,16 +65,19 @@
+ # NOTE: We intentionally exclude list2cmdline as it is
+ # considered an internal implementation detail. issue10838.
+
++# use presence of msvcrt to detect Windows-like platforms (see bpo-8110)
+ try:
+ import msvcrt
+- import _winapi
+- _mswindows = True
+ except ModuleNotFoundError:
+ _mswindows = False
+- import _posixsubprocess
+- import select
+- import selectors
+ else:
++ _mswindows = True
+
++# some platforms do not support subprocesses
++_can_fork_exec = sys.platform not in {"ios", "tvos", "watchos"}
+
++if _mswindows:
++ import _winapi
+ from _winapi import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP,
+ STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
+ STD_ERROR_HANDLE, SW_HIDE,
+@@ -95,6 +98,12 @@
+ "NORMAL_PRIORITY_CLASS", "REALTIME_PRIORITY_CLASS",
+ "CREATE_NO_WINDOW", "DETACHED_PROCESS",
+ "CREATE_DEFAULT_ERROR_MODE", "CREATE_BREAKAWAY_FROM_JOB"])
++else:
++ if _can_fork_exec:
++ import _posixsubprocess
+
- # checks for alternative programs
++ import select
++ import selectors
- # compiler flags are generated in two sets, BASECFLAGS and OPT. OPT is just
-@@ -3553,6 +3940,26 @@
- CFLAGS=
- fi
-+case $ac_sys_system in #(
-+ iOS) :
-+
-+ as_fn_append CFLAGS " -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET}"
-+ as_fn_append LDFLAGS " -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET}"
-+ ;; #(
-+ tvOS) :
+ # Exception classes used by this module.
+@@ -764,6 +773,11 @@
+ pass_fds=(), *, user=None, group=None, extra_groups=None,
+ encoding=None, errors=None, text=None, umask=-1, pipesize=-1):
+ """Create new Popen instance."""
++ if not _can_fork_exec:
++ raise OSError(
++ errno.ENOTSUP, f"{sys.platform} does not support processes."
++ )
+
-+ as_fn_append CFLAGS " -mtvos-version-min=${TVOS_DEPLOYMENT_TARGET}"
-+ as_fn_append LDFLAGS " -mtvos-version-min=${TVOS_DEPLOYMENT_TARGET}"
-+ ;; #(
-+ watchOS) :
+ _cleanup()
+ # Held while anything is calling waitpid before returncode has been
+ # updated to prevent clobbering returncode if wait() or poll() are
+diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
+index daf9f000060..5ddead7bbc6 100644
+--- a/Lib/sysconfig.py
++++ b/Lib/sysconfig.py
+@@ -20,6 +20,7 @@
+
+ # Keys for get_config_var() that are never converted to Python integers.
+ _ALWAYS_STR = {
++ 'IPHONEOS_DEPLOYMENT_TARGET',
+ 'MACOSX_DEPLOYMENT_TARGET',
+ }
+
+@@ -56,6 +57,46 @@
+ 'scripts': '{base}/Scripts',
+ 'data': '{base}',
+ },
+
-+ as_fn_append CFLAGS " -mwatchos-version-min=${WATCHOS_DEPLOYMENT_TARGET}"
-+ as_fn_append LDFLAGS " -mwatchos-version-min=${WATCHOS_DEPLOYMENT_TARGET}"
-+ ;; #(
-+ *) :
-+ ;;
-+esac
++ # Downstream distributors can overwrite the default install scheme.
++ # This is done to support downstream modifications where distributors change
++ # the installation layout (eg. different site-packages directory).
++ # So, distributors will change the default scheme to one that correctly
++ # represents their layout.
++ # This presents an issue for projects/people that need to bootstrap virtual
++ # environments, like virtualenv. As distributors might now be customizing
++ # the default install scheme, there is no guarantee that the information
++ # returned by sysconfig.get_default_scheme/get_paths is correct for
++ # a virtual environment, the only guarantee we have is that it is correct
++ # for the *current* environment. When bootstrapping a virtual environment,
++ # we need to know its layout, so that we can place the files in the
++ # correct locations.
++ # The "*_venv" install scheme is a scheme to bootstrap virtual environments,
++ # essentially identical to the default posix_prefix/nt schemes.
++ # Downstream distributors who patch posix_prefix/nt scheme are encouraged to
++ # leave the following schemes unchanged
++ 'posix_venv': {
++ 'stdlib': '{installed_base}/{platlibdir}/python{py_version_short}',
++ 'platstdlib': '{platbase}/{platlibdir}/python{py_version_short}',
++ 'purelib': '{base}/lib/python{py_version_short}/site-packages',
++ 'platlib': '{platbase}/{platlibdir}/python{py_version_short}/site-packages',
++ 'include':
++ '{installed_base}/include/python{py_version_short}{abiflags}',
++ 'platinclude':
++ '{installed_platbase}/include/python{py_version_short}{abiflags}',
++ 'scripts': '{base}/bin',
++ 'data': '{base}',
++ },
++ 'nt_venv': {
++ 'stdlib': '{installed_base}/Lib',
++ 'platstdlib': '{base}/Lib',
++ 'purelib': '{base}/Lib/site-packages',
++ 'platlib': '{base}/Lib/site-packages',
++ 'include': '{installed_base}/Include',
++ 'platinclude': '{installed_base}/Include',
++ 'scripts': '{base}/Scripts',
++ 'data': '{base}',
++ },
+ }
+
+
+@@ -66,8 +107,8 @@
+ if env_base:
+ return env_base
+
+- # VxWorks has no home directories
+- if sys.platform == "vxworks":
++ # iOS, tvOS, VxWorks and watchOS have no home directories
++ if sys.platform in {"ios", "tvos", "vxworks", "watchos"}:
+ return None
+
+ def joinuser(*args):
+@@ -237,6 +278,7 @@
+ 'home': 'posix_home',
+ 'user': 'osx_framework_user',
+ }
+
- if test "$ac_sys_system" = "Darwin"
- then
- # Compiler selection on MacOSX is more complicated than
-@@ -5365,7 +5772,42 @@
- #elif defined(__gnu_hurd__)
- i386-gnu
- #elif defined(__APPLE__)
-+# include "TargetConditionals.h"
-+# if TARGET_OS_IOS
-+# if TARGET_OS_SIMULATOR
-+# if __x86_64__
-+ x86_64-iphonesimulator
-+# else
-+ arm64-iphonesimulator
-+# endif
-+# else
-+ arm64-iphoneos
-+# endif
-+# elif TARGET_OS_TV
-+# if TARGET_OS_SIMULATOR
-+# if __x86_64__
-+ x86_64-appletvsimulator
-+# else
-+ arm64-appletvsimulator
-+# endif
-+# else
-+ arm64-appletvos
-+# endif
-+# elif TARGET_OS_WATCH
-+# if TARGET_OS_SIMULATOR
-+# if __x86_64__
-+ x86_64-watchsimulator
-+# else
-+ arm64-watchsimulator
-+# endif
-+# else
-+ arm64_32-watchos
-+# endif
-+# elif TARGET_OS_OSX
- darwin
-+# else
-+# error unknown Apple platform
-+# endif
- #elif defined(__VXWORKS__)
- vxworks
- #else
-@@ -5389,6 +5831,12 @@
- case $ac_sys_system in #(
- Darwin*) :
- MULTIARCH="" ;; #(
-+ iOS) :
-+ MULTIARCH="" ;; #(
-+ tvOS) :
-+ MULTIARCH="" ;; #(
-+ watchOS) :
-+ MULTIARCH="" ;; #(
- FreeBSD*) :
- MULTIARCH="" ;; #(
- *) :
-@@ -5396,8 +5844,6 @@
- ;;
- esac
+ return {
+ 'prefix': 'posix_prefix',
+ 'home': 'posix_home',
+@@ -740,10 +782,23 @@
+ if m:
+ release = m.group()
+ elif osname[:6] == "darwin":
+- import _osx_support
+- osname, release, machine = _osx_support.get_platform_osx(
+- get_config_vars(),
+- osname, release, machine)
++ if sys.platform == "ios":
++ release = get_config_vars().get("IPHONEOS_DEPLOYMENT_TARGET", "13.0")
++ osname = sys.platform
++ machine = sys.implementation._multiarch
++ elif sys.platform == "tvos":
++ release = get_config_vars().get("TVOS_DEPLOYMENT_TARGET", "9.0")
++ osname = sys.platform
++ machine = sys.implementation._multiarch
++ elif sys.platform == "watchos":
++ release = get_config_vars().get("WATCHOS_DEPLOYMENT_TARGET", "4.0")
++ osname = sys.platform
++ machine = sys.implementation._multiarch
++ else:
++ import _osx_support
++ osname, release, machine = _osx_support.get_platform_osx(
++ get_config_vars(),
++ osname, release, machine)
+
+ return f"{osname}-{release}-{machine}"
+
+diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py
+index f474a756b33..21e792a8642 100644
+--- a/Lib/test/datetimetester.py
++++ b/Lib/test/datetimetester.py
+@@ -5908,6 +5908,8 @@
+ ldt = tz.fromutc(udt.replace(tzinfo=tz))
+ self.assertEqual(ldt.fold, 0)
+
++ @unittest.skipIf(support.is_apple_mobile,
++ "FIXME: Edge case in timezone handling")
+ def test_system_transitions(self):
+ if ('Riyadh8' in self.zonename or
+ # From tzdata NEWS file:
+diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py
+index 400a3db5de4..049afff1a75 100644
+--- a/Lib/test/libregrtest/main.py
++++ b/Lib/test/libregrtest/main.py
+@@ -676,7 +676,8 @@
+ except SystemExit as exc:
+ # bpo-38203: Python can hang at exit in Py_Finalize(), especially
+ # on threading._shutdown() call: put a timeout
+- faulthandler.dump_traceback_later(EXIT_TIMEOUT, exit=True)
++ if self.ns.timeout is not None:
++ faulthandler.dump_traceback_later(EXIT_TIMEOUT, exit=True)
+
+ sys.exit(exc.code)
+
+diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py
+index eef34f08121..22115948788 100644
+--- a/Lib/test/pythoninfo.py
++++ b/Lib/test/pythoninfo.py
+@@ -267,6 +267,7 @@
+ "HOMEDRIVE",
+ "HOMEPATH",
+ "IDLESTARTUP",
++ "IPHONEOS_DEPLOYMENT_TARGET",
+ "LANG",
+ "LDFLAGS",
+ "LDSHARED",
+diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
+index 0d3b9634f10..ff1dd87ed57 100644
+--- a/Lib/test/support/__init__.py
++++ b/Lib/test/support/__init__.py
+@@ -43,7 +43,7 @@
+ "check__all__", "skip_if_buggy_ucrt_strfptime",
+ "check_disallow_instantiation", "check_sanitizer", "skip_if_sanitizer",
+ # sys
+- "is_jython", "is_android", "check_impl_detail", "unix_shell",
++ "is_jython", "is_android", "is_apple_mobile", "check_impl_detail", "unix_shell",
+ "setswitchinterval",
+ # network
+ "open_urlresource",
+@@ -55,6 +55,7 @@
+ "run_with_tz", "PGO", "missing_compiler_executable",
+ "ALWAYS_EQ", "NEVER_EQ", "LARGEST", "SMALLEST",
+ "LOOPBACK_TIMEOUT", "INTERNET_TIMEOUT", "SHORT_TIMEOUT", "LONG_TIMEOUT",
++ "on_github_actions"
+ ]
+
+
+@@ -479,11 +480,27 @@
+
+ is_android = hasattr(sys, 'getandroidapilevel')
+
+-if sys.platform not in ('win32', 'vxworks'):
++if sys.platform not in {"win32", "vxworks", "ios", "tvos", "watchos"}:
+ unix_shell = '/system/bin/sh' if is_android else '/bin/sh'
+ else:
+ unix_shell = None
--{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MULTIARCH" >&5
--$as_echo "$MULTIARCH" >&6; }
++# Apple mobile platforms (iOS/tvOS/watchOS) are POSIX-like but do not
++# have subprocess or fork support.
++is_apple_mobile = sys.platform in {"ios", "tvos", "watchos"}
++is_apple = is_apple_mobile or sys.platform == "darwin"
++
++has_fork_support = hasattr(os, "fork") and not is_apple_mobile
++
++def requires_fork():
++ return unittest.skipUnless(has_fork_support, "requires working os.fork()")
++
++has_subprocess_support = not is_apple_mobile
++
++def requires_subprocess():
++ """Used for subprocess, os.spawn calls, fd inheritance"""
++ return unittest.skipUnless(has_subprocess_support, "requires subprocess support")
++
+ # Define the URL of a dedicated HTTP server for the network tests.
+ # The URL must use clear-text HTTP: no redirection to encrypted HTTPS.
+ TEST_HTTP_URL = "http://www.pythontest.net"
+@@ -1033,6 +1050,9 @@
+ return no_tracing(cpython_only(test))
- if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then
- if test x$PLATFORM_TRIPLET != x$MULTIARCH; then
-@@ -5407,6 +5853,16 @@
- MULTIARCH=$PLATFORM_TRIPLET
- fi
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MULTIARCH" >&5
-+$as_echo "$MULTIARCH" >&6; }
++on_github_actions = "GITHUB_ACTIONS" in os.environ
+
-+case $ac_sys_system in #(
-+ iOS|tvOS|watchOS) :
-+ SOABI_PLATFORM=`echo "$PLATFORM_TRIPLET" | cut -d '-' -f2` ;; #(
-+ *) :
-+ SOABI_PLATFORM=$PLATFORM_TRIPLET
-+ ;;
-+esac
++
+ def _filter_suite(suite, pred):
+ """Recursively filter test cases in a suite based on a predicate."""
+ newtests = []
+@@ -1463,6 +1483,7 @@
+ if verbose:
+ print("failed to clean up {}: {}".format(link, ex))
- if test x$MULTIARCH != x; then
- MULTIARCH_CPPFLAGS="-DMULTIARCH=\\\"$MULTIARCH\\\""
-@@ -5953,17 +6409,25 @@
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking LDLIBRARY" >&5
- $as_echo_n "checking LDLIBRARY... " >&6; }
++ @requires_subprocess()
+ def _call(self, python, args, env, returncode):
+ import subprocess
+ cmd = [python, *args]
+diff --git a/Lib/test/support/os_helper.py b/Lib/test/support/os_helper.py
+index 82a6de789c8..78b61e13dd1 100644
+--- a/Lib/test/support/os_helper.py
++++ b/Lib/test/support/os_helper.py
+@@ -9,6 +9,8 @@
+ import unittest
+ import warnings
--# MacOSX framework builds need more magic. LDLIBRARY is the dynamic
-+# Apple framework builds need more magic. LDLIBRARY is the dynamic
- # library that we build, but we do not want to link against it (we
- # will find it with a -framework option). For this reason there is an
- # extra variable BLDLIBRARY against which Python and the extension
- # modules are linked, BLDLIBRARY. This is normally the same as
--# LDLIBRARY, but empty for MacOSX framework builds.
-+# LDLIBRARY, but empty for MacOSX framework builds. iOS does the same,
-+# but uses a non-versioned framework layout.
- if test "$enable_framework"
- then
-- LDLIBRARY='$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
-- RUNSHARED=DYLD_FRAMEWORK_PATH=`pwd`${DYLD_FRAMEWORK_PATH:+:${DYLD_FRAMEWORK_PATH}}
-+ case $ac_sys_system in
-+ Darwin)
-+ LDLIBRARY='$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)';;
-+ iOS|tvOS|watchOS)
-+ LDLIBRARY='$(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK)';;
-+ *)
-+ as_fn_error $? "Unknown platform for framework build" "$LINENO" 5;;
-+ esac
- BLDLIBRARY=''
-+ RUNSHARED=DYLD_FRAMEWORK_PATH=`pwd`${DYLD_FRAMEWORK_PATH:+:${DYLD_FRAMEWORK_PATH}}
- else
- BLDLIBRARY='$(LDLIBRARY)'
- fi
-@@ -5976,64 +6440,67 @@
++from test import support
++
- case $ac_sys_system in
- CYGWIN*)
-- LDLIBRARY='libpython$(LDVERSION).dll.a'
-- DLLLIBRARY='libpython$(LDVERSION).dll'
-- ;;
-+ LDLIBRARY='libpython$(LDVERSION).dll.a'
-+ DLLLIBRARY='libpython$(LDVERSION).dll'
-+ ;;
- SunOS*)
-- LDLIBRARY='libpython$(LDVERSION).so'
-- BLDLIBRARY='-Wl,-R,$(LIBDIR) -L. -lpython$(LDVERSION)'
-- RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
-- INSTSONAME="$LDLIBRARY".$SOVERSION
-- if test "$with_pydebug" != yes
-- then
-- PY3LIBRARY=libpython3.so
-- fi
-- ;;
-+ LDLIBRARY='libpython$(LDVERSION).so'
-+ BLDLIBRARY='-Wl,-R,$(LIBDIR) -L. -lpython$(LDVERSION)'
-+ RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
-+ INSTSONAME="$LDLIBRARY".$SOVERSION
-+ if test "$with_pydebug" != yes
-+ then
-+ PY3LIBRARY=libpython3.so
-+ fi
-+ ;;
- Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|OpenBSD*|VxWorks*)
-- LDLIBRARY='libpython$(LDVERSION).so'
-- BLDLIBRARY='-L. -lpython$(LDVERSION)'
-- RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
-- INSTSONAME="$LDLIBRARY".$SOVERSION
-- if test "$with_pydebug" != yes
-- then
-- PY3LIBRARY=libpython3.so
-- fi
-- ;;
-+ LDLIBRARY='libpython$(LDVERSION).so'
-+ BLDLIBRARY='-L. -lpython$(LDVERSION)'
-+ RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
-+ INSTSONAME="$LDLIBRARY".$SOVERSION
-+ if test "$with_pydebug" != yes
-+ then
-+ PY3LIBRARY=libpython3.so
-+ fi
-+ ;;
- hp*|HP*)
-- case `uname -m` in
-- ia64)
-- LDLIBRARY='libpython$(LDVERSION).so'
-- ;;
-- *)
-- LDLIBRARY='libpython$(LDVERSION).sl'
-- ;;
-- esac
-- BLDLIBRARY='-Wl,+b,$(LIBDIR) -L. -lpython$(LDVERSION)'
-- RUNSHARED=SHLIB_PATH=`pwd`${SHLIB_PATH:+:${SHLIB_PATH}}
-- ;;
-+ case `uname -m` in
-+ ia64)
-+ LDLIBRARY='libpython$(LDVERSION).so'
-+ ;;
-+ *)
-+ LDLIBRARY='libpython$(LDVERSION).sl'
-+ ;;
-+ esac
-+ BLDLIBRARY='-Wl,+b,$(LIBDIR) -L. -lpython$(LDVERSION)'
-+ RUNSHARED=SHLIB_PATH=`pwd`${SHLIB_PATH:+:${SHLIB_PATH}}
-+ ;;
- Darwin*)
-- LDLIBRARY='libpython$(LDVERSION).dylib'
-- BLDLIBRARY='-L. -lpython$(LDVERSION)'
-- RUNSHARED=DYLD_LIBRARY_PATH=`pwd`${DYLD_LIBRARY_PATH:+:${DYLD_LIBRARY_PATH}}
-- ;;
-+ LDLIBRARY='libpython$(LDVERSION).dylib'
-+ BLDLIBRARY='-L. -lpython$(LDVERSION)'
-+ RUNSHARED=DYLD_LIBRARY_PATH=`pwd`${DYLD_LIBRARY_PATH:+:${DYLD_LIBRARY_PATH}}
-+ ;;
-+ iOS|tvOS|watchOS)
-+ LDLIBRARY='libpython$(LDVERSION).dylib'
-+ ;;
- AIX*)
-- LDLIBRARY='libpython$(LDVERSION).so'
-- RUNSHARED=LIBPATH=`pwd`${LIBPATH:+:${LIBPATH}}
-- ;;
-+ LDLIBRARY='libpython$(LDVERSION).so'
-+ RUNSHARED=LIBPATH=`pwd`${LIBPATH:+:${LIBPATH}}
-+ ;;
+ # Filename used for testing
+ if os.name == 'java':
+@@ -23,8 +25,8 @@
- esac
- else # shared is disabled
- PY_ENABLE_SHARED=0
- case $ac_sys_system in
- CYGWIN*)
-- BLDLIBRARY='$(LIBRARY)'
-- LDLIBRARY='libpython$(LDVERSION).dll.a'
-- ;;
-+ BLDLIBRARY='$(LIBRARY)'
-+ LDLIBRARY='libpython$(LDVERSION).dll.a'
-+ ;;
- esac
- fi
+ # TESTFN_UNICODE is a non-ascii filename
+ TESTFN_UNICODE = TESTFN_ASCII + "-\xe0\xf2\u0258\u0141\u011f"
+-if sys.platform == 'darwin':
+- # In Mac OS X's VFS API file names are, by definition, canonically
++if support.is_apple:
++ # On Apple's VFS API file names are, by definition, canonically
+ # decomposed Unicode, encoded using UTF-8. See QA1173:
+ # http://developer.apple.com/mac/library/qa/qa2001/qa1173.html
+ import unicodedata
+@@ -49,8 +51,8 @@
+ 'encoding (%s). Unicode filename tests may not be effective'
+ % (TESTFN_UNENCODABLE, sys.getfilesystemencoding()))
+ TESTFN_UNENCODABLE = None
+-# Mac OS X denies unencodable filenames (invalid utf-8)
+-elif sys.platform != 'darwin':
++# Apple denies unencodable filenames (invalid utf-8)
++elif not support.is_apple:
+ try:
+ # ascii and utf-8 cannot encode the byte 0xff
+ b'\xff'.decode(sys.getfilesystemencoding())
+@@ -515,7 +517,8 @@
+ if hasattr(os, 'sysconf'):
+ try:
+ MAXFD = os.sysconf("SC_OPEN_MAX")
+- except OSError:
++ except (OSError, ValueError):
++ # gh-118201: ValueError is raised intermittently on iOS
+ pass
- if test "$cross_compiling" = yes; then
-- RUNSHARED=
-+ RUNSHARED=
- fi
+ old_modes = None
+diff --git a/Lib/test/support/script_helper.py b/Lib/test/support/script_helper.py
+index 6d699c8486c..f8bc838020d 100644
+--- a/Lib/test/support/script_helper.py
++++ b/Lib/test/support/script_helper.py
+@@ -19,6 +19,7 @@
+ __cached_interp_requires_environment = None
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LDLIBRARY" >&5
-@@ -6249,11 +6716,16 @@
- fi
- if test "$cross_compiling" = yes; then
-- case "$READELF" in
-- readelf|:)
-- as_fn_error $? "readelf for the host is required for cross builds" "$LINENO" 5
-- ;;
-- esac
-+ case "$ac_sys_system" in
-+ iOS|tvOS|watchOS) ;;
-+ *)
-+ case "$READELF" in
-+ readelf|:)
-+ as_fn_error $? "readelf for the host is required for cross builds" "$LINENO" 5
-+ ;;
-+ esac
-+ ;;
-+ esac
- fi
++@support.requires_subprocess()
+ def interpreter_requires_environment():
+ """
+ Returns True if our sys.executable interpreter requires environment
+@@ -87,6 +88,7 @@
+
+
+ # Executing the interpreter in a subprocess
++@support.requires_subprocess()
+ def run_python_until_end(*args, **env_vars):
+ env_required = interpreter_requires_environment()
+ cwd = env_vars.pop('__cwd', None)
+@@ -146,6 +148,7 @@
+ return res
-@@ -9787,6 +10259,11 @@
- BLDSHARED="$LDSHARED"
- fi
- ;;
-+ iOS/*|tvOS/*|watchOS/*)
-+ LDSHARED='$(CC) -dynamiclib -F . -framework $(PYTHONFRAMEWORK)'
-+ LDCXXSHARED='$(CXX) -dynamiclib -F . -framework $(PYTHONFRAMEWORK)'
-+ BLDSHARED="$LDSHARED"
-+ ;;
- Linux*|GNU*|QNX*|VxWorks*)
- LDSHARED='$(CC) -shared'
- LDCXXSHARED='$(CXX) -shared';;
-@@ -9888,20 +10365,18 @@
- Linux-android*) LINKFORSHARED="-pie -Xlinker -export-dynamic";;
- Linux*|GNU*) LINKFORSHARED="-Xlinker -export-dynamic";;
- # -u libsys_s pulls in all symbols in libsys
-- Darwin/*)
-+ Darwin/*|iOS/*|tvOS/*|watchOS/*)
- LINKFORSHARED="$extra_undefs -framework CoreFoundation"
++@support.requires_subprocess()
+ def assert_python_ok(*args, **env_vars):
+ """
+ Assert that running the interpreter with `args` and optional environment
+@@ -160,6 +163,7 @@
+ return _assert_python(True, *args, **env_vars)
- # Issue #18075: the default maximum stack size (8MBytes) is too
- # small for the default recursion limit. Increase the stack size
- # to ensure that tests don't crash
-- stack_size="1000000" # 16 MB
-- if test "$with_ubsan" = "yes"
-- then
-- # Undefined behavior sanitizer requires an even deeper stack
-- stack_size="4000000" # 64 MB
-- fi
--
-- LINKFORSHARED="-Wl,-stack_size,$stack_size $LINKFORSHARED"
-+ stack_size="1000000" # 16 MB
-+ if test "$with_ubsan" = "yes"
-+ then
-+ # Undefined behavior sanitizer requires an even deeper stack
-+ stack_size="4000000" # 64 MB
-+ fi
++@support.requires_subprocess()
+ def assert_python_failure(*args, **env_vars):
+ """
+ Assert that running the interpreter with `args` and optional environment
+@@ -171,6 +175,7 @@
+ return _assert_python(False, *args, **env_vars)
- cat >>confdefs.h <<_ACEOF
-@@ -9909,11 +10384,17 @@
- _ACEOF
++@support.requires_subprocess()
+ def spawn_python(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw):
+ """Run a Python subprocess with the given arguments.
-- if test "$enable_framework"
-- then
-- LINKFORSHARED="$LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
-+ if test $ac_sys_system = "Darwin"; then
-+ LINKFORSHARED="-Wl,-stack_size,$stack_size $LINKFORSHARED"
-+
-+ if test "$enable_framework"; then
-+ LINKFORSHARED="$LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
-+ fi
-+ LINKFORSHARED="$LINKFORSHARED"
-+ elif test "$ac_sys_system" = "iOS" -o "$ac_sys_system" = "tvOS" -o "$ac_sys_system" = "watchOS"; then
-+ LINKFORSHARED="-Wl,-stack_size,$stack_size $LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK)'
- fi
-- LINKFORSHARED="$LINKFORSHARED";;
-+ ;;
- OpenUNIX*|UnixWare*) LINKFORSHARED="-Wl,-Bexport";;
- SCO_SV*) LINKFORSHARED="-Wl,-Bexport";;
- ReliantUNIX*) LINKFORSHARED="-W1 -Blargedynsym";;
-@@ -10796,7 +11277,7 @@
- fi
+@@ -273,6 +278,7 @@
+ return zip_name, os.path.join(zip_name, script_name_in_zip)
--if test "$ac_sys_system" = "Darwin"
-+if test "$ac_sys_system" = "Darwin" -o "$ac_sys_system" = "iOS" -o "$ac_sys_system" = "tvOS" -o "$ac_sys_system" = "watchOS"
- then
- case "$with_system_ffi" in
- "")
-@@ -10824,10 +11305,12 @@
- if test "$with_system_ffi" = "yes" && test -n "$PKG_CONFIG"; then
- LIBFFI_INCLUDEDIR="`"$PKG_CONFIG" libffi --cflags-only-I 2>/dev/null | sed -e 's/^-I//;s/ *$//'`"
- else
-- LIBFFI_INCLUDEDIR=""
-+ LIBFFI_INCLUDEDIR="${LIBFFI_INCLUDEDIR}"
- fi
++@support.requires_subprocess()
+ def run_test_script(script):
+ # use -u to try to get the full output if the test hangs or crash
+ if support.verbose:
+diff --git a/Lib/test/support/socket_helper.py b/Lib/test/support/socket_helper.py
+index 38c499bf722..8de55306053 100644
+--- a/Lib/test/support/socket_helper.py
++++ b/Lib/test/support/socket_helper.py
+@@ -1,8 +1,10 @@
+ import contextlib
+ import errno
++import os.path
+ import socket
+-import unittest
++import tempfile
+ import sys
++import unittest
+ from .. import support
+@@ -267,3 +269,14 @@
+ # __cause__ or __context__?
+ finally:
+ socket.setdefaulttimeout(old_timeout)
+
+
- # Check for use of the system libmpdec library
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-system-libmpdec" >&5
- $as_echo_n "checking for --with-system-libmpdec... " >&6; }
-@@ -11952,18 +12435,18 @@
-
- # checks for library functions
- for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \
-- clock confstr close_range copy_file_range ctermid dup3 execv explicit_bzero \
-+ clock confstr close_range copy_file_range ctermid dup3 explicit_bzero \
- explicit_memset faccessat fchmod fchmodat fchown fchownat \
-- fdwalk fexecve fdopendir fork fpathconf fstatat ftime ftruncate futimesat \
-- futimens futimes gai_strerror getentropy \
-+ fdwalk fexecve fdopendir fpathconf fstatat ftime ftruncate futimesat \
-+ futimens futimes gai_strerror \
- getgrgid_r getgrnam_r \
-- getgrouplist getgroups getlogin getloadavg getpeername getpgid getpid \
-+ getgrouplist getlogin getloadavg getpeername getpgid getpid \
- getpriority getresuid getresgid getpwent getpwnam_r getpwuid_r getspnam getspent getsid getwd \
- if_nameindex \
- initgroups kill killpg lchown lockf linkat lstat lutimes mmap \
- memrchr mbrtowc mkdirat mkfifo \
- madvise mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \
-- posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \
-+ posix_fallocate posix_fadvise pread preadv preadv2 \
- pthread_condattr_setclock pthread_init pthread_kill pwrite pwritev pwritev2 \
- readlink readlinkat readv realpath renameat \
- sem_open sem_timedwait sem_clockwait sem_getvalue sem_unlink sendfile setegid seteuid \
-@@ -11971,7 +12454,7 @@
- setlocale setregid setreuid setresuid setresgid setsid setpgid setpgrp setpriority setuid setvbuf \
- sched_get_priority_max sched_setaffinity sched_setscheduler sched_setparam \
- sched_rr_get_interval \
-- sigaction sigaltstack sigfillset siginterrupt sigpending sigrelse \
-+ sigaction sigfillset siginterrupt sigpending sigrelse \
- sigtimedwait sigwait sigwaitinfo snprintf splice strftime strlcpy strsignal symlinkat sync \
- sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \
- truncate uname unlinkat utimensat utimes vfork waitid waitpid wait3 wait4 \
-@@ -12005,6 +12488,44 @@
-
- fi
-
-+# iOS/tvOS/watchOS define some system methods that can be linked (so they are
-+# found by configure), but either raise a compilation error (because the
-+# header definition prevents usage - autoconf doesn't use the headers), or
-+# raise an error if used at runtime. Force these symbols off.
-+if test "$ac_sys_system" != "iOS" -a "$ac_sys_system" != "tvOS" -a "$ac_sys_system" != "watchOS" ; then
-+ for ac_func in getentropy getgroups system
-+do :
-+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-+ cat >>confdefs.h <<_ACEOF
-+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-+_ACEOF
++def create_unix_domain_name():
++ """
++ Create a UNIX domain name: socket.bind() argument of a AF_UNIX socket.
++
++ Return a path relative to the current directory to get a short path
++ (around 27 ASCII characters).
++ """
++ return tempfile.mktemp(prefix="test_python_", suffix='.sock',
++ dir=os.path.curdir)
+--- /dev/null
++++ b/Lib/test/test_apple.py
+@@ -0,0 +1,155 @@
++import unittest
++from _apple_support import SystemLog
++from test.support import is_apple_mobile
++from unittest.mock import Mock, call
++
++if not is_apple_mobile:
++ raise unittest.SkipTest("iOS-specific")
++
++
++# Test redirection of stdout and stderr to the Apple system log.
++class TestAppleSystemLogOutput(unittest.TestCase):
++ maxDiff = None
++
++ def assert_writes(self, output):
++ self.assertEqual(
++ self.log_write.mock_calls,
++ [
++ call(self.log_level, line)
++ for line in output
++ ]
++ )
++
++ self.log_write.reset_mock()
++
++ def setUp(self):
++ self.log_write = Mock()
++ self.log_level = 42
++ self.log = SystemLog(self.log_write, self.log_level, errors="replace")
++
++ def test_repr(self):
++ self.assertEqual(repr(self.log), "")
++ self.assertEqual(repr(self.log.buffer), "")
++
++ def test_log_config(self):
++ self.assertIs(self.log.writable(), True)
++ self.assertIs(self.log.readable(), False)
++
++ self.assertEqual("UTF-8", self.log.encoding)
++ self.assertEqual("replace", self.log.errors)
++
++ self.assertIs(self.log.line_buffering, True)
++ self.assertIs(self.log.write_through, False)
++
++ def test_empty_str(self):
++ self.log.write("")
++ self.log.flush()
++
++ self.assert_writes([])
++
++ def test_simple_str(self):
++ self.log.write("hello world\n")
++
++ self.assert_writes([b"hello world\n"])
++
++ def test_buffered_str(self):
++ self.log.write("h")
++ self.log.write("ello")
++ self.log.write(" ")
++ self.log.write("world\n")
++ self.log.write("goodbye.")
++ self.log.flush()
++
++ self.assert_writes([b"hello world\n", b"goodbye."])
++
++ def test_manual_flush(self):
++ self.log.write("Hello")
++
++ self.assert_writes([])
++
++ self.log.write(" world\nHere for a while...\nGoodbye")
++ self.assert_writes([b"Hello world\n", b"Here for a while...\n"])
++
++ self.log.write(" world\nHello again")
++ self.assert_writes([b"Goodbye world\n"])
++
++ self.log.flush()
++ self.assert_writes([b"Hello again"])
+
-+fi
-+done
++ def test_non_ascii(self):
++ # Spanish
++ self.log.write("ol\u00e9\n")
++ self.assert_writes([b"ol\xc3\xa9\n"])
+
-+fi
++ # Chinese
++ self.log.write("\u4e2d\u6587\n")
++ self.assert_writes([b"\xe4\xb8\xad\xe6\x96\x87\n"])
+
-+# tvOS/watchOS have some additional methods that can be found, but not used.
-+if test "$ac_sys_system" != "tvOS" -a "$ac_sys_system" != "watchOS" ; then
-+ for ac_func in \
-+ execv fork posix_spawn posix_spawnp \
-+ sigaltstack \
++ # Printing Non-BMP emoji
++ self.log.write("\U0001f600\n")
++ self.assert_writes([b"\xf0\x9f\x98\x80\n"])
+
-+do :
-+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-+ cat >>confdefs.h <<_ACEOF
-+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-+_ACEOF
++ # Non-encodable surrogates are replaced
++ self.log.write("\ud800\udc00\n")
++ self.assert_writes([b"??\n"])
+
-+fi
-+done
++ def test_modified_null(self):
++ # Null characters are logged using "modified UTF-8".
++ self.log.write("\u0000\n")
++ self.assert_writes([b"\xc0\x80\n"])
++ self.log.write("a\u0000\n")
++ self.assert_writes([b"a\xc0\x80\n"])
++ self.log.write("\u0000b\n")
++ self.assert_writes([b"\xc0\x80b\n"])
++ self.log.write("a\u0000b\n")
++ self.assert_writes([b"a\xc0\x80b\n"])
+
-+fi
++ def test_nonstandard_str(self):
++ # String subclasses are accepted, but they should be converted
++ # to a standard str without calling any of their methods.
++ class CustomStr(str):
++ def splitlines(self, *args, **kwargs):
++ raise AssertionError()
+
- ac_fn_c_check_decl "$LINENO" "dirfd" "ac_cv_have_decl_dirfd" "#include
- #include
- "
-@@ -12956,9 +13477,10 @@
- fi
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++ def __len__(self):
++ raise AssertionError()
++
++ def __str__(self):
++ raise AssertionError()
++
++ self.log.write(CustomStr("custom\n"))
++ self.assert_writes([b"custom\n"])
++
++ def test_non_str(self):
++ # Non-string classes are not accepted.
++ for obj in [b"", b"hello", None, 42]:
++ with self.subTest(obj=obj):
++ with self.assertRaisesRegex(
++ TypeError,
++ fr"write\(\) argument must be str, not "
++ fr"{type(obj).__name__}"
++ ):
++ self.log.write(obj)
++
++ def test_byteslike_in_buffer(self):
++ # The underlying buffer *can* accept bytes-like objects
++ self.log.buffer.write(bytearray(b"hello"))
++ self.log.flush()
++
++ self.log.buffer.write(b"")
++ self.log.flush()
++
++ self.log.buffer.write(b"goodbye")
++ self.log.flush()
++
++ self.assert_writes([b"hello", b"goodbye"])
++
++ def test_non_byteslike_in_buffer(self):
++ for obj in ["hello", None, 42]:
++ with self.subTest(obj=obj):
++ with self.assertRaisesRegex(
++ TypeError,
++ fr"write\(\) argument must be bytes-like, not "
++ fr"{type(obj).__name__}"
++ ):
++ self.log.buffer.write(obj)
+diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py
+index 253a6c119c9..1640193c798 100644
+--- a/Lib/test/test_asyncio/test_events.py
++++ b/Lib/test/test_asyncio/test_events.py
+@@ -1799,6 +1799,7 @@
+ else:
+ self.assertEqual(-signal.SIGKILL, returncode)
--# check for openpty and forkpty
--
--for ac_func in openpty
-+# check for openpty, login_tty, and forkpty
-+# tvOS/watchOS have functions for tty, but can't use them
-+if test "$ac_sys_system" != "tvOS" -a "$ac_sys_system" != "watchOS" ; then
-+ for ac_func in openpty
- do :
- ac_fn_c_check_func "$LINENO" "openpty" "ac_cv_func_openpty"
- if test "x$ac_cv_func_openpty" = xyes; then :
-@@ -13048,14 +13570,71 @@
- LIBS="$LIBS -lbsd"
- fi
++ @support.requires_subprocess()
+ def test_subprocess_exec(self):
+ prog = os.path.join(os.path.dirname(__file__), 'echo.py')
-+fi
+@@ -1820,6 +1821,7 @@
+ self.check_killed(proto.returncode)
+ self.assertEqual(b'Python The Winner', proto.data[1])
- fi
-+done
++ @support.requires_subprocess()
+ def test_subprocess_interactive(self):
+ prog = os.path.join(os.path.dirname(__file__), 'echo.py')
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing login_tty" >&5
-+$as_echo_n "checking for library containing login_tty... " >&6; }
-+if ${ac_cv_search_login_tty+:} false; then :
-+ $as_echo_n "(cached) " >&6
-+else
-+ ac_func_search_save_LIBS=$LIBS
-+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-+/* end confdefs.h. */
+@@ -1847,6 +1849,7 @@
+ self.loop.run_until_complete(proto.completed)
+ self.check_killed(proto.returncode)
-+/* Override any GCC internal prototype to avoid an error.
-+ Use char because int might match the return type of a GCC
-+ builtin and then its argument prototype would still apply. */
-+#ifdef __cplusplus
-+extern "C"
-+#endif
-+char login_tty ();
-+int
-+main ()
-+{
-+return login_tty ();
-+ ;
-+ return 0;
-+}
-+_ACEOF
-+for ac_lib in '' util; do
-+ if test -z "$ac_lib"; then
-+ ac_res="none required"
-+ else
-+ ac_res=-l$ac_lib
-+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
-+ fi
-+ if ac_fn_c_try_link "$LINENO"; then :
-+ ac_cv_search_login_tty=$ac_res
-+fi
-+rm -f core conftest.err conftest.$ac_objext \
-+ conftest$ac_exeext
-+ if ${ac_cv_search_login_tty+:} false; then :
-+ break
- fi
- done
-+if ${ac_cv_search_login_tty+:} false; then :
++ @support.requires_subprocess()
+ def test_subprocess_shell(self):
+ connect = self.loop.subprocess_shell(
+ functools.partial(MySubprocessProtocol, self.loop),
+@@ -1863,6 +1866,7 @@
+ self.assertEqual(proto.data[2], b'')
+ transp.close()
--for ac_func in forkpty
-+else
-+ ac_cv_search_login_tty=no
-+fi
-+rm conftest.$ac_ext
-+LIBS=$ac_func_search_save_LIBS
-+fi
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_login_tty" >&5
-+$as_echo "$ac_cv_search_login_tty" >&6; }
-+ac_res=$ac_cv_search_login_tty
-+if test "$ac_res" != no; then :
-+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-+
-+$as_echo "#define HAVE_LOGIN_TTY 1" >>confdefs.h
-+
-+
-+fi
-+
-+ for ac_func in forkpty
- do :
- ac_fn_c_check_func "$LINENO" "forkpty" "ac_cv_func_forkpty"
- if test "x$ac_cv_func_forkpty" = xyes; then :
-@@ -13145,13 +13724,12 @@
- LIBS="$LIBS -lbsd"
- fi
++ @support.requires_subprocess()
+ def test_subprocess_exitcode(self):
+ connect = self.loop.subprocess_shell(
+ functools.partial(MySubprocessProtocol, self.loop),
+@@ -1874,6 +1878,7 @@
+ self.assertEqual(7, proto.returncode)
+ transp.close()
--
- fi
++ @support.requires_subprocess()
+ def test_subprocess_close_after_finish(self):
+ connect = self.loop.subprocess_shell(
+ functools.partial(MySubprocessProtocol, self.loop),
+@@ -1888,6 +1893,7 @@
+ self.assertEqual(7, proto.returncode)
+ self.assertIsNone(transp.close())
--
- fi
- done
++ @support.requires_subprocess()
+ def test_subprocess_kill(self):
+ prog = os.path.join(os.path.dirname(__file__), 'echo.py')
-+fi
+@@ -1904,6 +1910,7 @@
+ self.check_killed(proto.returncode)
+ transp.close()
- # check for long file support functions
- for ac_func in fseek64 fseeko fstatvfs ftell64 ftello statvfs
-@@ -13502,7 +14080,12 @@
- done
++ @support.requires_subprocess()
+ def test_subprocess_terminate(self):
+ prog = os.path.join(os.path.dirname(__file__), 'echo.py')
+
+@@ -1921,6 +1928,7 @@
+ transp.close()
+
+ @unittest.skipIf(sys.platform == 'win32', "Don't have SIGHUP")
++ @support.requires_subprocess()
+ def test_subprocess_send_signal(self):
+ # bpo-31034: Make sure that we get the default signal handler (killing
+ # the process). The parent process may have decided to ignore SIGHUP,
+@@ -1945,6 +1953,7 @@
+ finally:
+ signal.signal(signal.SIGHUP, old_handler)
+
++ @support.requires_subprocess()
+ def test_subprocess_stderr(self):
+ prog = os.path.join(os.path.dirname(__file__), 'echo2.py')
+
+@@ -1966,6 +1975,7 @@
+ self.assertTrue(proto.data[2].startswith(b'ERR:test'), proto.data[2])
+ self.assertEqual(0, proto.returncode)
++ @support.requires_subprocess()
+ def test_subprocess_stderr_redirect_to_stdout(self):
+ prog = os.path.join(os.path.dirname(__file__), 'echo2.py')
--for ac_func in clock_settime
-+# On iOS, tvOS and watchOS, clock_settime can be linked (so it is found by
-+# configure), but when used in an unprivileged process, it crashes rather than
-+# returning an error. Force the symbol off.
-+if test "$ac_sys_system" != "iOS" -a "$ac_sys_system" != "tvOS" -a "$ac_sys_system" != "watchOS"
-+then
-+ for ac_func in clock_settime
- do :
- ac_fn_c_check_func "$LINENO" "clock_settime" "ac_cv_func_clock_settime"
- if test "x$ac_cv_func_clock_settime" = xyes; then :
-@@ -13512,7 +14095,7 @@
+@@ -1991,6 +2001,7 @@
+ transp.close()
+ self.assertEqual(0, proto.returncode)
- else
++ @support.requires_subprocess()
+ def test_subprocess_close_client_stream(self):
+ prog = os.path.join(os.path.dirname(__file__), 'echo3.py')
-- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_settime in -lrt" >&5
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_settime in -lrt" >&5
- $as_echo_n "checking for clock_settime in -lrt... " >&6; }
- if ${ac_cv_lib_rt_clock_settime+:} false; then :
- $as_echo_n "(cached) " >&6
-@@ -13550,7 +14133,7 @@
- $as_echo "$ac_cv_lib_rt_clock_settime" >&6; }
- if test "x$ac_cv_lib_rt_clock_settime" = xyes; then :
+@@ -2025,6 +2036,7 @@
+ self.loop.run_until_complete(proto.completed)
+ self.check_killed(proto.returncode)
-- $as_echo "#define HAVE_CLOCK_SETTIME 1" >>confdefs.h
-+ $as_echo "#define HAVE_CLOCK_SETTIME 1" >>confdefs.h
++ @support.requires_subprocess()
+ def test_subprocess_wait_no_same_group(self):
+ # start the new process in a new session
+ connect = self.loop.subprocess_shell(
+@@ -2037,6 +2049,7 @@
+ self.assertEqual(7, proto.returncode)
+ transp.close()
++ @support.requires_subprocess()
+ def test_subprocess_exec_invalid_args(self):
+ async def connect(**kwds):
+ await self.loop.subprocess_exec(
+@@ -2050,6 +2063,7 @@
+ with self.assertRaises(ValueError):
+ self.loop.run_until_complete(connect(shell=True))
- fi
-@@ -13559,6 +14142,7 @@
- fi
- done
++ @support.requires_subprocess()
+ def test_subprocess_shell_invalid_args(self):
-+fi
+ async def connect(cmd=None, **kwds):
+diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py
+index 994041c10f0..e2bc1a2617d 100644
+--- a/Lib/test/test_asyncio/test_streams.py
++++ b/Lib/test/test_asyncio/test_streams.py
+@@ -9,7 +9,7 @@
+ import threading
+ import unittest
+ from unittest import mock
+-from test.support import socket_helper
++from test.support import requires_subprocess, socket_helper
+ try:
+ import ssl
+ except ImportError:
+@@ -707,6 +707,7 @@
+ self.assertEqual(messages, [])
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for major" >&5
- $as_echo_n "checking for major... " >&6; }
-@@ -13638,7 +14222,9 @@
- else
- if test "$cross_compiling" = yes; then :
+ @unittest.skipIf(sys.platform == 'win32', "Don't have pipes")
++ @requires_subprocess()
+ def test_read_all_from_pipe_reader(self):
+ # See asyncio issue 168. This test is derived from the example
+ # subprocess_attach_read_pipe.py, but we configure the
+diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py
+index 7cd80fd68e3..8c7bf67d94e 100644
+--- a/Lib/test/test_asyncio/test_subprocess.py
++++ b/Lib/test/test_asyncio/test_subprocess.py
+@@ -39,6 +39,7 @@
+ self._proc.pid = -1
--if test "${enable_ipv6+set}" = set; then
-+if test "$ac_sys_system" = "Linux-android" -o "$ac_sys_system" = "iOS" -o "$ac_sys_system" = "tvOS" -o "$ac_sys_system" = "watchOS"; then
-+ ac_cv_buggy_getaddrinfo="no"
-+elif test "${enable_ipv6+set}" = set; then
- ac_cv_buggy_getaddrinfo="no -- configured with --(en|dis)able-ipv6"
- else
- ac_cv_buggy_getaddrinfo=yes
-@@ -15617,7 +16203,7 @@
- $as_echo "$ABIFLAGS" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking SOABI" >&5
- $as_echo_n "checking SOABI... " >&6; }
--SOABI='cpython-'`echo $VERSION | tr -d .`${ABIFLAGS}${PLATFORM_TRIPLET:+-$PLATFORM_TRIPLET}
-+SOABI='cpython-'`echo $VERSION | tr -d .`${ABIFLAGS}${SOABI_PLATFORM:+-$SOABI_PLATFORM}
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SOABI" >&5
- $as_echo "$SOABI" >&6; }
-@@ -15625,7 +16211,7 @@
- if test "$Py_DEBUG" = 'true' -a "$with_trace_refs" != "yes"; then
- # Similar to SOABI but remove "d" flag from ABIFLAGS
++@support.requires_subprocess()
+ class SubprocessTransportTests(test_utils.TestCase):
+ def setUp(self):
+ super().setUp()
+@@ -104,6 +105,7 @@
+ transport.close()
-- ALT_SOABI='cpython-'`echo $VERSION | tr -d .``echo $ABIFLAGS | tr -d d`${PLATFORM_TRIPLET:+-$PLATFORM_TRIPLET}
-+ ALT_SOABI='cpython-'`echo $VERSION | tr -d .``echo $ABIFLAGS | tr -d d`${SOABI_PLATFORM:+-$SOABI_PLATFORM}
- cat >>confdefs.h <<_ACEOF
- #define ALT_SOABI "${ALT_SOABI}"
-@@ -16875,24 +17461,28 @@
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for device files" >&5
- $as_echo "$as_me: checking for device files" >&6;}
++@support.requires_subprocess()
+ class SubprocessMixin:
--if test "x$cross_compiling" = xyes; then
-- if test "${ac_cv_file__dev_ptmx+set}" != set; then
-- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptmx" >&5
-+if test "$ac_sys_system" = "iOS" -o "$ac_sys_system" = "tvOS" -o "$ac_sys_system" = "watchOS" ; then
-+ ac_cv_file__dev_ptmx=no
-+ ac_cv_file__dev_ptc=no
-+else
-+ if test "x$cross_compiling" = xyes; then
-+ if test "${ac_cv_file__dev_ptmx+set}" != set; then
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptmx" >&5
- $as_echo_n "checking for /dev/ptmx... " >&6; }
-- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not set" >&5
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not set" >&5
- $as_echo "not set" >&6; }
-- as_fn_error $? "set ac_cv_file__dev_ptmx to yes/no in your CONFIG_SITE file when cross compiling" "$LINENO" 5
-- fi
-- if test "${ac_cv_file__dev_ptc+set}" != set; then
-- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptc" >&5
-+ as_fn_error $? "set ac_cv_file__dev_ptmx to yes/no in your CONFIG_SITE file when cross compiling" "$LINENO" 5
-+ fi
-+ if test "${ac_cv_file__dev_ptc+set}" != set; then
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptc" >&5
- $as_echo_n "checking for /dev/ptc... " >&6; }
-- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not set" >&5
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not set" >&5
- $as_echo "not set" >&6; }
-- as_fn_error $? "set ac_cv_file__dev_ptc to yes/no in your CONFIG_SITE file when cross compiling" "$LINENO" 5
-+ as_fn_error $? "set ac_cv_file__dev_ptc to yes/no in your CONFIG_SITE file when cross compiling" "$LINENO" 5
-+ fi
- fi
--fi
+ def test_stdin_stdout(self):
+diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py
+index 01c1214c7f7..7e16e2a369d 100644
+--- a/Lib/test/test_asyncio/test_unix_events.py
++++ b/Lib/test/test_asyncio/test_unix_events.py
+@@ -315,11 +315,15 @@
+ self.loop.run_until_complete(coro)
--{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptmx" >&5
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptmx" >&5
- $as_echo_n "checking for /dev/ptmx... " >&6; }
- if ${ac_cv_file__dev_ptmx+:} false; then :
- $as_echo_n "(cached) " >&6
-@@ -16911,12 +17501,12 @@
+ def test_create_unix_server_existing_path_nonsock(self):
+- with tempfile.NamedTemporaryFile() as file:
+- coro = self.loop.create_unix_server(lambda: None, file.name)
+- with self.assertRaisesRegex(OSError,
+- 'Address.*is already in use'):
+- self.loop.run_until_complete(coro)
++ path = test_utils.gen_unix_socket_path()
++ self.addCleanup(os_helper.unlink, path)
++ # create the file
++ open(path, "wb").close()
++
++ coro = self.loop.create_unix_server(lambda: None, path)
++ with self.assertRaisesRegex(OSError,
++ 'Address.*is already in use'):
++ self.loop.run_until_complete(coro)
- fi
+ def test_create_unix_server_ssl_bool(self):
+ coro = self.loop.create_unix_server(lambda: None, path='spam',
+diff --git a/Lib/test/test_asyncio/utils.py b/Lib/test/test_asyncio/utils.py
+index 0b9cde6878f..3f4c90e2ba6 100644
+--- a/Lib/test/test_asyncio/utils.py
++++ b/Lib/test/test_asyncio/utils.py
+@@ -11,7 +11,6 @@
+ import socket
+ import socketserver
+ import sys
+-import tempfile
+ import threading
+ import time
+ import unittest
+@@ -34,7 +33,7 @@
+ from asyncio import tasks
+ from asyncio.log import logger
+ from test import support
+-from test.support import threading_helper
++from test.support import threading_helper, socket_helper
--if test "x$ac_cv_file__dev_ptmx" = xyes; then
-+ if test "x$ac_cv_file__dev_ptmx" = xyes; then
- $as_echo "#define HAVE_DEV_PTMX 1" >>confdefs.h
+ def data_file(filename):
+@@ -250,8 +249,7 @@
--fi
--{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptc" >&5
-+ fi
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptc" >&5
- $as_echo_n "checking for /dev/ptc... " >&6; }
- if ${ac_cv_file__dev_ptc+:} false; then :
- $as_echo_n "(cached) " >&6
-@@ -16935,10 +17525,11 @@
- fi
+ def gen_unix_socket_path():
+- with tempfile.NamedTemporaryFile() as file:
+- return file.name
++ return socket_helper.create_unix_domain_name()
--if test "x$ac_cv_file__dev_ptc" = xyes; then
-+ if test "x$ac_cv_file__dev_ptc" = xyes; then
- $as_echo "#define HAVE_DEV_PTC 1" >>confdefs.h
+ @contextlib.contextmanager
+diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py
+index ecd1e120ecb..3616b9957fb 100644
+--- a/Lib/test/test_asyncore.py
++++ b/Lib/test/test_asyncore.py
+@@ -9,6 +9,7 @@
+ import threading
-+ fi
- fi
+ from test import support
++from test.support import is_apple_mobile
+ from test.support import os_helper
+ from test.support import socket_helper
+ from test.support import threading_helper
+@@ -658,6 +659,7 @@
+
+ @unittest.skipIf(sys.platform.startswith("sunos"),
+ "OOB support is broken on Solaris")
++ @unittest.skipIf(is_apple_mobile, "FIXME: edge case in removed test module")
+ def test_handle_expt(self):
+ # Make sure handle_expt is called on OOB data received.
+ # Note: this might fail on some platforms as OOB data is
+diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py
+index e0feef7c653..eab88bc256b 100644
+--- a/Lib/test/test_atexit.py
++++ b/Lib/test/test_atexit.py
+@@ -1,6 +1,5 @@
+ import atexit
+ import os
+-import sys
+ import textwrap
+ import unittest
+ from test import support
+diff --git a/Lib/test/test_audit.py b/Lib/test/test_audit.py
+index 10a61c60b57..2eab0fd6cf1 100644
+--- a/Lib/test/test_audit.py
++++ b/Lib/test/test_audit.py
+@@ -18,6 +18,7 @@
+ class AuditTest(unittest.TestCase):
+ maxDiff = None
- if test $ac_sys_system = Darwin
-@@ -17382,7 +17973,15 @@
- if test "${with_ensurepip+set}" = set; then :
- withval=$with_ensurepip;
- else
-- with_ensurepip=upgrade
-+
-+ case $ac_sys_system in #(
-+ iOS|tvOS|watchOS) :
-+ with_ensurepip=no ;; #(
-+ *) :
-+ with_ensurepip=upgrade
-+ ;;
-+esac
-+
- fi
++ @support.requires_subprocess()
+ def do_test(self, *args):
+ with subprocess.Popen(
+ [sys.executable, "-X utf8", AUDIT_TESTS_PY, *args],
+@@ -31,6 +32,7 @@
+ if p.returncode:
+ self.fail("".join(p.stderr))
- case $with_ensurepip in #(
-@@ -18765,6 +19364,9 @@
- "Mac/PythonLauncher/Makefile") CONFIG_FILES="$CONFIG_FILES Mac/PythonLauncher/Makefile" ;;
- "Mac/Resources/framework/Info.plist") CONFIG_FILES="$CONFIG_FILES Mac/Resources/framework/Info.plist" ;;
- "Mac/Resources/app/Info.plist") CONFIG_FILES="$CONFIG_FILES Mac/Resources/app/Info.plist" ;;
-+ "iOS/Resources/Info.plist") CONFIG_FILES="$CONFIG_FILES iOS/Resources/Info.plist" ;;
-+ "tvOS/Resources/Info.plist") CONFIG_FILES="$CONFIG_FILES tvOS/Resources/Info.plist" ;;
-+ "watchOS/Resources/Info.plist") CONFIG_FILES="$CONFIG_FILES watchOS/Resources/Info.plist" ;;
- "Makefile.pre") CONFIG_FILES="$CONFIG_FILES Makefile.pre" ;;
- "Misc/python.pc") CONFIG_FILES="$CONFIG_FILES Misc/python.pc" ;;
- "Misc/python-embed.pc") CONFIG_FILES="$CONFIG_FILES Misc/python-embed.pc" ;;
-diff --git a/configure.ac b/configure.ac
-index ac3be3850a9..4bfd669aa87 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -71,7 +71,7 @@
- if test "$cross_compiling" = yes; then
- AC_MSG_CHECKING([for python interpreter for cross build])
- if test -z "$PYTHON_FOR_BUILD"; then
-- for interp in python$PACKAGE_VERSION python3 python; do
-+ for interp in $PYTHON_FOR_REGEN python$PACKAGE_VERSION python3 python; do
- which $interp >/dev/null 2>&1 || continue
- if $interp -c "import sys;sys.exit(not '.'.join(str(n) for n in sys.version_info@<:@:2@:>@) == '$PACKAGE_VERSION')"; then
- break
-@@ -88,6 +88,7 @@
- AC_MSG_ERROR([Cross compiling required --host=HOST-TUPLE and --build=ARCH])
- else
- PYTHON_FOR_BUILD='./$(BUILDPYTHON) -E'
-+ AC_MSG_RESULT($interp)
- fi
- AC_SUBST(PYTHON_FOR_BUILD)
++ @support.requires_subprocess()
+ def run_python(self, *args):
+ events = []
+ with subprocess.Popen(
+diff --git a/Lib/test/test_c_locale_coercion.py b/Lib/test/test_c_locale_coercion.py
+index 71f934756e2..ca976abb853 100644
+--- a/Lib/test/test_c_locale_coercion.py
++++ b/Lib/test/test_c_locale_coercion.py
+@@ -403,6 +403,7 @@
+ expected_warnings=[LEGACY_LOCALE_WARNING],
+ coercion_expected=False)
-@@ -154,6 +155,161 @@
- AC_SUBST(CONFIG_ARGS)
- CONFIG_ARGS="$ac_configure_args"
++ @support.requires_subprocess()
+ def test_PYTHONCOERCECLOCALE_set_to_one(self):
+ # skip the test if the LC_CTYPE locale is C or coerced
+ old_loc = locale.setlocale(locale.LC_CTYPE, None)
+diff --git a/Lib/test/test_capi/test_misc.py b/Lib/test/test_capi/test_misc.py
+index 404a13a0bcc..ffe6053aeb8 100644
+--- a/Lib/test/test_capi/test_misc.py
++++ b/Lib/test/test_capi/test_misc.py
+@@ -791,6 +791,13 @@
+ self.addCleanup(os.close, r)
+ self.addCleanup(os.close, w)
-+# Set name for machine-dependent library files
-+AC_ARG_VAR([MACHDEP], [name for machine-dependent library files])
-+AC_MSG_CHECKING([MACHDEP])
-+if test -z "$MACHDEP"
-+then
-+ # avoid using uname for cross builds
-+ if test "$cross_compiling" = yes; then
-+ # ac_sys_system and ac_sys_release are used for setting
-+ # a lot of different things including 'define_xopen_source'
-+ # in the case statement below.
-+ case "$host" in
-+ *-*-linux-android*)
-+ ac_sys_system=Linux-android
-+ ;;
-+ *-*-linux*)
-+ ac_sys_system=Linux
-+ ;;
-+ *-*-cygwin*)
-+ ac_sys_system=Cygwin
-+ ;;
-+ *-apple-ios*)
-+ ac_sys_system=iOS
-+ ;;
-+ *-apple-tvos*)
-+ ac_sys_system=tvOS
-+ ;;
-+ *-apple-watchos*)
-+ ac_sys_system=watchOS
-+ ;;
-+ *-*-vxworks*)
-+ ac_sys_system=VxWorks
-+ ;;
-+ *-*-emscripten)
-+ ac_sys_system=Emscripten
-+ ;;
-+ *-*-wasi)
-+ ac_sys_system=WASI
-+ ;;
-+ *)
-+ # for now, limit cross builds to known configurations
-+ MACHDEP="unknown"
-+ AC_MSG_ERROR([cross build not supported for $host])
-+ esac
-+ ac_sys_release=
-+ else
-+ ac_sys_system=`uname -s`
-+ if test "$ac_sys_system" = "AIX" \
-+ -o "$ac_sys_system" = "UnixWare" -o "$ac_sys_system" = "OpenUNIX"; then
-+ ac_sys_release=`uname -v`
-+ else
-+ ac_sys_release=`uname -r`
-+ fi
-+ fi
-+ ac_md_system=`echo $ac_sys_system |
-+ tr -d '[/ ]' | tr '[[A-Z]]' '[[a-z]]'`
-+ ac_md_release=`echo $ac_sys_release |
-+ tr -d '[/ ]' | sed 's/^[[A-Z]]\.//' | sed 's/\..*//'`
-+ MACHDEP="$ac_md_system$ac_md_release"
-+
-+ case $MACHDEP in
-+ aix*) MACHDEP="aix";;
-+ linux*) MACHDEP="linux";;
-+ cygwin*) MACHDEP="cygwin";;
-+ darwin*) MACHDEP="darwin";;
-+ '') MACHDEP="unknown";;
-+ esac
-+
-+ if test "$ac_sys_system" = "SunOS"; then
-+ # For Solaris, there isn't an OS version specific macro defined
-+ # in most compilers, so we define one here.
-+ SUNOS_VERSION=`echo $ac_sys_release | sed -e 's!\.\([0-9]\)$!.0\1!g' | tr -d '.'`
-+ AC_DEFINE_UNQUOTED([Py_SUNOS_VERSION], [$SUNOS_VERSION],
-+ [The version of SunOS/Solaris as reported by `uname -r' without the dot.])
-+ fi
-+fi
-+AC_MSG_RESULT(["$MACHDEP"])
-+
-+# On cross-compile builds, configure will look for a host-specific compiler by
-+# prepending the user-provided host triple to the required binary name.
-+#
-+# On iOS/tvOS/watchOS, this results in binaries like "arm64-apple-ios13.0-simulator-gcc",
-+# which isn't a binary that exists, and isn't very convenient, as it contains the
-+# iOS version. As the default cross-compiler name won't exist, configure falls
-+# back to gcc, which *definitely* won't work. We're providing wrapper scripts for
-+# these tools; the binary names of these scripts are better defaults than "gcc".
-+# This only requires that the user put the platform scripts folder (e.g.,
-+# "iOS/Resources/bin") in their path, rather than defining platform-specific
-+# names/paths for AR, CC, CPP, and CXX explicitly; and if the user forgets to
-+# either put the platform scripts folder in the path, or specify CC etc,
-+# configure will fail.
-+if test -z "$AR"; then
-+ case "$host" in
-+ aarch64-apple-ios*-simulator) AR=arm64-apple-ios-simulator-ar ;;
-+ aarch64-apple-ios*) AR=arm64-apple-ios-ar ;;
-+ x86_64-apple-ios*-simulator) AR=x86_64-apple-ios-simulator-ar ;;
-+
-+ aarch64-apple-tvos*-simulator) AR=arm64-apple-tvos-simulator-ar ;;
-+ aarch64-apple-tvos*) AR=arm64-apple-tvos-ar ;;
-+ x86_64-apple-tvos*-simulator) AR=x86_64-apple-tvos-simulator-ar ;;
-+
-+ aarch64-apple-watchos*-simulator) AR=arm64-apple-watchos-simulator-ar ;;
-+ aarch64-apple-watchos*) AR=arm64_32-apple-watchos-ar ;;
-+ x86_64-apple-watchos*-simulator) AR=x86_64-apple-watchos-simulator-ar ;;
-+ *)
-+ esac
-+fi
-+if test -z "$CC"; then
-+ case "$host" in
-+ aarch64-apple-ios*-simulator) CC=arm64-apple-ios-simulator-clang ;;
-+ aarch64-apple-ios*) CC=arm64-apple-ios-clang ;;
-+ x86_64-apple-ios*-simulator) CC=x86_64-apple-ios-simulator-clang ;;
-+
-+ aarch64-apple-tvos*-simulator) CC=arm64-apple-tvos-simulator-clang ;;
-+ aarch64-apple-tvos*) CC=arm64-apple-tvos-clang ;;
-+ x86_64-apple-tvos*-simulator) CC=x86_64-apple-tvos-simulator-clang ;;
-+
-+ aarch64-apple-watchos*-simulator) CC=arm64-apple-watchos-simulator-clang ;;
-+ aarch64-apple-watchos*) CC=arm64_32-apple-watchos-clang ;;
-+ x86_64-apple-watchos*-simulator) CC=x86_64-apple-watchos-simulator-clang ;;
-+ *)
-+ esac
-+fi
-+if test -z "$CPP"; then
-+ case "$host" in
-+ aarch64-apple-ios*-simulator) CPP=arm64-apple-ios-simulator-cpp ;;
-+ aarch64-apple-ios*) CPP=arm64-apple-ios-cpp ;;
-+ x86_64-apple-ios*-simulator) CPP=x86_64-apple-ios-simulator-cpp ;;
-+
-+ aarch64-apple-tvos*-simulator) CPP=arm64-apple-tvos-simulator-cpp ;;
-+ aarch64-apple-tvos*) CPP=arm64-apple-tvos-cpp ;;
-+ x86_64-apple-tvos*-simulator) CPP=x86_64-apple-tvos-simulator-cpp ;;
-+
-+ aarch64-apple-watchos*-simulator) CPP=arm64-apple-watchos-simulator-cpp ;;
-+ aarch64-apple-watchos*) CPP=arm64_32-apple-watchos-cpp ;;
-+ x86_64-apple-watchos*-simulator) CPP=x86_64-apple-watchos-simulator-cpp ;;
-+ *)
-+ esac
-+fi
-+if test -z "$CXX"; then
-+ case "$host" in
-+ aarch64-apple-ios*-simulator) CXX=arm64-apple-ios-simulator-clang++ ;;
-+ aarch64-apple-ios*) CXX=arm64-apple-ios-clang++ ;;
-+ x86_64-apple-ios*-simulator) CXX=x86_64-apple-ios-simulator-clang++ ;;
-+
-+ aarch64-apple-tvos*-simulator) CXX=arm64-apple-tvos-simulator-clang++ ;;
-+ aarch64-apple-tvos*) CXX=arm64-apple-tvos-clang++ ;;
-+ x86_64-apple-tvos*-simulator) CXX=x86_64-apple-tvos-simulator-clang++ ;;
-+
-+ aarch64-apple-watchos*-simulator) CXX=arm64-apple-watchos-simulator-clang++ ;;
-+ aarch64-apple-watchos*) CXX=arm64_32-apple-watchos-clang++ ;;
-+ x86_64-apple-watchos*-simulator) CXX=x86_64-apple-watchos-simulator-clang++ ;;
-+ *)
-+ esac
-+fi
++ # Apple extensions must be distributed as frameworks. This requires
++ # a specialist loader.
++ if support.is_apple_mobile:
++ loader = "AppleFrameworkLoader"
++ else:
++ loader = "ExtensionFileLoader"
+
- AC_MSG_CHECKING([for --enable-universalsdk])
- AC_ARG_ENABLE(universalsdk,
- AS_HELP_STRING([--enable-universalsdk@<:@=SDKDIR@:>@],
-@@ -263,123 +419,243 @@
- [
- case $enableval in
- yes)
-- enableval=/Library/Frameworks
-+ case $ac_sys_system in
-+ Darwin) enableval=/Library/Frameworks ;;
-+ iOS) enableval=iOS/Frameworks/\$\(MULTIARCH\) ;;
-+ tvOS) enableval=tvOS/Frameworks/\$\(MULTIARCH\) ;;
-+ watchOS) enableval=watchOS/Frameworks/\$\(MULTIARCH\) ;;
-+ *) AC_MSG_ERROR([Unknown platform for framework build])
-+ esac
- esac
+ script = textwrap.dedent(f"""
+ import importlib.machinery
+ import importlib.util
+@@ -798,7 +805,7 @@
+
+ fullname = '_test_module_state_shared'
+ origin = importlib.util.find_spec('_testmultiphase').origin
+- loader = importlib.machinery.ExtensionFileLoader(fullname, origin)
++ loader = importlib.machinery.{loader}(fullname, origin)
+ spec = importlib.util.spec_from_loader(fullname, loader)
+ module = importlib.util.module_from_spec(spec)
+ attr_id = str(id(module.Error)).encode()
+@@ -996,7 +1003,12 @@
+ def setUp(self):
+ fullname = '_testmultiphase_meth_state_access' # XXX
+ origin = importlib.util.find_spec('_testmultiphase').origin
+- loader = importlib.machinery.ExtensionFileLoader(fullname, origin)
++ # Apple extensions must be distributed as frameworks. This requires
++ # a specialist loader.
++ if support.is_apple_mobile:
++ loader = importlib.machinery.AppleFrameworkLoader(fullname, origin)
++ else:
++ loader = importlib.machinery.ExtensionFileLoader(fullname, origin)
+ spec = importlib.util.spec_from_loader(fullname, loader)
+ module = importlib.util.module_from_spec(spec)
+ loader.exec_module(module)
+diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py
+index 86bcafcf0e3..529d9fd61e7 100644
+--- a/Lib/test/test_cmd_line_script.py
++++ b/Lib/test/test_cmd_line_script.py
+@@ -14,8 +14,7 @@
+
+ import textwrap
+ from test import support
+-from test.support import import_helper
+-from test.support import os_helper
++from test.support import import_helper, is_apple, os_helper
+ from test.support.script_helper import (
+ make_pkg, make_script, make_zip_pkg, make_zip_script,
+ assert_python_ok, assert_python_failure, spawn_python, kill_python)
+@@ -554,11 +553,14 @@
+ self.assertTrue(text[3].startswith('NameError'))
+
+ def test_non_ascii(self):
+- # Mac OS X denies the creation of a file with an invalid UTF-8 name.
++ # Apple platforms deny the creation of a file with an invalid UTF-8 name.
+ # Windows allows creating a name with an arbitrary bytes name, but
+ # Python cannot a undecodable bytes argument to a subprocess.
+- if (os_helper.TESTFN_UNDECODABLE
+- and sys.platform not in ('win32', 'darwin')):
++ if (
++ os_helper.TESTFN_UNDECODABLE
++ and sys.platform not in {"win32"}
++ and not is_apple
++ ):
+ name = os.fsdecode(os_helper.TESTFN_UNDECODABLE)
+ elif os_helper.TESTFN_NONASCII:
+ name = os_helper.TESTFN_NONASCII
+diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py
+index 6eae8c9cce3..0cac02e48c3 100644
+--- a/Lib/test/test_concurrent_futures.py
++++ b/Lib/test/test_concurrent_futures.py
+@@ -152,6 +152,7 @@
+ executor_type = futures.ThreadPoolExecutor
+
+
++@support.requires_subprocess()
+ class ProcessPoolForkMixin(ExecutorMixin):
+ executor_type = futures.ProcessPoolExecutor
+ ctx = "fork"
+@@ -166,6 +167,7 @@
+ return super().get_context()
+
+
++@support.requires_subprocess()
+ class ProcessPoolSpawnMixin(ExecutorMixin):
+ executor_type = futures.ProcessPoolExecutor
+ ctx = "spawn"
+@@ -178,6 +180,7 @@
+ return super().get_context()
+
+
++@support.requires_subprocess()
+ class ProcessPoolForkserverMixin(ExecutorMixin):
+ executor_type = futures.ProcessPoolExecutor
+ ctx = "forkserver"
+diff --git a/Lib/test/test_distutils.py b/Lib/test/test_distutils.py
+index d82d2b64234..f82aca2a01e 100644
+--- a/Lib/test/test_distutils.py
++++ b/Lib/test/test_distutils.py
+@@ -14,6 +14,8 @@
+
+ import distutils.tests
+
++if support.is_apple_mobile:
++ raise unittest.SkipTest("FIXME: Edge case of test loader")
+
+ def load_tests(*_):
+ # used by unittest
+diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py
+index ebd4ad91924..d20dbc457c4 100644
+--- a/Lib/test/test_doctest.py
++++ b/Lib/test/test_doctest.py
+@@ -4,7 +4,6 @@
+
+ from test import support
+ from test.support import import_helper
+-from test.support import os_helper
+ import doctest
+ import functools
+ import os
+@@ -14,7 +13,6 @@
+ import importlib.util
+ import unittest
+ import tempfile
+-import shutil
+ import types
+ import contextlib
+
+@@ -431,8 +429,9 @@
+
+ """
+
+-class test_DocTestFinder:
+- def basics(): r"""
++if not support.is_apple_mobile:
++ class test_DocTestFinder:
++ def basics(): r"""
+ Unit tests for the `DocTestFinder` class.
+
+ DocTestFinder is used to extract DocTests from an object's docstring
+@@ -2759,7 +2758,8 @@
+ hook.remove()
+
+
+-def test_lineendings(): r"""
++if not support.is_apple_mobile:
++ def test_lineendings(): r"""
+ *nix systems use \n line endings, while Windows systems use \r\n, and
+ old Mac systems used \r, which Python still recognizes as a line ending. Python
+ handles this using universal newline mode for reading files. Let's make
+@@ -2875,7 +2875,8 @@
+ TestResults(failed=1, attempted=1)
+ """
+
+-def test_CLI(): r"""
++if not support.is_apple_mobile:
++ def test_CLI(): r"""
+ The doctest module can be used to run doctests against an arbitrary file.
+ These tests test this CLI functionality.
+
+diff --git a/Lib/test/test_doctest2.py b/Lib/test/test_doctest2.py
+index ab8a0696736..f7007919113 100644
+--- a/Lib/test/test_doctest2.py
++++ b/Lib/test/test_doctest2.py
+@@ -13,9 +13,12 @@
+
+ import sys
+ import unittest
++from test import support
+
- case $enableval in
- no)
-- PYTHONFRAMEWORK=
-- PYTHONFRAMEWORKDIR=no-framework
-- PYTHONFRAMEWORKPREFIX=
-- PYTHONFRAMEWORKINSTALLDIR=
-- FRAMEWORKINSTALLFIRST=
-- FRAMEWORKINSTALLLAST=
-- FRAMEWORKALTINSTALLFIRST=
-- FRAMEWORKALTINSTALLLAST=
-- FRAMEWORKPYTHONW=
-- if test "x${prefix}" = "xNONE"; then
-- FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
-- else
-- FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
-- fi
-- enable_framework=
-+ case $ac_sys_system in
-+ iOS) AC_MSG_ERROR([iOS builds must use --enable-framework]) ;;
-+ tvOS) AC_MSG_ERROR([tvOS builds must use --enable-framework]) ;;
-+ watchOS) AC_MSG_ERROR([watchOS builds must use --enable-framework]) ;;
-+ *)
-+ PYTHONFRAMEWORK=
-+ PYTHONFRAMEWORKDIR=no-framework
-+ PYTHONFRAMEWORKPREFIX=
-+ PYTHONFRAMEWORKINSTALLDIR=
-+ PYTHONFRAMEWORKINSTALLNAMEPREFIX=
-+ RESSRCDIR=
-+ FRAMEWORKINSTALLFIRST=
-+ FRAMEWORKINSTALLLAST=
-+ FRAMEWORKALTINSTALLFIRST=
-+ FRAMEWORKALTINSTALLLAST=
-+ FRAMEWORKPYTHONW=
-+ INSTALLTARGETS="commoninstall bininstall maninstall"
+ if sys.flags.optimize >= 2:
+ raise unittest.SkipTest("Cannot test docstrings with -O2")
+
+
-+ if test "x${prefix}" = "xNONE"; then
-+ FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
-+ else
-+ FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
-+ fi
-+ enable_framework=
-+ esac
- ;;
- *)
- PYTHONFRAMEWORKPREFIX="${enableval}"
- PYTHONFRAMEWORKINSTALLDIR=$PYTHONFRAMEWORKPREFIX/$PYTHONFRAMEWORKDIR
-- FRAMEWORKINSTALLFIRST="frameworkinstallstructure"
-- FRAMEWORKALTINSTALLFIRST="frameworkinstallstructure "
-- FRAMEWORKINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools"
-- FRAMEWORKALTINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkaltinstallunixtools"
-- FRAMEWORKPYTHONW="frameworkpythonw"
-- FRAMEWORKINSTALLAPPSPREFIX="/Applications"
+ class C(object):
+ """Class C.
+
+diff --git a/Lib/test/test_dtrace.py b/Lib/test/test_dtrace.py
+index 8a436ad123b..4fa7571fe43 100644
+--- a/Lib/test/test_dtrace.py
++++ b/Lib/test/test_dtrace.py
+@@ -6,7 +6,7 @@
+ import types
+ import unittest
+
+-from test.support import findfile
++from test.support import findfile, requires_subprocess
+
+
+ def abspath(filename):
+@@ -60,6 +60,7 @@
+ command += ["-c", subcommand]
+ return command
+
++ @requires_subprocess()
+ def trace(self, script_file, subcommand=None):
+ command = self.generate_trace_command(script_file, subcommand)
+ stdout, _ = subprocess.Popen(command,
+diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py
+index 8c343f37210..f13b5a1745b 100644
+--- a/Lib/test/test_embed.py
++++ b/Lib/test/test_embed.py
+@@ -72,6 +72,7 @@
+ def tearDown(self):
+ os.chdir(self.oldcwd)
+
++ @support.requires_subprocess()
+ def run_embedded_interpreter(self, *args, env=None,
+ timeout=None, returncode=0, input=None,
+ cwd=None):
+@@ -1421,6 +1422,7 @@
+
+
+ class SetConfigTests(unittest.TestCase):
++ @support.requires_subprocess()
+ def test_set_config(self):
+ # bpo-42260: Test _PyInterpreterState_SetConfig()
+ cmd = [sys.executable, '-I', '-m', 'test._test_embed_set_config']
+diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py
+index e0f09e821da..4bbdbdd1519 100644
+--- a/Lib/test/test_faulthandler.py
++++ b/Lib/test/test_faulthandler.py
+@@ -401,6 +401,7 @@
+ finally:
+ sys.stderr = orig_stderr
+
++ @support.requires_subprocess()
+ def test_disabled_by_default(self):
+ # By default, the module should be disabled
+ code = "import faulthandler; print(faulthandler.is_enabled())"
+@@ -409,6 +410,7 @@
+ output = subprocess.check_output(args)
+ self.assertEqual(output.rstrip(), b"False")
+
++ @support.requires_subprocess()
+ def test_sys_xoptions(self):
+ # Test python -X faulthandler
+ code = "import faulthandler; print(faulthandler.is_enabled())"
+@@ -421,6 +423,7 @@
+ output = subprocess.check_output(args, env=env)
+ self.assertEqual(output.rstrip(), b"True")
+
++ @support.requires_subprocess()
+ def test_env_var(self):
+ # empty env var
+ code = "import faulthandler; print(faulthandler.is_enabled())"
+diff --git a/Lib/test/test_fcntl.py b/Lib/test/test_fcntl.py
+index 8e98256a62c..7681e829d8b 100644
+--- a/Lib/test/test_fcntl.py
++++ b/Lib/test/test_fcntl.py
+@@ -6,7 +6,7 @@
+ import sys
+ import unittest
+ from multiprocessing import Process
+-from test.support import verbose, cpython_only
++from test.support import cpython_only, is_apple, requires_subprocess, verbose
+ from test.support.import_helper import import_module
+ from test.support.os_helper import TESTFN, unlink
+
+@@ -25,7 +25,7 @@
+ start_len = "qq"
+
+ if (sys.platform.startswith(('netbsd', 'freebsd', 'openbsd'))
+- or sys.platform == 'darwin'):
++ or is_apple):
+ if struct.calcsize('l') == 8:
+ off_t = 'l'
+ pid_t = 'i'
+@@ -156,6 +156,7 @@
+ self.assertRaises(TypeError, fcntl.flock, 'spam', fcntl.LOCK_SH)
+
+ @unittest.skipIf(platform.system() == "AIX", "AIX returns PermissionError")
++ @requires_subprocess()
+ def test_lockf_exclusive(self):
+ self.f = open(TESTFN, 'wb+')
+ cmd = fcntl.LOCK_EX | fcntl.LOCK_NB
+@@ -167,6 +168,7 @@
+ self.assertEqual(p.exitcode, 0)
+
+ @unittest.skipIf(platform.system() == "AIX", "AIX returns PermissionError")
++ @requires_subprocess()
+ def test_lockf_share(self):
+ self.f = open(TESTFN, 'wb+')
+ cmd = fcntl.LOCK_SH | fcntl.LOCK_NB
+diff --git a/Lib/test/test_file_eintr.py b/Lib/test/test_file_eintr.py
+index 01408d838a8..0386d4d774d 100644
+--- a/Lib/test/test_file_eintr.py
++++ b/Lib/test/test_file_eintr.py
+@@ -15,6 +15,7 @@
+ import sys
+ import time
+ import unittest
++from test import support
+
+ # Test import all of the things we're about to try testing up front.
+ import _io
+@@ -69,6 +70,7 @@
+ self.fail('Error from IO process %s:\nSTDOUT:\n%sSTDERR:\n%s\n' %
+ (why, stdout.decode(), stderr.decode()))
+
++ @support.requires_subprocess()
+ def _test_reading(self, data_to_write, read_and_verify_code):
+ """Generic buffered read method test harness to validate EINTR behavior.
+
+diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py
+index 2f5cc06ca4b..822324cfe19 100644
+--- a/Lib/test/test_ftplib.py
++++ b/Lib/test/test_ftplib.py
+@@ -18,6 +18,7 @@
+
+ from unittest import TestCase, skipUnless
+ from test import support
++from test.support import requires_subprocess
+ from test.support import threading_helper
+ from test.support import socket_helper
+ from test.support import warnings_helper
+@@ -904,6 +905,7 @@
+
+
+ @skipUnless(ssl, "SSL not available")
++@requires_subprocess()
+ class TestTLS_FTPClassMixin(TestFTPClass):
+ """Repeat TestFTPClass tests starting the TLS layer for both control
+ and data connections first.
+@@ -920,6 +922,7 @@
+
+
+ @skipUnless(ssl, "SSL not available")
++@requires_subprocess()
+ class TestTLS_FTPClass(TestCase):
+ """Specific TLS_FTP class tests."""
+
+diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
+index 6c28b2b677c..76ea55f14ad 100644
+--- a/Lib/test/test_gc.py
++++ b/Lib/test/test_gc.py
+@@ -1,1415 +1,270 @@
++import os
+ import unittest
+-import unittest.mock
+-from test.support import (verbose, refcount_test,
+- cpython_only)
+-from test.support.import_helper import import_module
+-from test.support.os_helper import temp_dir, TESTFN, unlink
+-from test.support.script_helper import assert_python_ok, make_script
++import random
++from test import support
+ from test.support import threading_helper
+-
+-import gc
+-import sys
+-import sysconfig
+-import textwrap
+-import threading
++import _thread as thread
+ import time
+ import weakref
+
+-try:
+- from _testcapi import with_tp_del
+-except ImportError:
+- def with_tp_del(cls):
+- class C(object):
+- def __new__(cls, *args, **kwargs):
+- raise TypeError('requires _testcapi.with_tp_del')
+- return C
+-
+-try:
+- from _testcapi import ContainerNoGC
+-except ImportError:
+- ContainerNoGC = None
+-
+-### Support code
+-###############################################################################
+-
+-# Bug 1055820 has several tests of longstanding bugs involving weakrefs and
+-# cyclic gc.
+-
+-# An instance of C1055820 has a self-loop, so becomes cyclic trash when
+-# unreachable.
+-class C1055820(object):
+- def __init__(self, i):
+- self.i = i
+- self.loop = self
+-
+-class GC_Detector(object):
+- # Create an instance I. Then gc hasn't happened again so long as
+- # I.gc_happened is false.
+-
+- def __init__(self):
+- self.gc_happened = False
+-
+- def it_happened(ignored):
+- self.gc_happened = True
+-
+- # Create a piece of cyclic trash that triggers it_happened when
+- # gc collects it.
+- self.wr = weakref.ref(C1055820(666), it_happened)
+-
+-@with_tp_del
+-class Uncollectable(object):
+- """Create a reference cycle with multiple __del__ methods.
+-
+- An object in a reference cycle will never have zero references,
+- and so must be garbage collected. If one or more objects in the
+- cycle have __del__ methods, the gc refuses to guess an order,
+- and leaves the cycle uncollected."""
+- def __init__(self, partner=None):
+- if partner is None:
+- self.partner = Uncollectable(partner=self)
+- else:
+- self.partner = partner
+- def __tp_del__(self):
+- pass
+-
+-if sysconfig.get_config_vars().get('PY_CFLAGS', ''):
+- BUILD_WITH_NDEBUG = ('-DNDEBUG' in sysconfig.get_config_vars()['PY_CFLAGS'])
+-else:
+- # Usually, sys.gettotalrefcount() is only present if Python has been
+- # compiled in debug mode. If it's missing, expect that Python has
+- # been released in release mode: with NDEBUG defined.
+- BUILD_WITH_NDEBUG = (not hasattr(sys, 'gettotalrefcount'))
+-
+-### Tests
+-###############################################################################
+-
+-class GCTests(unittest.TestCase):
+- def test_list(self):
+- l = []
+- l.append(l)
+- gc.collect()
+- del l
+- self.assertEqual(gc.collect(), 1)
+-
+- def test_dict(self):
+- d = {}
+- d[1] = d
+- gc.collect()
+- del d
+- self.assertEqual(gc.collect(), 1)
+-
+- def test_tuple(self):
+- # since tuples are immutable we close the loop with a list
+- l = []
+- t = (l,)
+- l.append(t)
+- gc.collect()
+- del t
+- del l
+- self.assertEqual(gc.collect(), 2)
+-
+- def test_class(self):
+- class A:
+- pass
+- A.a = A
+- gc.collect()
+- del A
+- self.assertNotEqual(gc.collect(), 0)
+-
+- def test_newstyleclass(self):
+- class A(object):
+- pass
+- gc.collect()
+- del A
+- self.assertNotEqual(gc.collect(), 0)
+-
+- def test_instance(self):
+- class A:
+- pass
+- a = A()
+- a.a = a
+- gc.collect()
+- del a
+- self.assertNotEqual(gc.collect(), 0)
-
-- if test "x${prefix}" = "xNONE" ; then
-- FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
+- def test_newinstance(self):
+- class A(object):
+- pass
+- a = A()
+- a.a = a
+- gc.collect()
+- del a
+- self.assertNotEqual(gc.collect(), 0)
+- class B(list):
+- pass
+- class C(B, A):
+- pass
+- a = C()
+- a.a = a
+- gc.collect()
+- del a
+- self.assertNotEqual(gc.collect(), 0)
+- del B, C
+- self.assertNotEqual(gc.collect(), 0)
+- A.a = A()
+- del A
+- self.assertNotEqual(gc.collect(), 0)
+- self.assertEqual(gc.collect(), 0)
+-
+- def test_method(self):
+- # Tricky: self.__init__ is a bound method, it references the instance.
+- class A:
+- def __init__(self):
+- self.init = self.__init__
+- a = A()
+- gc.collect()
+- del a
+- self.assertNotEqual(gc.collect(), 0)
+-
+- @cpython_only
+- def test_legacy_finalizer(self):
+- # A() is uncollectable if it is part of a cycle, make sure it shows up
+- # in gc.garbage.
+- @with_tp_del
+- class A:
+- def __tp_del__(self): pass
+- class B:
+- pass
+- a = A()
+- a.a = a
+- id_a = id(a)
+- b = B()
+- b.b = b
+- gc.collect()
+- del a
+- del b
+- self.assertNotEqual(gc.collect(), 0)
+- for obj in gc.garbage:
+- if id(obj) == id_a:
+- del obj.a
+- break
+- else:
+- self.fail("didn't find obj in garbage (finalizer)")
+- gc.garbage.remove(obj)
+-
+- @cpython_only
+- def test_legacy_finalizer_newclass(self):
+- # A() is uncollectable if it is part of a cycle, make sure it shows up
+- # in gc.garbage.
+- @with_tp_del
+- class A(object):
+- def __tp_del__(self): pass
+- class B(object):
+- pass
+- a = A()
+- a.a = a
+- id_a = id(a)
+- b = B()
+- b.b = b
+- gc.collect()
+- del a
+- del b
+- self.assertNotEqual(gc.collect(), 0)
+- for obj in gc.garbage:
+- if id(obj) == id_a:
+- del obj.a
+- break
+- else:
+- self.fail("didn't find obj in garbage (finalizer)")
+- gc.garbage.remove(obj)
+-
+- def test_function(self):
+- # Tricky: f -> d -> f, code should call d.clear() after the exec to
+- # break the cycle.
+- d = {}
+- exec("def f(): pass\n", d)
+- gc.collect()
+- del d
+- self.assertEqual(gc.collect(), 2)
+-
+- @refcount_test
+- def test_frame(self):
+- def f():
+- frame = sys._getframe()
+- gc.collect()
+- f()
+- self.assertEqual(gc.collect(), 1)
+-
+- def test_saveall(self):
+- # Verify that cyclic garbage like lists show up in gc.garbage if the
+- # SAVEALL option is enabled.
+-
+- # First make sure we don't save away other stuff that just happens to
+- # be waiting for collection.
+- gc.collect()
+- # if this fails, someone else created immortal trash
+- self.assertEqual(gc.garbage, [])
+-
+- L = []
+- L.append(L)
+- id_L = id(L)
++from test import lock_tests
-- else
-- FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
-- fi
-+ case $ac_sys_system in #(
-+ Darwin) :
-+ FRAMEWORKINSTALLFIRST="frameworkinstallversionedstructure"
-+ FRAMEWORKALTINSTALLFIRST="frameworkinstallversionedstructure "
-+ FRAMEWORKINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools"
-+ FRAMEWORKALTINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkaltinstallunixtools"
-+ FRAMEWORKPYTHONW="frameworkpythonw"
-+ FRAMEWORKINSTALLAPPSPREFIX="/Applications"
-+ INSTALLTARGETS="commoninstall bininstall maninstall"
-+
-+ if test "x${prefix}" = "xNONE" ; then
-+ FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
-+
-+ else
-+ FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
-+ fi
+- debug = gc.get_debug()
+- gc.set_debug(debug | gc.DEBUG_SAVEALL)
+- del L
+- gc.collect()
+- gc.set_debug(debug)
++NUMTASKS = 10
++NUMTRIPS = 3
++POLL_SLEEP = 0.010 # seconds = 10 ms
-- case "${enableval}" in
-- /System*)
-- FRAMEWORKINSTALLAPPSPREFIX="/Applications"
-- if test "${prefix}" = "NONE" ; then
-- # See below
-- FRAMEWORKUNIXTOOLSPREFIX="/usr"
-- fi
-- ;;
-+ case "${enableval}" in
-+ /System*)
-+ FRAMEWORKINSTALLAPPSPREFIX="/Applications"
-+ if test "${prefix}" = "NONE" ; then
-+ # See below
-+ FRAMEWORKUNIXTOOLSPREFIX="/usr"
-+ fi
-+ ;;
-+
-+ /Library*)
-+ FRAMEWORKINSTALLAPPSPREFIX="/Applications"
-+ ;;
+- self.assertEqual(len(gc.garbage), 1)
+- obj = gc.garbage.pop()
+- self.assertEqual(id(obj), id_L)
++_print_mutex = thread.allocate_lock()
+
+- def test_del(self):
+- # __del__ methods can trigger collection, make this to happen
+- thresholds = gc.get_threshold()
+- gc.enable()
+- gc.set_threshold(1)
++def verbose_print(arg):
++ """Helper function for printing out debugging output."""
++ if support.verbose:
++ with _print_mutex:
++ print(arg)
+
+- class A:
+- def __del__(self):
+- dir(self)
+- a = A()
+- del a
+
+- gc.disable()
+- gc.set_threshold(*thresholds)
++class BasicThreadTest(unittest.TestCase):
+
+- def test_del_newclass(self):
+- # __del__ methods can trigger collection, make this to happen
+- thresholds = gc.get_threshold()
+- gc.enable()
+- gc.set_threshold(1)
+-
+- class A(object):
+- def __del__(self):
+- dir(self)
+- a = A()
+- del a
+-
+- gc.disable()
+- gc.set_threshold(*thresholds)
+-
+- # The following two tests are fragile:
+- # They precisely count the number of allocations,
+- # which is highly implementation-dependent.
+- # For example, disposed tuples are not freed, but reused.
+- # To minimize variations, though, we first store the get_count() results
+- # and check them at the end.
+- @refcount_test
+- def test_get_count(self):
+- gc.collect()
+- a, b, c = gc.get_count()
+- x = []
+- d, e, f = gc.get_count()
+- self.assertEqual((b, c), (0, 0))
+- self.assertEqual((e, f), (0, 0))
+- # This is less fragile than asserting that a equals 0.
+- self.assertLess(a, 5)
+- # Between the two calls to get_count(), at least one object was
+- # created (the list).
+- self.assertGreater(d, a)
+-
+- @refcount_test
+- def test_collect_generations(self):
+- gc.collect()
+- # This object will "trickle" into generation N + 1 after
+- # each call to collect(N)
+- x = []
+- gc.collect(0)
+- # x is now in gen 1
+- a, b, c = gc.get_count()
+- gc.collect(1)
+- # x is now in gen 2
+- d, e, f = gc.get_count()
+- gc.collect(2)
+- # x is now in gen 3
+- g, h, i = gc.get_count()
+- # We don't check a, d, g since their exact values depends on
+- # internal implementation details of the interpreter.
+- self.assertEqual((b, c), (1, 0))
+- self.assertEqual((e, f), (0, 1))
+- self.assertEqual((h, i), (0, 0))
+-
+- def test_trashcan(self):
+- class Ouch:
+- n = 0
+- def __del__(self):
+- Ouch.n = Ouch.n + 1
+- if Ouch.n % 17 == 0:
+- gc.collect()
++ def setUp(self):
++ self.done_mutex = thread.allocate_lock()
++ self.done_mutex.acquire()
++ self.running_mutex = thread.allocate_lock()
++ self.random_mutex = thread.allocate_lock()
++ self.created = 0
++ self.running = 0
++ self.next_ident = 0
+
-+ */Library/Frameworks)
-+ MDIR="`dirname "${enableval}"`"
-+ MDIR="`dirname "${MDIR}"`"
-+ FRAMEWORKINSTALLAPPSPREFIX="${MDIR}/Applications"
++ key = threading_helper.threading_setup()
++ self.addCleanup(threading_helper.threading_cleanup, *key)
+
-+ if test "${prefix}" = "NONE"; then
-+ # User hasn't specified the
-+ # --prefix option, but wants to install
-+ # the framework in a non-default location,
-+ # ensure that the compatibility links get
-+ # installed relative to that prefix as well
-+ # instead of in /usr/local.
-+ FRAMEWORKUNIXTOOLSPREFIX="${MDIR}"
-+ fi
-+ ;;
-
-- /Library*)
-- FRAMEWORKINSTALLAPPSPREFIX="/Applications"
-- ;;
--
-- */Library/Frameworks)
-- MDIR="`dirname "${enableval}"`"
-- MDIR="`dirname "${MDIR}"`"
-- FRAMEWORKINSTALLAPPSPREFIX="${MDIR}/Applications"
--
-- if test "${prefix}" = "NONE"; then
-- # User hasn't specified the
-- # --prefix option, but wants to install
-- # the framework in a non-default location,
-- # ensure that the compatibility links get
-- # installed relative to that prefix as well
-- # instead of in /usr/local.
-- FRAMEWORKUNIXTOOLSPREFIX="${MDIR}"
-- fi
-- ;;
-+ *)
-+ FRAMEWORKINSTALLAPPSPREFIX="/Applications"
-+ ;;
-+ esac
-
-- *)
-- FRAMEWORKINSTALLAPPSPREFIX="/Applications"
-- ;;
-+ prefix=$PYTHONFRAMEWORKINSTALLDIR/Versions/$VERSION
-+ PYTHONFRAMEWORKINSTALLNAMEPREFIX=${prefix}
-+ RESSRCDIR=Mac/Resources/framework
+
-+ # Add files for Mac specific code to the list of output
-+ # files:
-+ AC_CONFIG_FILES([Mac/Makefile])
-+ AC_CONFIG_FILES([Mac/PythonLauncher/Makefile])
-+ AC_CONFIG_FILES([Mac/Resources/framework/Info.plist])
-+ AC_CONFIG_FILES([Mac/Resources/app/Info.plist])
-+ ;;
-+ iOS) :
-+ FRAMEWORKINSTALLFIRST="frameworkinstallunversionedstructure"
-+ FRAMEWORKALTINSTALLFIRST="frameworkinstallunversionedstructure "
-+ FRAMEWORKINSTALLLAST="frameworkinstallmobileheaders"
-+ FRAMEWORKALTINSTALLLAST="frameworkinstallmobileheaders"
-+ FRAMEWORKPYTHONW=
-+ INSTALLTARGETS="libinstall inclinstall sharedinstall"
++class ThreadRunningTests(BasicThreadTest):
+
-+ prefix=$PYTHONFRAMEWORKPREFIX
-+ PYTHONFRAMEWORKINSTALLNAMEPREFIX="@rpath/$PYTHONFRAMEWORKDIR"
-+ RESSRCDIR=iOS/Resources
++ def newtask(self):
++ with self.running_mutex:
++ self.next_ident += 1
++ verbose_print("creating task %s" % self.next_ident)
++ thread.start_new_thread(self.task, (self.next_ident,))
++ self.created += 1
++ self.running += 1
+
-+ AC_CONFIG_FILES([iOS/Resources/Info.plist])
-+ ;;
-+ tvOS) :
-+ FRAMEWORKINSTALLFIRST="frameworkinstallunversionedstructure"
-+ FRAMEWORKALTINSTALLFIRST="frameworkinstallunversionedstructure "
-+ FRAMEWORKINSTALLLAST="frameworkinstallmobileheaders"
-+ FRAMEWORKALTINSTALLLAST="frameworkinstallmobileheaders"
-+ FRAMEWORKPYTHONW=
-+ INSTALLTARGETS="libinstall inclinstall sharedinstall"
++ def task(self, ident):
++ with self.random_mutex:
++ delay = random.random() / 10000.0
++ verbose_print("task %s will run for %sus" % (ident, round(delay*1e6)))
++ time.sleep(delay)
++ verbose_print("task %s done" % ident)
++ with self.running_mutex:
++ self.running -= 1
++ if self.created == NUMTASKS and self.running == 0:
++ self.done_mutex.release()
+
-+ prefix=$PYTHONFRAMEWORKPREFIX
-+ PYTHONFRAMEWORKINSTALLNAMEPREFIX="@rpath/$PYTHONFRAMEWORKDIR"
-+ RESSRCDIR=tvOS/Resources
++ def test_starting_threads(self):
++ with threading_helper.wait_threads_exit():
++ # Basic test for thread creation.
++ for i in range(NUMTASKS):
++ self.newtask()
++ verbose_print("waiting for tasks to complete...")
++ self.done_mutex.acquire()
++ verbose_print("all tasks done")
+
-+ AC_CONFIG_FILES([tvOS/Resources/Info.plist])
-+ ;;
-+ watchOS) :
-+ FRAMEWORKINSTALLFIRST="frameworkinstallunversionedstructure"
-+ FRAMEWORKALTINSTALLFIRST="frameworkinstallunversionedstructure "
-+ FRAMEWORKINSTALLLAST="frameworkinstallmobileheaders"
-+ FRAMEWORKALTINSTALLLAST="frameworkinstallmobileheaders"
-+ FRAMEWORKPYTHONW=
-+ INSTALLTARGETS="libinstall inclinstall sharedinstall"
++ def test_stack_size(self):
++ # Various stack size tests.
++ self.assertEqual(thread.stack_size(), 0, "initial stack size is not 0")
+
-+ prefix=$PYTHONFRAMEWORKPREFIX
-+ PYTHONFRAMEWORKINSTALLNAMEPREFIX="@rpath/$PYTHONFRAMEWORKDIR"
-+ RESSRCDIR=watchOS/Resources
++ thread.stack_size(0)
++ self.assertEqual(thread.stack_size(), 0, "stack_size not reset to default")
+
-+ AC_CONFIG_FILES([watchOS/Resources/Info.plist])
-+ ;;
-+ *)
-+ AC_MSG_ERROR([Unknown platform for framework build])
-+ ;;
-+ esac
- esac
--
-- prefix=$PYTHONFRAMEWORKINSTALLDIR/Versions/$VERSION
--
-- # Add files for Mac specific code to the list of output
-- # files:
-- AC_CONFIG_FILES(Mac/Makefile)
-- AC_CONFIG_FILES(Mac/PythonLauncher/Makefile)
-- AC_CONFIG_FILES(Mac/Resources/framework/Info.plist)
-- AC_CONFIG_FILES(Mac/Resources/app/Info.plist)
-- esac
- ],[
-- PYTHONFRAMEWORK=
-- PYTHONFRAMEWORKDIR=no-framework
-- PYTHONFRAMEWORKPREFIX=
-- PYTHONFRAMEWORKINSTALLDIR=
-- FRAMEWORKINSTALLFIRST=
-- FRAMEWORKINSTALLLAST=
-- FRAMEWORKALTINSTALLFIRST=
-- FRAMEWORKALTINSTALLLAST=
-- FRAMEWORKPYTHONW=
-- if test "x${prefix}" = "xNONE" ; then
-- FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
-- else
-- FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
-- fi
-- enable_framework=
--
-+ case $ac_sys_system in
-+ iOS) AC_MSG_ERROR([iOS builds must use --enable-framework]) ;;
-+ tvOS) AC_MSG_ERROR([tvOS builds must use --enable-framework]) ;;
-+ watchOS) AC_MSG_ERROR([watchOS builds must use --enable-framework]) ;;
-+ *)
-+ PYTHONFRAMEWORK=
-+ PYTHONFRAMEWORKDIR=no-framework
-+ PYTHONFRAMEWORKPREFIX=
-+ PYTHONFRAMEWORKINSTALLDIR=
-+ PYTHONFRAMEWORKINSTALLNAMEPREFIX=
-+ RESSRCDIR=
-+ FRAMEWORKINSTALLFIRST=
-+ FRAMEWORKINSTALLLAST=
-+ FRAMEWORKALTINSTALLFIRST=
-+ FRAMEWORKALTINSTALLLAST=
-+ FRAMEWORKPYTHONW=
-+ INSTALLTARGETS="commoninstall bininstall maninstall"
-+ if test "x${prefix}" = "xNONE" ; then
-+ FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
-+ else
-+ FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
-+ fi
-+ enable_framework=
-+ esac
- ])
--AC_SUBST(PYTHONFRAMEWORK)
--AC_SUBST(PYTHONFRAMEWORKIDENTIFIER)
--AC_SUBST(PYTHONFRAMEWORKDIR)
--AC_SUBST(PYTHONFRAMEWORKPREFIX)
--AC_SUBST(PYTHONFRAMEWORKINSTALLDIR)
--AC_SUBST(FRAMEWORKINSTALLFIRST)
--AC_SUBST(FRAMEWORKINSTALLLAST)
--AC_SUBST(FRAMEWORKALTINSTALLFIRST)
--AC_SUBST(FRAMEWORKALTINSTALLLAST)
--AC_SUBST(FRAMEWORKPYTHONW)
--AC_SUBST(FRAMEWORKUNIXTOOLSPREFIX)
--AC_SUBST(FRAMEWORKINSTALLAPPSPREFIX)
-+AC_SUBST([PYTHONFRAMEWORK])
-+AC_SUBST([PYTHONFRAMEWORKIDENTIFIER])
-+AC_SUBST([PYTHONFRAMEWORKDIR])
-+AC_SUBST([PYTHONFRAMEWORKPREFIX])
-+AC_SUBST([PYTHONFRAMEWORKINSTALLDIR])
-+AC_SUBST([PYTHONFRAMEWORKINSTALLNAMEPREFIX])
-+AC_SUBST([RESSRCDIR])
-+AC_SUBST([FRAMEWORKINSTALLFIRST])
-+AC_SUBST([FRAMEWORKINSTALLLAST])
-+AC_SUBST([FRAMEWORKALTINSTALLFIRST])
-+AC_SUBST([FRAMEWORKALTINSTALLLAST])
-+AC_SUBST([FRAMEWORKPYTHONW])
-+AC_SUBST([FRAMEWORKUNIXTOOLSPREFIX])
-+AC_SUBST([FRAMEWORKINSTALLAPPSPREFIX])
-+AC_SUBST([INSTALLTARGETS])
-
- AC_DEFINE_UNQUOTED(_PYTHONFRAMEWORK, "${PYTHONFRAMEWORK}", [framework name])
-
--##AC_ARG_WITH(dyld,
--## AS_HELP_STRING([--with-dyld],
--## [use (OpenStep|Rhapsody) dynamic linker]))
--##
-+dnl quadrigraphs "@<:@" and "@:>@" produce "[" and "]" in the output
-+AC_MSG_CHECKING([for --with-app-store-compliance])
-+AC_ARG_WITH(
-+ [app_store_compliance],
-+ [AS_HELP_STRING(
-+ [--with-app-store-compliance=@<:@PATCH-FILE@:>@],
-+ [Enable any patches required for compiliance with app stores.
-+ Optional PATCH-FILE specifies the custom patch to apply.]
-+ )],[
-+ case "$withval" in
-+ yes)
-+ case $ac_sys_system in
-+ Darwin|iOS|tvOS|watchOS)
-+ # iOS/tvOS/watchOS is able to share the macOS patch
-+ APP_STORE_COMPLIANCE_PATCH="Mac/Resources/app-store-compliance.patch"
-+ ;;
-+ *) AC_MSG_ERROR([no default app store compliance patch available for $ac_sys_system]) ;;
-+ esac
-+ AC_MSG_RESULT([applying default app store compliance patch])
-+ ;;
-+ *)
-+ APP_STORE_COMPLIANCE_PATCH="${withval}"
-+ AC_MSG_RESULT([applying custom app store compliance patch])
-+ ;;
-+ esac
-+ ],[
-+ case $ac_sys_system in
-+ iOS|tvOS|watchOS)
-+ # Always apply the compliance patch on iOS/tvOS/watchOS; we can use the macOS patch
-+ APP_STORE_COMPLIANCE_PATCH="Mac/Resources/app-store-compliance.patch"
-+ AC_MSG_RESULT([applying default app store compliance patch])
-+ ;;
-+ *)
-+ # No default app compliance patching on any other platform
-+ APP_STORE_COMPLIANCE_PATCH=
-+ AC_MSG_RESULT([not patching for app store compliance])
-+ ;;
-+ esac
-+])
-+AC_SUBST([APP_STORE_COMPLIANCE_PATCH])
++ @unittest.skipIf(os.name not in ("nt", "posix"), 'test meant for nt and posix')
++ def test_nt_and_posix_stack_size(self):
++ try:
++ thread.stack_size(4096)
++ except ValueError:
++ verbose_print("caught expected ValueError setting "
++ "stack_size(4096)")
++ except thread.error:
++ self.skipTest("platform does not support changing thread stack "
++ "size")
+
-+AC_SUBST([_PYTHON_HOST_PLATFORM])
++ fail_msg = "stack_size(%d) failed - should succeed"
++ for tss in (262144, 0x100000, 0):
++ thread.stack_size(tss)
++ self.assertEqual(thread.stack_size(), tss, fail_msg % tss)
++ verbose_print("successfully set stack_size(%d)" % tss)
+
- # Set name for machine-dependent library files
- AC_ARG_VAR([MACHDEP], [name for machine-dependent library files])
- AC_MSG_CHECKING(MACHDEP)
-@@ -403,6 +679,12 @@
- *-*-vxworks*)
- ac_sys_system=VxWorks
- ;;
-+ *-*-emscripten)
-+ ac_sys_system=Emscripten
-+ ;;
-+ *-*-wasi)
-+ ac_sys_system=WASI
-+ ;;
- *)
- # for now, limit cross builds to known configurations
- MACHDEP="unknown"
-@@ -431,33 +713,100 @@
- darwin*) MACHDEP="darwin";;
- '') MACHDEP="unknown";;
- esac
++ for tss in (262144, 0x100000):
++ verbose_print("trying stack_size = (%d)" % tss)
++ self.next_ident = 0
++ self.created = 0
++ with threading_helper.wait_threads_exit():
++ for i in range(NUMTASKS):
++ self.newtask()
+
-+ if test "$ac_sys_system" = "SunOS"; then
-+ # For Solaris, there isn't an OS version specific macro defined
-+ # in most compilers, so we define one here.
-+ SUNOS_VERSION=`echo $ac_sys_release | sed -e 's!\.\([0-9]\)$!.0\1!g' | tr -d '.'`
-+ AC_DEFINE_UNQUOTED([Py_SUNOS_VERSION], [$SUNOS_VERSION],
-+ [The version of SunOS/Solaris as reported by `uname -r' without the dot.])
-+ fi
- fi
- AC_MSG_RESULT("$MACHDEP")
-
--AC_SUBST(_PYTHON_HOST_PLATFORM)
- if test "$cross_compiling" = yes; then
- case "$host" in
- *-*-linux*)
- case "$host_cpu" in
- arm*)
-- _host_cpu=arm
-+ _host_ident=arm
- ;;
- *)
-- _host_cpu=$host_cpu
-+ _host_ident=$host_cpu
- esac
- ;;
- *-*-cygwin*)
-- _host_cpu=
-+ _host_ident=
-+ ;;
-+ *-apple-ios*)
-+ _host_os=`echo $host | cut -d '-' -f3`
-+ _host_device=`echo $host | cut -d '-' -f4`
-+ _host_device=${_host_device:=os}
++ verbose_print("waiting for all tasks to complete")
++ self.done_mutex.acquire()
++ verbose_print("all tasks done")
+
-+ # IPHONEOS_DEPLOYMENT_TARGET is the minimum supported iOS version
-+ AC_MSG_CHECKING([iOS deployment target])
-+ IPHONEOS_DEPLOYMENT_TARGET=${_host_os:3}
-+ IPHONEOS_DEPLOYMENT_TARGET=${IPHONEOS_DEPLOYMENT_TARGET:=13.0}
-+ AC_MSG_RESULT([$IPHONEOS_DEPLOYMENT_TARGET])
++ thread.stack_size(0)
+
-+ case "$host_cpu" in
-+ aarch64)
-+ _host_ident=${IPHONEOS_DEPLOYMENT_TARGET}-arm64-iphone${_host_device}
-+ ;;
-+ *)
-+ _host_ident=${IPHONEOS_DEPLOYMENT_TARGET}-$host_cpu-iphone${_host_device}
-+ ;;
-+ esac
-+ ;;
-+ *-apple-tvos*)
-+ _host_os=`echo $host | cut -d '-' -f3`
-+ _host_device=`echo $host | cut -d '-' -f4`
-+ _host_device=${_host_device:=os}
++ def test__count(self):
++ # Test the _count() function.
++ orig = thread._count()
++ mut = thread.allocate_lock()
++ mut.acquire()
++ started = []
+
-+ # TVOS_DEPLOYMENT_TARGET is the minimum supported tvOS version
-+ AC_MSG_CHECKING([tvOS deployment target])
-+ TVOS_DEPLOYMENT_TARGET=${_host_os:4}
-+ TVOS_DEPLOYMENT_TARGET=${TVOS_DEPLOYMENT_TARGET:=12.0}
-+ AC_MSG_RESULT([$TVOS_DEPLOYMENT_TARGET])
++ def task():
++ started.append(None)
++ mut.acquire()
++ mut.release()
+
-+ case "$host_cpu" in
-+ aarch64)
-+ _host_ident=${TVOS_DEPLOYMENT_TARGET}-arm64-appletv${_host_device}
-+ ;;
-+ *)
-+ _host_ident=${TVOS_DEPLOYMENT_TARGET}-$host_cpu-appletv${_host_device}
-+ ;;
-+ esac
-+ ;;
-+ *-apple-watchos*)
-+ _host_os=`echo $host | cut -d '-' -f3`
-+ _host_device=`echo $host | cut -d '-' -f4`
-+ _host_device=${_host_device:=os}
++ with threading_helper.wait_threads_exit():
++ thread.start_new_thread(task, ())
++ while not started:
++ time.sleep(POLL_SLEEP)
++ self.assertEqual(thread._count(), orig + 1)
++ # Allow the task to finish.
++ mut.release()
++ # The only reliable way to be sure that the thread ended from the
++ # interpreter's point of view is to wait for the function object to be
++ # destroyed.
++ done = []
++ wr = weakref.ref(task, lambda _: done.append(None))
++ del task
++ while not done:
++ time.sleep(POLL_SLEEP)
++ support.gc_collect() # For PyPy or other GCs.
++ self.assertEqual(thread._count(), orig)
+
-+ # WATCHOS_DEPLOYMENT_TARGET is the minimum supported watchOS version
-+ AC_MSG_CHECKING([watchOS deployment target])
-+ WATCHOS_DEPLOYMENT_TARGET=${_host_os:7}
-+ WATCHOS_DEPLOYMENT_TARGET=${WATCHOS_DEPLOYMENT_TARGET:=4.0}
-+ AC_MSG_RESULT([$WATCHOS_DEPLOYMENT_TARGET])
++ def test_unraisable_exception(self):
++ def task():
++ started.release()
++ raise ValueError("task failed")
+
-+ case "$host_cpu" in
-+ aarch64)
-+ _host_ident=${WATCHOS_DEPLOYMENT_TARGET}-arm64-watch${_host_device}
-+ ;;
-+ *)
-+ _host_ident=${WATCHOS_DEPLOYMENT_TARGET}-$host_cpu-watch${_host_device}
-+ ;;
-+ esac
- ;;
- *-*-vxworks*)
-- _host_cpu=$host_cpu
-+ _host_ident=$host_cpu
- ;;
- *)
- # for now, limit cross builds to known configurations
- MACHDEP="unknown"
- AC_MSG_ERROR([cross build not supported for $host])
- esac
-- _PYTHON_HOST_PLATFORM="$MACHDEP${_host_cpu:+-$_host_cpu}"
-+ _PYTHON_HOST_PLATFORM="$MACHDEP${_host_ident:+-$_host_ident}"
- fi
-
- # Some systems cannot stand _XOPEN_SOURCE being defined at all; they
-@@ -521,6 +870,13 @@
- define_xopen_source=no;;
- Darwin/@<:@[12]@:>@@<:@0-9@:>@.*)
- define_xopen_source=no;;
-+ # On iOS/tvOS/watchOS, defining _POSIX_C_SOURCE also disables platform specific features.
-+ iOS/*)
-+ define_xopen_source=no;;
-+ tvOS/*)
-+ define_xopen_source=no;;
-+ watchOS/*)
-+ define_xopen_source=no;;
- # On QNX 6.3.2, defining _XOPEN_SOURCE prevents netdb.h from
- # defining NI_NUMERICHOST.
- QNX/6.3.2)
-@@ -577,6 +933,12 @@
- CONFIGURE_MACOSX_DEPLOYMENT_TARGET=
- EXPORT_MACOSX_DEPLOYMENT_TARGET='#'
-
-+# Record the value of IPHONEOS_DEPLOYMENT_TARGET / TVOS_DEPLOYMENT_TARGET /
-+# WATCHOS_DEPLOYMENT_TARGET enforced by the selected host triple.
-+AC_SUBST([IPHONEOS_DEPLOYMENT_TARGET])
-+AC_SUBST([TVOS_DEPLOYMENT_TARGET])
-+AC_SUBST([WATCHOS_DEPLOYMENT_TARGET])
++ started = thread.allocate_lock()
++ with support.catch_unraisable_exception() as cm:
++ with threading_helper.wait_threads_exit():
++ started.acquire()
++ thread.start_new_thread(task, ())
++ started.acquire()
++
++ self.assertEqual(str(cm.unraisable.exc_value), "task failed")
++ self.assertIs(cm.unraisable.object, task)
++ self.assertEqual(cm.unraisable.err_msg,
++ "Exception ignored in thread started by")
++ self.assertIsNotNone(cm.unraisable.exc_traceback)
++
++
++class Barrier:
++ def __init__(self, num_threads):
++ self.num_threads = num_threads
++ self.waiting = 0
++ self.checkin_mutex = thread.allocate_lock()
++ self.checkout_mutex = thread.allocate_lock()
++ self.checkout_mutex.acquire()
++
++ def enter(self):
++ self.checkin_mutex.acquire()
++ self.waiting = self.waiting + 1
++ if self.waiting == self.num_threads:
++ self.waiting = self.num_threads - 1
++ self.checkout_mutex.release()
++ return
++ self.checkin_mutex.release()
++
++ self.checkout_mutex.acquire()
++ self.waiting = self.waiting - 1
++ if self.waiting == 0:
++ self.checkin_mutex.release()
++ return
++ self.checkout_mutex.release()
++
++
++class BarrierTest(BasicThreadTest):
++
++ def test_barrier(self):
++ with threading_helper.wait_threads_exit():
++ self.bar = Barrier(NUMTASKS)
++ self.running = NUMTASKS
++ for i in range(NUMTASKS):
++ thread.start_new_thread(self.task2, (i,))
++ verbose_print("waiting for tasks to end")
++ self.done_mutex.acquire()
++ verbose_print("tasks done")
++
++ def task2(self, ident):
++ for i in range(NUMTRIPS):
++ if ident == 0:
++ # give it a good chance to enter the next
++ # barrier before the others are all out
++ # of the current one
++ delay = 0
++ else:
++ with self.random_mutex:
++ delay = random.random() / 10000.0
++ verbose_print("task %s will run for %sus" %
++ (ident, round(delay * 1e6)))
++ time.sleep(delay)
++ verbose_print("task %s entering %s" % (ident, i))
++ self.bar.enter()
++ verbose_print("task %s leaving barrier" % ident)
++ with self.running_mutex:
++ self.running -= 1
++ # Must release mutex before releasing done, else the main thread can
++ # exit and set mutex to None as part of global teardown; then
++ # mutex.release() raises AttributeError.
++ finished = self.running == 0
++ if finished:
++ self.done_mutex.release()
+
- # checks for alternative programs
-
- # compiler flags are generated in two sets, BASECFLAGS and OPT. OPT is just
-@@ -599,6 +961,20 @@
- CFLAGS=
- fi
-
-+dnl Add the compiler flag for the iOS/tvOS/watchOS minimum supported OS version.
-+AS_CASE([$ac_sys_system],
-+ [iOS], [
-+ AS_VAR_APPEND([CFLAGS], [" -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET}"])
-+ AS_VAR_APPEND([LDFLAGS], [" -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET}"])
-+ ],[tvOS], [
-+ AS_VAR_APPEND([CFLAGS], [" -mtvos-version-min=${TVOS_DEPLOYMENT_TARGET}"])
-+ AS_VAR_APPEND([LDFLAGS], [" -mtvos-version-min=${TVOS_DEPLOYMENT_TARGET}"])
-+ ],[watchOS], [
-+ AS_VAR_APPEND([CFLAGS], [" -mwatchos-version-min=${WATCHOS_DEPLOYMENT_TARGET}"])
-+ AS_VAR_APPEND([LDFLAGS], [" -mwatchos-version-min=${WATCHOS_DEPLOYMENT_TARGET}"])
-+ ],
-+)
++class LockTests(lock_tests.LockTests):
++ locktype = thread.allocate_lock
+
- if test "$ac_sys_system" = "Darwin"
- then
- # Compiler selection on MacOSX is more complicated than
-@@ -855,7 +1231,42 @@
- #elif defined(__gnu_hurd__)
- i386-gnu
- #elif defined(__APPLE__)
-+# include "TargetConditionals.h"
-+# if TARGET_OS_IOS
-+# if TARGET_OS_SIMULATOR
-+# if __x86_64__
-+ x86_64-iphonesimulator
-+# else
-+ arm64-iphonesimulator
-+# endif
-+# else
-+ arm64-iphoneos
-+# endif
-+# elif TARGET_OS_TV
-+# if TARGET_OS_SIMULATOR
-+# if __x86_64__
-+ x86_64-appletvsimulator
-+# else
-+ arm64-appletvsimulator
-+# endif
-+# else
-+ arm64-appletvos
-+# endif
-+# elif TARGET_OS_WATCH
-+# if TARGET_OS_SIMULATOR
-+# if __x86_64__
-+ x86_64-watchsimulator
-+# else
-+ arm64-watchsimulator
-+# endif
-+# else
-+ arm64_32-watchos
-+# endif
-+# elif TARGET_OS_OSX
- darwin
-+# else
-+# error unknown Apple platform
-+# endif
- #elif defined(__VXWORKS__)
- vxworks
- #else
-@@ -872,14 +1283,24 @@
- fi
- rm -f conftest.c conftest.out
-
-+dnl On some platforms, using a true "triplet" for MULTIARCH would be redundant.
-+dnl For example, `arm64-apple-darwin` is redundant, because there isn't a
-+dnl non-Apple Darwin. Including the CPU architecture can also be potentially
-+dnl redundant - on macOS, for example, it's possible to do a single compile
-+dnl pass that includes multiple architectures, so it would be misleading for
-+dnl MULTIARCH (and thus the sysconfigdata module name) to include a single CPU
-+dnl architecture. PLATFORM_TRIPLET will be a pair or single value for these
-+dnl platforms.
- AC_MSG_CHECKING([for multiarch])
- AS_CASE([$ac_sys_system],
- [Darwin*], [MULTIARCH=""],
-+ [iOS], [MULTIARCH=""],
-+ [tvOS], [MULTIARCH=""],
-+ [watchOS], [MULTIARCH=""],
- [FreeBSD*], [MULTIARCH=""],
- [MULTIARCH=$($CC --print-multiarch 2>/dev/null)]
- )
- AC_SUBST([MULTIARCH])
--AC_MSG_RESULT([$MULTIARCH])
-
- if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then
- if test x$PLATFORM_TRIPLET != x$MULTIARCH; then
-@@ -888,7 +1309,18 @@
- elif test x$PLATFORM_TRIPLET != x && test x$MULTIARCH = x; then
- MULTIARCH=$PLATFORM_TRIPLET
- fi
--AC_SUBST(PLATFORM_TRIPLET)
-+AC_SUBST([PLATFORM_TRIPLET])
-+AC_MSG_RESULT([$MULTIARCH])
+
-+dnl Even if we *do* include the CPU architecture in the MULTIARCH value, some
-+dnl platforms don't need the CPU architecture in the SOABI tag. These platforms
-+dnl will have multiple sysconfig modules (one for each CPU architecture), but
-+dnl use a single "fat" binary at runtime. SOABI_PLATFORM is the component of
-+dnl the PLATFORM_TRIPLET that will be used in binary module extensions.
-+AS_CASE([$ac_sys_system],
-+ [iOS|tvOS|watchOS], [SOABI_PLATFORM=`echo "$PLATFORM_TRIPLET" | cut -d '-' -f2`],
-+ [SOABI_PLATFORM=$PLATFORM_TRIPLET]
-+)
-
- if test x$MULTIARCH != x; then
- MULTIARCH_CPPFLAGS="-DMULTIARCH=\\\"$MULTIARCH\\\""
-@@ -1115,17 +1547,25 @@
-
- AC_MSG_CHECKING(LDLIBRARY)
++class TestForkInThread(unittest.TestCase):
++ def setUp(self):
++ self.read_fd, self.write_fd = os.pipe()
--# MacOSX framework builds need more magic. LDLIBRARY is the dynamic
-+# Apple framework builds need more magic. LDLIBRARY is the dynamic
- # library that we build, but we do not want to link against it (we
- # will find it with a -framework option). For this reason there is an
- # extra variable BLDLIBRARY against which Python and the extension
- # modules are linked, BLDLIBRARY. This is normally the same as
--# LDLIBRARY, but empty for MacOSX framework builds.
-+# LDLIBRARY, but empty for MacOSX framework builds. iOS does the same,
-+# but uses a non-versioned framework layout.
- if test "$enable_framework"
- then
-- LDLIBRARY='$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
-- RUNSHARED=DYLD_FRAMEWORK_PATH=`pwd`${DYLD_FRAMEWORK_PATH:+:${DYLD_FRAMEWORK_PATH}}
-+ case $ac_sys_system in
-+ Darwin)
-+ LDLIBRARY='$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)';;
-+ iOS|tvOS|watchOS)
-+ LDLIBRARY='$(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK)';;
-+ *)
-+ AC_MSG_ERROR([Unknown platform for framework build]);;
-+ esac
- BLDLIBRARY=''
-+ RUNSHARED=DYLD_FRAMEWORK_PATH=`pwd`${DYLD_FRAMEWORK_PATH:+:${DYLD_FRAMEWORK_PATH}}
- else
- BLDLIBRARY='$(LDLIBRARY)'
- fi
-@@ -1136,64 +1576,67 @@
- AC_DEFINE(Py_ENABLE_SHARED, 1, [Defined if Python is built as a shared library.])
- case $ac_sys_system in
- CYGWIN*)
-- LDLIBRARY='libpython$(LDVERSION).dll.a'
-- DLLLIBRARY='libpython$(LDVERSION).dll'
-- ;;
-+ LDLIBRARY='libpython$(LDVERSION).dll.a'
-+ DLLLIBRARY='libpython$(LDVERSION).dll'
-+ ;;
- SunOS*)
-- LDLIBRARY='libpython$(LDVERSION).so'
-- BLDLIBRARY='-Wl,-R,$(LIBDIR) -L. -lpython$(LDVERSION)'
-- RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
-- INSTSONAME="$LDLIBRARY".$SOVERSION
-- if test "$with_pydebug" != yes
-- then
-- PY3LIBRARY=libpython3.so
-- fi
-- ;;
-+ LDLIBRARY='libpython$(LDVERSION).so'
-+ BLDLIBRARY='-Wl,-R,$(LIBDIR) -L. -lpython$(LDVERSION)'
-+ RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
-+ INSTSONAME="$LDLIBRARY".$SOVERSION
-+ if test "$with_pydebug" != yes
-+ then
-+ PY3LIBRARY=libpython3.so
-+ fi
-+ ;;
- Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|OpenBSD*|VxWorks*)
-- LDLIBRARY='libpython$(LDVERSION).so'
-- BLDLIBRARY='-L. -lpython$(LDVERSION)'
-- RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
-- INSTSONAME="$LDLIBRARY".$SOVERSION
-- if test "$with_pydebug" != yes
-- then
-- PY3LIBRARY=libpython3.so
-- fi
-- ;;
-+ LDLIBRARY='libpython$(LDVERSION).so'
-+ BLDLIBRARY='-L. -lpython$(LDVERSION)'
-+ RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
-+ INSTSONAME="$LDLIBRARY".$SOVERSION
-+ if test "$with_pydebug" != yes
-+ then
-+ PY3LIBRARY=libpython3.so
-+ fi
-+ ;;
- hp*|HP*)
-- case `uname -m` in
-- ia64)
-- LDLIBRARY='libpython$(LDVERSION).so'
-- ;;
-- *)
-- LDLIBRARY='libpython$(LDVERSION).sl'
-- ;;
-- esac
-- BLDLIBRARY='-Wl,+b,$(LIBDIR) -L. -lpython$(LDVERSION)'
-- RUNSHARED=SHLIB_PATH=`pwd`${SHLIB_PATH:+:${SHLIB_PATH}}
-- ;;
-+ case `uname -m` in
-+ ia64)
-+ LDLIBRARY='libpython$(LDVERSION).so'
-+ ;;
-+ *)
-+ LDLIBRARY='libpython$(LDVERSION).sl'
-+ ;;
-+ esac
-+ BLDLIBRARY='-Wl,+b,$(LIBDIR) -L. -lpython$(LDVERSION)'
-+ RUNSHARED=SHLIB_PATH=`pwd`${SHLIB_PATH:+:${SHLIB_PATH}}
-+ ;;
- Darwin*)
-- LDLIBRARY='libpython$(LDVERSION).dylib'
-- BLDLIBRARY='-L. -lpython$(LDVERSION)'
-- RUNSHARED=DYLD_LIBRARY_PATH=`pwd`${DYLD_LIBRARY_PATH:+:${DYLD_LIBRARY_PATH}}
-- ;;
-+ LDLIBRARY='libpython$(LDVERSION).dylib'
-+ BLDLIBRARY='-L. -lpython$(LDVERSION)'
-+ RUNSHARED=DYLD_LIBRARY_PATH=`pwd`${DYLD_LIBRARY_PATH:+:${DYLD_LIBRARY_PATH}}
-+ ;;
-+ iOS|tvOS|watchOS)
-+ LDLIBRARY='libpython$(LDVERSION).dylib'
-+ ;;
- AIX*)
-- LDLIBRARY='libpython$(LDVERSION).so'
-- RUNSHARED=LIBPATH=`pwd`${LIBPATH:+:${LIBPATH}}
-- ;;
-+ LDLIBRARY='libpython$(LDVERSION).so'
-+ RUNSHARED=LIBPATH=`pwd`${LIBPATH:+:${LIBPATH}}
-+ ;;
+- # "trashcan" is a hack to prevent stack overflow when deallocating
+- # very deeply nested tuples etc. It works in part by abusing the
+- # type pointer and refcount fields, and that can yield horrible
+- # problems when gc tries to traverse the structures.
+- # If this test fails (as it does in 2.0, 2.1 and 2.2), it will
+- # most likely die via segfault.
++ @unittest.skipUnless(hasattr(os, 'fork'), 'need os.fork')
++ @support.requires_fork()
++ @threading_helper.reap_threads
++ def test_forkinthread(self):
++ pid = None
- esac
- else # shared is disabled
- PY_ENABLE_SHARED=0
- case $ac_sys_system in
- CYGWIN*)
-- BLDLIBRARY='$(LIBRARY)'
-- LDLIBRARY='libpython$(LDVERSION).dll.a'
-- ;;
-+ BLDLIBRARY='$(LIBRARY)'
-+ LDLIBRARY='libpython$(LDVERSION).dll.a'
-+ ;;
- esac
- fi
+- # Note: In 2.3 the possibility for compiling without cyclic gc was
+- # removed, and that in turn allows the trashcan mechanism to work
+- # via much simpler means (e.g., it never abuses the type pointer or
+- # refcount fields anymore). Since it's much less likely to cause a
+- # problem now, the various constants in this expensive (we force a lot
+- # of full collections) test are cut back from the 2.2 version.
+- gc.enable()
+- N = 150
+- for count in range(2):
+- t = []
+- for i in range(N):
+- t = [t, Ouch()]
+- u = []
+- for i in range(N):
+- u = [u, Ouch()]
+- v = {}
+- for i in range(N):
+- v = {1: v, 2: Ouch()}
+- gc.disable()
++ def fork_thread(read_fd, write_fd):
++ nonlocal pid
+
+- def test_trashcan_threads(self):
+- # Issue #13992: trashcan mechanism should be thread-safe
+- NESTING = 60
+- N_THREADS = 2
++ # fork in a thread
++ pid = os.fork()
++ if pid:
++ # parent process
++ return
+
+- def sleeper_gen():
+- """A generator that releases the GIL when closed or dealloc'ed."""
++ # child process
+ try:
+- yield
++ os.close(read_fd)
++ os.write(write_fd, b"OK")
+ finally:
+- time.sleep(0.000001)
+-
+- class C(list):
+- # Appending to a list is atomic, which avoids the use of a lock.
+- inits = []
+- dels = []
+- def __init__(self, alist):
+- self[:] = alist
+- C.inits.append(None)
+- def __del__(self):
+- # This __del__ is called by subtype_dealloc().
+- C.dels.append(None)
+- # `g` will release the GIL when garbage-collected. This
+- # helps assert subtype_dealloc's behaviour when threads
+- # switch in the middle of it.
+- g = sleeper_gen()
+- next(g)
+- # Now that __del__ is finished, subtype_dealloc will proceed
+- # to call list_dealloc, which also uses the trashcan mechanism.
++ os._exit(0)
+
+- def make_nested():
+- """Create a sufficiently nested container object so that the
+- trashcan mechanism is invoked when deallocating it."""
+- x = C([])
+- for i in range(NESTING):
+- x = [C([x])]
+- del x
++ with threading_helper.wait_threads_exit():
++ thread.start_new_thread(fork_thread, (self.read_fd, self.write_fd))
++ self.assertEqual(os.read(self.read_fd, 2), b"OK")
++ os.close(self.write_fd)
+
+- def run_thread():
+- """Exercise make_nested() in a loop."""
+- while not exit:
+- make_nested()
++ self.assertIsNotNone(pid)
++ support.wait_process(pid, exitcode=0)
+
+- old_switchinterval = sys.getswitchinterval()
+- sys.setswitchinterval(1e-5)
++ def tearDown(self):
+ try:
+- exit = []
+- threads = []
+- for i in range(N_THREADS):
+- t = threading.Thread(target=run_thread)
+- threads.append(t)
+- with threading_helper.start_threads(threads, lambda: exit.append(1)):
+- time.sleep(1.0)
+- finally:
+- sys.setswitchinterval(old_switchinterval)
+- gc.collect()
+- self.assertEqual(len(C.inits), len(C.dels))
+-
+- def test_boom(self):
+- class Boom:
+- def __getattr__(self, someattribute):
+- del self.attr
+- raise AttributeError
+-
+- a = Boom()
+- b = Boom()
+- a.attr = b
+- b.attr = a
+-
+- gc.collect()
+- garbagelen = len(gc.garbage)
+- del a, b
+- # a<->b are in a trash cycle now. Collection will invoke
+- # Boom.__getattr__ (to see whether a and b have __del__ methods), and
+- # __getattr__ deletes the internal "attr" attributes as a side effect.
+- # That causes the trash cycle to get reclaimed via refcounts falling to
+- # 0, thus mutating the trash graph as a side effect of merely asking
+- # whether __del__ exists. This used to (before 2.3b1) crash Python.
+- # Now __getattr__ isn't called.
+- self.assertEqual(gc.collect(), 4)
+- self.assertEqual(len(gc.garbage), garbagelen)
+-
+- def test_boom2(self):
+- class Boom2:
+- def __init__(self):
+- self.x = 0
+-
+- def __getattr__(self, someattribute):
+- self.x += 1
+- if self.x > 1:
+- del self.attr
+- raise AttributeError
+-
+- a = Boom2()
+- b = Boom2()
+- a.attr = b
+- b.attr = a
+-
+- gc.collect()
+- garbagelen = len(gc.garbage)
+- del a, b
+- # Much like test_boom(), except that __getattr__ doesn't break the
+- # cycle until the second time gc checks for __del__. As of 2.3b1,
+- # there isn't a second time, so this simply cleans up the trash cycle.
+- # We expect a, b, a.__dict__ and b.__dict__ (4 objects) to get
+- # reclaimed this way.
+- self.assertEqual(gc.collect(), 4)
+- self.assertEqual(len(gc.garbage), garbagelen)
+-
+- def test_boom_new(self):
+- # boom__new and boom2_new are exactly like boom and boom2, except use
+- # new-style classes.
+-
+- class Boom_New(object):
+- def __getattr__(self, someattribute):
+- del self.attr
+- raise AttributeError
+-
+- a = Boom_New()
+- b = Boom_New()
+- a.attr = b
+- b.attr = a
+-
+- gc.collect()
+- garbagelen = len(gc.garbage)
+- del a, b
+- self.assertEqual(gc.collect(), 4)
+- self.assertEqual(len(gc.garbage), garbagelen)
+-
+- def test_boom2_new(self):
+- class Boom2_New(object):
+- def __init__(self):
+- self.x = 0
+-
+- def __getattr__(self, someattribute):
+- self.x += 1
+- if self.x > 1:
+- del self.attr
+- raise AttributeError
+-
+- a = Boom2_New()
+- b = Boom2_New()
+- a.attr = b
+- b.attr = a
+-
+- gc.collect()
+- garbagelen = len(gc.garbage)
+- del a, b
+- self.assertEqual(gc.collect(), 4)
+- self.assertEqual(len(gc.garbage), garbagelen)
+-
+- def test_get_referents(self):
+- alist = [1, 3, 5]
+- got = gc.get_referents(alist)
+- got.sort()
+- self.assertEqual(got, alist)
+-
+- atuple = tuple(alist)
+- got = gc.get_referents(atuple)
+- got.sort()
+- self.assertEqual(got, alist)
+-
+- adict = {1: 3, 5: 7}
+- expected = [1, 3, 5, 7]
+- got = gc.get_referents(adict)
+- got.sort()
+- self.assertEqual(got, expected)
+-
+- got = gc.get_referents([1, 2], {3: 4}, (0, 0, 0))
+- got.sort()
+- self.assertEqual(got, [0, 0] + list(range(5)))
+-
+- self.assertEqual(gc.get_referents(1, 'a', 4j), [])
+-
+- def test_is_tracked(self):
+- # Atomic built-in types are not tracked, user-defined objects and
+- # mutable containers are.
+- # NOTE: types with special optimizations (e.g. tuple) have tests
+- # in their own test files instead.
+- self.assertFalse(gc.is_tracked(None))
+- self.assertFalse(gc.is_tracked(1))
+- self.assertFalse(gc.is_tracked(1.0))
+- self.assertFalse(gc.is_tracked(1.0 + 5.0j))
+- self.assertFalse(gc.is_tracked(True))
+- self.assertFalse(gc.is_tracked(False))
+- self.assertFalse(gc.is_tracked(b"a"))
+- self.assertFalse(gc.is_tracked("a"))
+- self.assertFalse(gc.is_tracked(bytearray(b"a")))
+- self.assertFalse(gc.is_tracked(type))
+- self.assertFalse(gc.is_tracked(int))
+- self.assertFalse(gc.is_tracked(object))
+- self.assertFalse(gc.is_tracked(object()))
+-
+- class UserClass:
+- pass
+-
+- class UserInt(int):
+- pass
+-
+- # Base class is object; no extra fields.
+- class UserClassSlots:
+- __slots__ = ()
+-
+- # Base class is fixed size larger than object; no extra fields.
+- class UserFloatSlots(float):
+- __slots__ = ()
+-
+- # Base class is variable size; no extra fields.
+- class UserIntSlots(int):
+- __slots__ = ()
+-
+- self.assertTrue(gc.is_tracked(gc))
+- self.assertTrue(gc.is_tracked(UserClass))
+- self.assertTrue(gc.is_tracked(UserClass()))
+- self.assertTrue(gc.is_tracked(UserInt()))
+- self.assertTrue(gc.is_tracked([]))
+- self.assertTrue(gc.is_tracked(set()))
+- self.assertTrue(gc.is_tracked(UserClassSlots()))
+- self.assertTrue(gc.is_tracked(UserFloatSlots()))
+- self.assertTrue(gc.is_tracked(UserIntSlots()))
+-
+- def test_is_finalized(self):
+- # Objects not tracked by the always gc return false
+- self.assertFalse(gc.is_finalized(3))
+-
+- storage = []
+- class Lazarus:
+- def __del__(self):
+- storage.append(self)
+-
+- lazarus = Lazarus()
+- self.assertFalse(gc.is_finalized(lazarus))
+-
+- del lazarus
+- gc.collect()
+-
+- lazarus = storage.pop()
+- self.assertTrue(gc.is_finalized(lazarus))
+-
+- def test_bug1055820b(self):
+- # Corresponds to temp2b.py in the bug report.
+-
+- ouch = []
+- def callback(ignored):
+- ouch[:] = [wr() for wr in WRs]
+-
+- Cs = [C1055820(i) for i in range(2)]
+- WRs = [weakref.ref(c, callback) for c in Cs]
+- c = None
+-
+- gc.collect()
+- self.assertEqual(len(ouch), 0)
+- # Make the two instances trash, and collect again. The bug was that
+- # the callback materialized a strong reference to an instance, but gc
+- # cleared the instance's dict anyway.
+- Cs = None
+- gc.collect()
+- self.assertEqual(len(ouch), 2) # else the callbacks didn't run
+- for x in ouch:
+- # If the callback resurrected one of these guys, the instance
+- # would be damaged, with an empty __dict__.
+- self.assertEqual(x, None)
+-
+- def test_bug21435(self):
+- # This is a poor test - its only virtue is that it happened to
+- # segfault on Tim's Windows box before the patch for 21435 was
+- # applied. That's a nasty bug relying on specific pieces of cyclic
+- # trash appearing in exactly the right order in finalize_garbage()'s
+- # input list.
+- # But there's no reliable way to force that order from Python code,
+- # so over time chances are good this test won't really be testing much
+- # of anything anymore. Still, if it blows up, there's _some_
+- # problem ;-)
+- gc.collect()
+-
+- class A:
++ os.close(self.read_fd)
++ except OSError:
+ pass
- if test "$cross_compiling" = yes; then
-- RUNSHARED=
-+ RUNSHARED=
- fi
+- class B:
+- def __init__(self, x):
+- self.x = x
+-
+- def __del__(self):
+- self.attr = None
+-
+- def do_work():
+- a = A()
+- b = B(A())
+-
+- a.attr = b
+- b.attr = a
+-
+- do_work()
+- gc.collect() # this blows up (bad C pointer) when it fails
+-
+- @cpython_only
+- def test_garbage_at_shutdown(self):
+- import subprocess
+- code = """if 1:
+- import gc
+- import _testcapi
+- @_testcapi.with_tp_del
+- class X:
+- def __init__(self, name):
+- self.name = name
+- def __repr__(self):
+- return "" %% self.name
+- def __tp_del__(self):
+- pass
+-
+- x = X('first')
+- x.x = x
+- x.y = X('second')
+- del x
+- gc.set_debug(%s)
+- """
+- def run_command(code):
+- p = subprocess.Popen([sys.executable, "-Wd", "-c", code],
+- stdout=subprocess.PIPE,
+- stderr=subprocess.PIPE)
+- stdout, stderr = p.communicate()
+- p.stdout.close()
+- p.stderr.close()
+- self.assertEqual(p.returncode, 0)
+- self.assertEqual(stdout, b"")
+- return stderr
+-
+- stderr = run_command(code % "0")
+- self.assertIn(b"ResourceWarning: gc: 2 uncollectable objects at "
+- b"shutdown; use", stderr)
+- self.assertNotIn(b"", stderr)
+- # With DEBUG_UNCOLLECTABLE, the garbage list gets printed
+- stderr = run_command(code % "gc.DEBUG_UNCOLLECTABLE")
+- self.assertIn(b"ResourceWarning: gc: 2 uncollectable objects at "
+- b"shutdown", stderr)
+- self.assertTrue(
+- (b"[, ]" in stderr) or
+- (b"[, ]" in stderr), stderr)
+- # With DEBUG_SAVEALL, no additional message should get printed
+- # (because gc.garbage also contains normally reclaimable cyclic
+- # references, and its elements get printed at runtime anyway).
+- stderr = run_command(code % "gc.DEBUG_SAVEALL")
+- self.assertNotIn(b"uncollectable objects at shutdown", stderr)
+-
+- def test_gc_main_module_at_shutdown(self):
+- # Create a reference cycle through the __main__ module and check
+- # it gets collected at interpreter shutdown.
+- code = """if 1:
+- class C:
+- def __del__(self):
+- print('__del__ called')
+- l = [C()]
+- l.append(l)
+- """
+- rc, out, err = assert_python_ok('-c', code)
+- self.assertEqual(out.strip(), b'__del__ called')
+-
+- def test_gc_ordinary_module_at_shutdown(self):
+- # Same as above, but with a non-__main__ module.
+- with temp_dir() as script_dir:
+- module = """if 1:
+- class C:
+- def __del__(self):
+- print('__del__ called')
+- l = [C()]
+- l.append(l)
+- """
+- code = """if 1:
+- import sys
+- sys.path.insert(0, %r)
+- import gctest
+- """ % (script_dir,)
+- make_script(script_dir, 'gctest', module)
+- rc, out, err = assert_python_ok('-c', code)
+- self.assertEqual(out.strip(), b'__del__ called')
+-
+- def test_global_del_SystemExit(self):
+- code = """if 1:
+- class ClassWithDel:
+- def __del__(self):
+- print('__del__ called')
+- a = ClassWithDel()
+- a.link = a
+- raise SystemExit(0)"""
+- self.addCleanup(unlink, TESTFN)
+- with open(TESTFN, 'w', encoding="utf-8") as script:
+- script.write(code)
+- rc, out, err = assert_python_ok(TESTFN)
+- self.assertEqual(out.strip(), b'__del__ called')
+-
+- def test_get_stats(self):
+- stats = gc.get_stats()
+- self.assertEqual(len(stats), 3)
+- for st in stats:
+- self.assertIsInstance(st, dict)
+- self.assertEqual(set(st),
+- {"collected", "collections", "uncollectable"})
+- self.assertGreaterEqual(st["collected"], 0)
+- self.assertGreaterEqual(st["collections"], 0)
+- self.assertGreaterEqual(st["uncollectable"], 0)
+- # Check that collection counts are incremented correctly
+- if gc.isenabled():
+- self.addCleanup(gc.enable)
+- gc.disable()
+- old = gc.get_stats()
+- gc.collect(0)
+- new = gc.get_stats()
+- self.assertEqual(new[0]["collections"], old[0]["collections"] + 1)
+- self.assertEqual(new[1]["collections"], old[1]["collections"])
+- self.assertEqual(new[2]["collections"], old[2]["collections"])
+- gc.collect(2)
+- new = gc.get_stats()
+- self.assertEqual(new[0]["collections"], old[0]["collections"] + 1)
+- self.assertEqual(new[1]["collections"], old[1]["collections"])
+- self.assertEqual(new[2]["collections"], old[2]["collections"] + 1)
+-
+- def test_freeze(self):
+- gc.freeze()
+- self.assertGreater(gc.get_freeze_count(), 0)
+- gc.unfreeze()
+- self.assertEqual(gc.get_freeze_count(), 0)
+-
+- def test_get_objects(self):
+- gc.collect()
+- l = []
+- l.append(l)
+- self.assertTrue(
+- any(l is element for element in gc.get_objects(generation=0))
+- )
+- self.assertFalse(
+- any(l is element for element in gc.get_objects(generation=1))
+- )
+- self.assertFalse(
+- any(l is element for element in gc.get_objects(generation=2))
+- )
+- gc.collect(generation=0)
+- self.assertFalse(
+- any(l is element for element in gc.get_objects(generation=0))
+- )
+- self.assertTrue(
+- any(l is element for element in gc.get_objects(generation=1))
+- )
+- self.assertFalse(
+- any(l is element for element in gc.get_objects(generation=2))
+- )
+- gc.collect(generation=1)
+- self.assertFalse(
+- any(l is element for element in gc.get_objects(generation=0))
+- )
+- self.assertFalse(
+- any(l is element for element in gc.get_objects(generation=1))
+- )
+- self.assertTrue(
+- any(l is element for element in gc.get_objects(generation=2))
+- )
+- gc.collect(generation=2)
+- self.assertFalse(
+- any(l is element for element in gc.get_objects(generation=0))
+- )
+- self.assertFalse(
+- any(l is element for element in gc.get_objects(generation=1))
+- )
+- self.assertTrue(
+- any(l is element for element in gc.get_objects(generation=2))
+- )
+- del l
+- gc.collect()
+-
+- def test_get_objects_arguments(self):
+- gc.collect()
+- self.assertEqual(len(gc.get_objects()),
+- len(gc.get_objects(generation=None)))
+-
+- self.assertRaises(ValueError, gc.get_objects, 1000)
+- self.assertRaises(ValueError, gc.get_objects, -1000)
+- self.assertRaises(TypeError, gc.get_objects, "1")
+- self.assertRaises(TypeError, gc.get_objects, 1.234)
+-
+- def test_resurrection_only_happens_once_per_object(self):
+- class A: # simple self-loop
+- def __init__(self):
+- self.me = self
+-
+- class Lazarus(A):
+- resurrected = 0
+- resurrected_instances = []
+-
+- def __del__(self):
+- Lazarus.resurrected += 1
+- Lazarus.resurrected_instances.append(self)
+-
+- gc.collect()
+- gc.disable()
+-
+- # We start with 0 resurrections
+- laz = Lazarus()
+- self.assertEqual(Lazarus.resurrected, 0)
+-
+- # Deleting the instance and triggering a collection
+- # resurrects the object
+- del laz
+- gc.collect()
+- self.assertEqual(Lazarus.resurrected, 1)
+- self.assertEqual(len(Lazarus.resurrected_instances), 1)
+-
+- # Clearing the references and forcing a collection
+- # should not resurrect the object again.
+- Lazarus.resurrected_instances.clear()
+- self.assertEqual(Lazarus.resurrected, 1)
+- gc.collect()
+- self.assertEqual(Lazarus.resurrected, 1)
+-
+- gc.enable()
+-
+- def test_resurrection_is_transitive(self):
+- class Cargo:
+- def __init__(self):
+- self.me = self
+-
+- class Lazarus:
+- resurrected_instances = []
+-
+- def __del__(self):
+- Lazarus.resurrected_instances.append(self)
+-
+- gc.collect()
+- gc.disable()
+-
+- laz = Lazarus()
+- cargo = Cargo()
+- cargo_id = id(cargo)
+-
+- # Create a cycle between cargo and laz
+- laz.cargo = cargo
+- cargo.laz = laz
+-
+- # Drop the references, force a collection and check that
+- # everything was resurrected.
+- del laz, cargo
+- gc.collect()
+- self.assertEqual(len(Lazarus.resurrected_instances), 1)
+- instance = Lazarus.resurrected_instances.pop()
+- self.assertTrue(hasattr(instance, "cargo"))
+- self.assertEqual(id(instance.cargo), cargo_id)
+-
+- gc.collect()
+- gc.enable()
+-
+- def test_resurrection_does_not_block_cleanup_of_other_objects(self):
+-
+- # When a finalizer resurrects objects, stats were reporting them as
+- # having been collected. This affected both collect()'s return
+- # value and the dicts returned by get_stats().
+- N = 100
+-
+- class A: # simple self-loop
+- def __init__(self):
+- self.me = self
+-
+- class Z(A): # resurrecting __del__
+- def __del__(self):
+- zs.append(self)
+-
+- zs = []
+-
+- def getstats():
+- d = gc.get_stats()[-1]
+- return d['collected'], d['uncollectable']
+-
+- gc.collect()
+- gc.disable()
+-
+- # No problems if just collecting A() instances.
+- oldc, oldnc = getstats()
+- for i in range(N):
+- A()
+- t = gc.collect()
+- c, nc = getstats()
+- self.assertEqual(t, 2*N) # instance object & its dict
+- self.assertEqual(c - oldc, 2*N)
+- self.assertEqual(nc - oldnc, 0)
+-
+- # But Z() is not actually collected.
+- oldc, oldnc = c, nc
+- Z()
+- # Nothing is collected - Z() is merely resurrected.
+- t = gc.collect()
+- c, nc = getstats()
+- self.assertEqual(t, 0)
+- self.assertEqual(c - oldc, 0)
+- self.assertEqual(nc - oldnc, 0)
+-
+- # Z() should not prevent anything else from being collected.
+- oldc, oldnc = c, nc
+- for i in range(N):
+- A()
+- Z()
+- t = gc.collect()
+- c, nc = getstats()
+- self.assertEqual(t, 2*N)
+- self.assertEqual(c - oldc, 2*N)
+- self.assertEqual(nc - oldnc, 0)
+-
+- # The A() trash should have been reclaimed already but the
+- # 2 copies of Z are still in zs (and the associated dicts).
+- oldc, oldnc = c, nc
+- zs.clear()
+- t = gc.collect()
+- c, nc = getstats()
+- self.assertEqual(t, 4)
+- self.assertEqual(c - oldc, 4)
+- self.assertEqual(nc - oldnc, 0)
+-
+- gc.enable()
+-
+- @unittest.skipIf(ContainerNoGC is None,
+- 'requires ContainerNoGC extension type')
+- def test_trash_weakref_clear(self):
+- # Test that trash weakrefs are properly cleared (bpo-38006).
+- #
+- # Structure we are creating:
+- #
+- # Z <- Y <- A--+--> WZ -> C
+- # ^ |
+- # +--+
+- # where:
+- # WZ is a weakref to Z with callback C
+- # Y doesn't implement tp_traverse
+- # A contains a reference to itself, Y and WZ
+- #
+- # A, Y, Z, WZ are all trash. The GC doesn't know that Z is trash
+- # because Y does not implement tp_traverse. To show the bug, WZ needs
+- # to live long enough so that Z is deallocated before it. Then, if
+- # gcmodule is buggy, when Z is being deallocated, C will run.
+- #
+- # To ensure WZ lives long enough, we put it in a second reference
+- # cycle. That trick only works due to the ordering of the GC prev/next
+- # linked lists. So, this test is a bit fragile.
+- #
+- # The bug reported in bpo-38006 is caused because the GC did not
+- # clear WZ before starting the process of calling tp_clear on the
+- # trash. Normally, handle_weakrefs() would find the weakref via Z and
+- # clear it. However, since the GC cannot find Z, WR is not cleared and
+- # it can execute during delete_garbage(). That can lead to disaster
+- # since the callback might tinker with objects that have already had
+- # tp_clear called on them (leaving them in possibly invalid states).
+-
+- callback = unittest.mock.Mock()
+-
+- class A:
+- __slots__ = ['a', 'y', 'wz']
+-
+- class Z:
++ try:
++ os.close(self.write_fd)
++ except OSError:
+ pass
- AC_MSG_RESULT($LDLIBRARY)
-@@ -1210,11 +1653,16 @@
+- # setup required object graph, as described above
+- a = A()
+- a.a = a
+- a.y = ContainerNoGC(Z())
+- a.wz = weakref.ref(a.y.value, callback)
+- # create second cycle to keep WZ alive longer
+- wr_cycle = [a.wz]
+- wr_cycle.append(wr_cycle)
+- # ensure trash unrelated to this test is gone
+- gc.collect()
+- gc.disable()
+- # release references and create trash
+- del a, wr_cycle
+- gc.collect()
+- # if called, it means there is a bug in the GC. The weakref should be
+- # cleared before Z dies.
+- callback.assert_not_called()
+- gc.enable()
+-
+-
+-class GCCallbackTests(unittest.TestCase):
+- def setUp(self):
+- # Save gc state and disable it.
+- self.enabled = gc.isenabled()
+- gc.disable()
+- self.debug = gc.get_debug()
+- gc.set_debug(0)
+- gc.callbacks.append(self.cb1)
+- gc.callbacks.append(self.cb2)
+- self.othergarbage = []
+-
+- def tearDown(self):
+- # Restore gc state
+- del self.visit
+- gc.callbacks.remove(self.cb1)
+- gc.callbacks.remove(self.cb2)
+- gc.set_debug(self.debug)
+- if self.enabled:
+- gc.enable()
+- # destroy any uncollectables
+- gc.collect()
+- for obj in gc.garbage:
+- if isinstance(obj, Uncollectable):
+- obj.partner = None
+- del gc.garbage[:]
+- del self.othergarbage
+- gc.collect()
+-
+- def preclean(self):
+- # Remove all fluff from the system. Invoke this function
+- # manually rather than through self.setUp() for maximum
+- # safety.
+- self.visit = []
+- gc.collect()
+- garbage, gc.garbage[:] = gc.garbage[:], []
+- self.othergarbage.append(garbage)
+- self.visit = []
+-
+- def cb1(self, phase, info):
+- self.visit.append((1, phase, dict(info)))
+-
+- def cb2(self, phase, info):
+- self.visit.append((2, phase, dict(info)))
+- if phase == "stop" and hasattr(self, "cleanup"):
+- # Clean Uncollectable from garbage
+- uc = [e for e in gc.garbage if isinstance(e, Uncollectable)]
+- gc.garbage[:] = [e for e in gc.garbage
+- if not isinstance(e, Uncollectable)]
+- for e in uc:
+- e.partner = None
+-
+- def test_collect(self):
+- self.preclean()
+- gc.collect()
+- # Algorithmically verify the contents of self.visit
+- # because it is long and tortuous.
+-
+- # Count the number of visits to each callback
+- n = [v[0] for v in self.visit]
+- n1 = [i for i in n if i == 1]
+- n2 = [i for i in n if i == 2]
+- self.assertEqual(n1, [1]*2)
+- self.assertEqual(n2, [2]*2)
+-
+- # Count that we got the right number of start and stop callbacks.
+- n = [v[1] for v in self.visit]
+- n1 = [i for i in n if i == "start"]
+- n2 = [i for i in n if i == "stop"]
+- self.assertEqual(n1, ["start"]*2)
+- self.assertEqual(n2, ["stop"]*2)
+-
+- # Check that we got the right info dict for all callbacks
+- for v in self.visit:
+- info = v[2]
+- self.assertTrue("generation" in info)
+- self.assertTrue("collected" in info)
+- self.assertTrue("uncollectable" in info)
+-
+- def test_collect_generation(self):
+- self.preclean()
+- gc.collect(2)
+- for v in self.visit:
+- info = v[2]
+- self.assertEqual(info["generation"], 2)
+-
+- @cpython_only
+- def test_collect_garbage(self):
+- self.preclean()
+- # Each of these cause four objects to be garbage: Two
+- # Uncollectables and their instance dicts.
+- Uncollectable()
+- Uncollectable()
+- C1055820(666)
+- gc.collect()
+- for v in self.visit:
+- if v[1] != "stop":
+- continue
+- info = v[2]
+- self.assertEqual(info["collected"], 2)
+- self.assertEqual(info["uncollectable"], 8)
+-
+- # We should now have the Uncollectables in gc.garbage
+- self.assertEqual(len(gc.garbage), 4)
+- for e in gc.garbage:
+- self.assertIsInstance(e, Uncollectable)
+-
+- # Now, let our callback handle the Uncollectable instances
+- self.cleanup=True
+- self.visit = []
+- gc.garbage[:] = []
+- gc.collect()
+- for v in self.visit:
+- if v[1] != "stop":
+- continue
+- info = v[2]
+- self.assertEqual(info["collected"], 0)
+- self.assertEqual(info["uncollectable"], 4)
+-
+- # Uncollectables should be gone
+- self.assertEqual(len(gc.garbage), 0)
+-
+-
+- @unittest.skipIf(BUILD_WITH_NDEBUG,
+- 'built with -NDEBUG')
+- def test_refcount_errors(self):
+- self.preclean()
+- # Verify the "handling" of objects with broken refcounts
+-
+- # Skip the test if ctypes is not available
+- import_module("ctypes")
+-
+- import subprocess
+- code = textwrap.dedent('''
+- from test.support import gc_collect, SuppressCrashReport
+-
+- a = [1, 2, 3]
+- b = [a]
+-
+- # Avoid coredump when Py_FatalError() calls abort()
+- SuppressCrashReport().__enter__()
+-
+- # Simulate the refcount of "a" being too low (compared to the
+- # references held on it by live data), but keeping it above zero
+- # (to avoid deallocating it):
+- import ctypes
+- ctypes.pythonapi.Py_DecRef(ctypes.py_object(a))
+-
+- # The garbage collector should now have a fatal error
+- # when it reaches the broken object
+- gc_collect()
+- ''')
+- p = subprocess.Popen([sys.executable, "-c", code],
+- stdout=subprocess.PIPE,
+- stderr=subprocess.PIPE)
+- stdout, stderr = p.communicate()
+- p.stdout.close()
+- p.stderr.close()
+- # Verify that stderr has a useful error message:
+- self.assertRegex(stderr,
+- br'gcmodule\.c:[0-9]+: gc_decref: Assertion "gc_get_refs\(g\) > 0" failed.')
+- self.assertRegex(stderr,
+- br'refcount is too small')
+- # "address : 0x7fb5062efc18"
+- # "address : 7FB5062EFC18"
+- address_regex = br'[0-9a-fA-Fx]+'
+- self.assertRegex(stderr,
+- br'object address : ' + address_regex)
+- self.assertRegex(stderr,
+- br'object refcount : 1')
+- self.assertRegex(stderr,
+- br'object type : ' + address_regex)
+- self.assertRegex(stderr,
+- br'object type name: list')
+- self.assertRegex(stderr,
+- br'object repr : \[1, 2, 3\]')
+-
+-
+-class GCTogglingTests(unittest.TestCase):
+- def setUp(self):
+- gc.enable()
+-
+- def tearDown(self):
+- gc.disable()
+-
+- def test_bug1055820c(self):
+- # Corresponds to temp2c.py in the bug report. This is pretty
+- # elaborate.
+-
+- c0 = C1055820(0)
+- # Move c0 into generation 2.
+- gc.collect()
+-
+- c1 = C1055820(1)
+- c1.keep_c0_alive = c0
+- del c0.loop # now only c1 keeps c0 alive
+-
+- c2 = C1055820(2)
+- c2wr = weakref.ref(c2) # no callback!
+-
+- ouch = []
+- def callback(ignored):
+- ouch[:] = [c2wr()]
+-
+- # The callback gets associated with a wr on an object in generation 2.
+- c0wr = weakref.ref(c0, callback)
+-
+- c0 = c1 = c2 = None
+-
+- # What we've set up: c0, c1, and c2 are all trash now. c0 is in
+- # generation 2. The only thing keeping it alive is that c1 points to
+- # it. c1 and c2 are in generation 0, and are in self-loops. There's a
+- # global weakref to c2 (c2wr), but that weakref has no callback.
+- # There's also a global weakref to c0 (c0wr), and that does have a
+- # callback, and that callback references c2 via c2wr().
+- #
+- # c0 has a wr with callback, which references c2wr
+- # ^
+- # |
+- # | Generation 2 above dots
+- #. . . . . . . .|. . . . . . . . . . . . . . . . . . . . . . . .
+- # | Generation 0 below dots
+- # |
+- # |
+- # ^->c1 ^->c2 has a wr but no callback
+- # | | | |
+- # <--v <--v
+- #
+- # So this is the nightmare: when generation 0 gets collected, we see
+- # that c2 has a callback-free weakref, and c1 doesn't even have a
+- # weakref. Collecting generation 0 doesn't see c0 at all, and c0 is
+- # the only object that has a weakref with a callback. gc clears c1
+- # and c2. Clearing c1 has the side effect of dropping the refcount on
+- # c0 to 0, so c0 goes away (despite that it's in an older generation)
+- # and c0's wr callback triggers. That in turn materializes a reference
+- # to c2 via c2wr(), but c2 gets cleared anyway by gc.
+-
+- # We want to let gc happen "naturally", to preserve the distinction
+- # between generations.
+- junk = []
+- i = 0
+- detector = GC_Detector()
+- while not detector.gc_happened:
+- i += 1
+- if i > 10000:
+- self.fail("gc didn't happen after 10000 iterations")
+- self.assertEqual(len(ouch), 0)
+- junk.append([]) # this will eventually trigger gc
+-
+- self.assertEqual(len(ouch), 1) # else the callback wasn't invoked
+- for x in ouch:
+- # If the callback resurrected c2, the instance would be damaged,
+- # with an empty __dict__.
+- self.assertEqual(x, None)
+-
+- def test_bug1055820d(self):
+- # Corresponds to temp2d.py in the bug report. This is very much like
+- # test_bug1055820c, but uses a __del__ method instead of a weakref
+- # callback to sneak in a resurrection of cyclic trash.
+-
+- ouch = []
+- class D(C1055820):
+- def __del__(self):
+- ouch[:] = [c2wr()]
+-
+- d0 = D(0)
+- # Move all the above into generation 2.
+- gc.collect()
+-
+- c1 = C1055820(1)
+- c1.keep_d0_alive = d0
+- del d0.loop # now only c1 keeps d0 alive
+-
+- c2 = C1055820(2)
+- c2wr = weakref.ref(c2) # no callback!
+-
+- d0 = c1 = c2 = None
+-
+- # What we've set up: d0, c1, and c2 are all trash now. d0 is in
+- # generation 2. The only thing keeping it alive is that c1 points to
+- # it. c1 and c2 are in generation 0, and are in self-loops. There's
+- # a global weakref to c2 (c2wr), but that weakref has no callback.
+- # There are no other weakrefs.
+- #
+- # d0 has a __del__ method that references c2wr
+- # ^
+- # |
+- # | Generation 2 above dots
+- #. . . . . . . .|. . . . . . . . . . . . . . . . . . . . . . . .
+- # | Generation 0 below dots
+- # |
+- # |
+- # ^->c1 ^->c2 has a wr but no callback
+- # | | | |
+- # <--v <--v
+- #
+- # So this is the nightmare: when generation 0 gets collected, we see
+- # that c2 has a callback-free weakref, and c1 doesn't even have a
+- # weakref. Collecting generation 0 doesn't see d0 at all. gc clears
+- # c1 and c2. Clearing c1 has the side effect of dropping the refcount
+- # on d0 to 0, so d0 goes away (despite that it's in an older
+- # generation) and d0's __del__ triggers. That in turn materializes
+- # a reference to c2 via c2wr(), but c2 gets cleared anyway by gc.
+-
+- # We want to let gc happen "naturally", to preserve the distinction
+- # between generations.
+- detector = GC_Detector()
+- junk = []
+- i = 0
+- while not detector.gc_happened:
+- i += 1
+- if i > 10000:
+- self.fail("gc didn't happen after 10000 iterations")
+- self.assertEqual(len(ouch), 0)
+- junk.append([]) # this will eventually trigger gc
+-
+- self.assertEqual(len(ouch), 1) # else __del__ wasn't invoked
+- for x in ouch:
+- # If __del__ resurrected c2, the instance would be damaged, with an
+- # empty __dict__.
+- self.assertEqual(x, None)
+-
+-
+-class PythonFinalizationTests(unittest.TestCase):
+- def test_ast_fini(self):
+- # bpo-44184: Regression test for subtype_dealloc() when deallocating
+- # an AST instance also destroy its AST type: subtype_dealloc() must
+- # not access the type memory after deallocating the instance, since
+- # the type memory can be freed as well. The test is also related to
+- # _PyAST_Fini() which clears references to AST types.
+- code = textwrap.dedent("""
+- import ast
+- import codecs
+-
+- # Small AST tree to keep their AST types alive
+- tree = ast.parse("def f(x, y): return 2*x-y")
+- x = [tree]
+- x.append(x)
+-
+- # Put the cycle somewhere to survive until the last GC collection.
+- # Codec search functions are only cleared at the end of
+- # interpreter_clear().
+- def search_func(encoding):
+- return None
+- search_func.a = x
+- codecs.register(search_func)
+- """)
+- assert_python_ok("-c", code)
+-
+-
+-def setUpModule():
+- global enabled, debug
+- enabled = gc.isenabled()
+- gc.disable()
+- assert not gc.isenabled()
+- debug = gc.get_debug()
+- gc.set_debug(debug & ~gc.DEBUG_LEAK) # this test is supposed to leak
+- gc.collect() # Delete 2nd generation garbage
+-
+-
+-def tearDownModule():
+- gc.set_debug(debug)
+- # test gc.enable() even if GC is disabled by default
+- if verbose:
+- print("restoring automatic collection")
+- # make sure to always test gc.enable()
+- gc.enable()
+- assert gc.isenabled()
+- if not enabled:
+- gc.disable()
+-
- AC_CHECK_TOOLS([READELF], [readelf], [:])
- if test "$cross_compiling" = yes; then
-- case "$READELF" in
-- readelf|:)
-- AC_MSG_ERROR([readelf for the host is required for cross builds])
-- ;;
-- esac
-+ case "$ac_sys_system" in
-+ iOS|tvOS|watchOS) ;;
-+ *)
-+ case "$READELF" in
-+ readelf|:)
-+ AC_MSG_ERROR([readelf for the host is required for cross builds])
-+ ;;
-+ esac
-+ ;;
-+ esac
- fi
- AC_SUBST(READELF)
+ if __name__ == "__main__":
+ unittest.main()
+diff --git a/Lib/test/test_genericpath.py b/Lib/test/test_genericpath.py
+index 1ff7f75ad3e..116391493d4 100644
+--- a/Lib/test/test_genericpath.py
++++ b/Lib/test/test_genericpath.py
+@@ -7,8 +7,9 @@
+ import sys
+ import unittest
+ import warnings
+-from test.support import os_helper
+-from test.support import warnings_helper
++from test.support import (
++ is_apple, os_helper, warnings_helper
++)
+ from test.support.script_helper import assert_python_ok
+ from test.support.os_helper import FakePath
-@@ -2712,6 +3160,11 @@
- BLDSHARED="$LDSHARED"
- fi
- ;;
-+ iOS/*|tvOS/*|watchOS/*)
-+ LDSHARED='$(CC) -dynamiclib -F . -framework $(PYTHONFRAMEWORK)'
-+ LDCXXSHARED='$(CXX) -dynamiclib -F . -framework $(PYTHONFRAMEWORK)'
-+ BLDSHARED="$LDSHARED"
-+ ;;
- Linux*|GNU*|QNX*|VxWorks*)
- LDSHARED='$(CC) -shared'
- LDCXXSHARED='$(CXX) -shared';;
-@@ -2809,30 +3262,34 @@
- Linux-android*) LINKFORSHARED="-pie -Xlinker -export-dynamic";;
- Linux*|GNU*) LINKFORSHARED="-Xlinker -export-dynamic";;
- # -u libsys_s pulls in all symbols in libsys
-- Darwin/*)
-+ Darwin/*|iOS/*|tvOS/*|watchOS/*)
- LINKFORSHARED="$extra_undefs -framework CoreFoundation"
+@@ -475,12 +476,14 @@
+ self.assertIsInstance(abspath(path), str)
- # Issue #18075: the default maximum stack size (8MBytes) is too
- # small for the default recursion limit. Increase the stack size
- # to ensure that tests don't crash
-- stack_size="1000000" # 16 MB
-- if test "$with_ubsan" = "yes"
-- then
-- # Undefined behavior sanitizer requires an even deeper stack
-- stack_size="4000000" # 64 MB
-- fi
-+ stack_size="1000000" # 16 MB
-+ if test "$with_ubsan" = "yes"
-+ then
-+ # Undefined behavior sanitizer requires an even deeper stack
-+ stack_size="4000000" # 64 MB
-+ fi
+ def test_nonascii_abspath(self):
+- if (os_helper.TESTFN_UNDECODABLE
+- # Mac OS X denies the creation of a directory with an invalid
+- # UTF-8 name. Windows allows creating a directory with an
+- # arbitrary bytes name, but fails to enter this directory
+- # (when the bytes name is used).
+- and sys.platform not in ('win32', 'darwin')):
++ if (
++ os_helper.TESTFN_UNDECODABLE
++ # Apple platforms deny the creation of a
++ # directory with an invalid UTF-8 name. Windows allows creating a
++ # directory with an arbitrary bytes name, but fails to enter this
++ # directory (when the bytes name is used).
++ and sys.platform not in {"win32"} and not is_apple
++ ):
+ name = os_helper.TESTFN_UNDECODABLE
+ elif os_helper.TESTFN_NONASCII:
+ name = os_helper.TESTFN_NONASCII
+diff --git a/Lib/test/test_getpass.py b/Lib/test/test_getpass.py
+index 3452e46213a..3519f2f9837 100644
+--- a/Lib/test/test_getpass.py
++++ b/Lib/test/test_getpass.py
+@@ -22,6 +22,8 @@
+ environ.get.return_value = expected_name
+ self.assertEqual(expected_name, getpass.getuser())
-- LINKFORSHARED="-Wl,-stack_size,$stack_size $LINKFORSHARED"
-+ AC_DEFINE_UNQUOTED([THREAD_STACK_SIZE],
-+ [0x$stack_size],
-+ [Custom thread stack size depending on chosen sanitizer runtimes.])
++ @unittest.skipIf(support.is_apple_mobile,
++ "FIXME: getpwuid implementation not complete on simulator")
+ def test_username_priorities_of_env_values(self, environ):
+ environ.get.return_value = None
+ try:
+diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py
+index f86e767ac0e..14434981e95 100644
+--- a/Lib/test/test_gzip.py
++++ b/Lib/test/test_gzip.py
+@@ -12,6 +12,7 @@
+ from subprocess import PIPE, Popen
+ from test.support import import_helper
+ from test.support import os_helper
++from test.support import requires_subprocess
+ from test.support import _4G, bigmemtest
+ from test.support.script_helper import assert_python_ok, assert_python_failure
-- AC_DEFINE_UNQUOTED(THREAD_STACK_SIZE,
-- 0x$stack_size,
-- [Custom thread stack size depending on chosen sanitizer runtimes.])
-+ if test $ac_sys_system = "Darwin"; then
-+ LINKFORSHARED="-Wl,-stack_size,$stack_size $LINKFORSHARED"
+@@ -752,6 +753,7 @@
+ class TestCommandLine(unittest.TestCase):
+ data = b'This is a simple test with gzip'
-- if test "$enable_framework"
-- then
-- LINKFORSHARED="$LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
-+ if test "$enable_framework"; then
-+ LINKFORSHARED="$LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
-+ fi
-+ LINKFORSHARED="$LINKFORSHARED"
-+ elif test "$ac_sys_system" = "iOS" -o "$ac_sys_system" = "tvOS" -o "$ac_sys_system" = "watchOS"; then
-+ LINKFORSHARED="-Wl,-stack_size,$stack_size $LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK)'
- fi
-- LINKFORSHARED="$LINKFORSHARED";;
-+ ;;
- OpenUNIX*|UnixWare*) LINKFORSHARED="-Wl,-Bexport";;
- SCO_SV*) LINKFORSHARED="-Wl,-Bexport";;
- ReliantUNIX*) LINKFORSHARED="-W1 -Blargedynsym";;
-@@ -3104,7 +3561,7 @@
- AC_ARG_WITH(system_ffi,
- AS_HELP_STRING([--with-system-ffi], [build _ctypes module using an installed ffi library, see Doc/library/ctypes.rst (default is system-dependent)]),,,)
++ @requires_subprocess()
+ def test_decompress_stdin_stdout(self):
+ with io.BytesIO() as bytes_io:
+ with gzip.GzipFile(fileobj=bytes_io, mode='wb') as gzip_file:
+@@ -787,6 +789,7 @@
+ self.assertEqual(rc, 1)
+ self.assertEqual(out, b'')
--if test "$ac_sys_system" = "Darwin"
-+if test "$ac_sys_system" = "Darwin" -o "$ac_sys_system" = "iOS" -o "$ac_sys_system" = "tvOS" -o "$ac_sys_system" = "watchOS"
- then
- case "$with_system_ffi" in
- "")
-@@ -3129,9 +3586,11 @@
- if test "$with_system_ffi" = "yes" && test -n "$PKG_CONFIG"; then
- LIBFFI_INCLUDEDIR="`"$PKG_CONFIG" libffi --cflags-only-I 2>/dev/null | sed -e 's/^-I//;s/ *$//'`"
- else
-- LIBFFI_INCLUDEDIR=""
-+ LIBFFI_INCLUDEDIR="${LIBFFI_INCLUDEDIR}"
- fi
- AC_SUBST(LIBFFI_INCLUDEDIR)
-+AC_SUBST(LIBFFI_LIBDIR)
-+AC_SUBST(LIBFFI_LIB)
++ @requires_subprocess()
+ @create_and_remove_directory(TEMPDIR)
+ def test_compress_stdin_outfile(self):
+ args = sys.executable, '-m', 'gzip'
+diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py
+index 10a50fe97ec..ae51668668c 100644
+--- a/Lib/test/test_httpservers.py
++++ b/Lib/test/test_httpservers.py
+@@ -30,8 +30,9 @@
- # Check for use of the system libmpdec library
- AC_MSG_CHECKING(for --with-system-libmpdec)
-@@ -3708,18 +4167,18 @@
+ import unittest
+ from test import support
+-from test.support import os_helper
+-from test.support import threading_helper
++from test.support import (
++ is_apple, os_helper, requires_subprocess, threading_helper
++)
- # checks for library functions
- AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \
-- clock confstr close_range copy_file_range ctermid dup3 execv explicit_bzero \
-+ clock confstr close_range copy_file_range ctermid dup3 explicit_bzero \
- explicit_memset faccessat fchmod fchmodat fchown fchownat \
-- fdwalk fexecve fdopendir fork fpathconf fstatat ftime ftruncate futimesat \
-- futimens futimes gai_strerror getentropy \
-+ fdwalk fexecve fdopendir fpathconf fstatat ftime ftruncate futimesat \
-+ futimens futimes gai_strerror \
- getgrgid_r getgrnam_r \
-- getgrouplist getgroups getlogin getloadavg getpeername getpgid getpid \
-+ getgrouplist getlogin getloadavg getpeername getpgid getpid \
- getpriority getresuid getresgid getpwent getpwnam_r getpwuid_r getspnam getspent getsid getwd \
- if_nameindex \
- initgroups kill killpg lchown lockf linkat lstat lutimes mmap \
- memrchr mbrtowc mkdirat mkfifo \
- madvise mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \
-- posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \
-+ posix_fallocate posix_fadvise pread preadv preadv2 \
- pthread_condattr_setclock pthread_init pthread_kill pwrite pwritev pwritev2 \
- readlink readlinkat readv realpath renameat \
- sem_open sem_timedwait sem_clockwait sem_getvalue sem_unlink sendfile setegid seteuid \
-@@ -3727,7 +4186,7 @@
- setlocale setregid setreuid setresuid setresgid setsid setpgid setpgrp setpriority setuid setvbuf \
- sched_get_priority_max sched_setaffinity sched_setscheduler sched_setparam \
- sched_rr_get_interval \
-- sigaction sigaltstack sigfillset siginterrupt sigpending sigrelse \
-+ sigaction sigfillset siginterrupt sigpending sigrelse \
- sigtimedwait sigwait sigwaitinfo snprintf splice strftime strlcpy strsignal symlinkat sync \
- sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \
- truncate uname unlinkat utimensat utimes vfork waitid waitpid wait3 wait4 \
-@@ -3740,6 +4199,22 @@
- AC_CHECK_FUNCS(lchmod)
- fi
-+# iOS/tvOS/watchOS define some system methods that can be linked (so they are
-+# found by configure), but either raise a compilation error (because the
-+# header definition prevents usage - autoconf doesn't use the headers), or
-+# raise an error if used at runtime. Force these symbols off.
-+if test "$ac_sys_system" != "iOS" -a "$ac_sys_system" != "tvOS" -a "$ac_sys_system" != "watchOS" ; then
-+ AC_CHECK_FUNCS([ getentropy getgroups system ])
-+fi
-+
-+# tvOS/watchOS have some additional methods that can be found, but not used.
-+if test "$ac_sys_system" != "tvOS" -a "$ac_sys_system" != "watchOS" ; then
-+ AC_CHECK_FUNCS([ \
-+ execv fork posix_spawn posix_spawnp \
-+ sigaltstack \
-+ ])
-+fi
-+
- AC_CHECK_DECL(dirfd,
- AC_DEFINE(HAVE_DIRFD, 1,
- Define if you have the 'dirfd' function or macro.), ,
-@@ -4025,20 +4500,23 @@
- [AC_MSG_RESULT(no)
- ])
+ class NoLogRequestHandler:
+@@ -388,8 +389,8 @@
+ reader.close()
+ return body
--# check for openpty and forkpty
--
--AC_CHECK_FUNCS(openpty,,
-- AC_CHECK_LIB(util,openpty,
-- [AC_DEFINE(HAVE_OPENPTY) LIBS="$LIBS -lutil"],
-- AC_CHECK_LIB(bsd,openpty, [AC_DEFINE(HAVE_OPENPTY) LIBS="$LIBS -lbsd"])
-- )
--)
--AC_CHECK_FUNCS(forkpty,,
-- AC_CHECK_LIB(util,forkpty,
-- [AC_DEFINE(HAVE_FORKPTY) LIBS="$LIBS -lutil"],
-- AC_CHECK_LIB(bsd,forkpty, [AC_DEFINE(HAVE_FORKPTY) LIBS="$LIBS -lbsd"])
-- )
--)
-+# check for openpty, login_tty, and forkpty
-+# tvOS/watchOS have functions for tty, but can't use them
-+if test "$ac_sys_system" != "tvOS" -a "$ac_sys_system" != "watchOS" ; then
-+ AC_CHECK_FUNCS([openpty], [],
-+ [AC_CHECK_LIB([util], [openpty],
-+ [AC_DEFINE([HAVE_OPENPTY]) LIBS="$LIBS -lutil"],
-+ [AC_CHECK_LIB([bsd], [openpty],
-+ [AC_DEFINE([HAVE_OPENPTY]) LIBS="$LIBS -lbsd"])])])
-+ AC_SEARCH_LIBS([login_tty], [util],
-+ [AC_DEFINE([HAVE_LOGIN_TTY], [1], [Define to 1 if you have the `login_tty' function.])]
-+ )
-+ AC_CHECK_FUNCS([forkpty], [],
-+ [AC_CHECK_LIB([util], [forkpty],
-+ [AC_DEFINE([HAVE_FORKPTY]) LIBS="$LIBS -lutil"],
-+ [AC_CHECK_LIB([bsd], [forkpty],
-+ [AC_DEFINE([HAVE_FORKPTY]) LIBS="$LIBS -lbsd"])])])
-+fi
+- @unittest.skipIf(sys.platform == 'darwin',
+- 'undecodable name cannot always be decoded on macOS')
++ @unittest.skipIf(is_apple,
++ 'undecodable name cannot always be decoded on Apple platforms')
+ @unittest.skipIf(sys.platform == 'win32',
+ 'undecodable name cannot be decoded on win32')
+ @unittest.skipUnless(os_helper.TESTFN_UNDECODABLE,
+@@ -400,11 +401,11 @@
+ with open(os.path.join(self.tempdir, filename), 'wb') as f:
+ f.write(os_helper.TESTFN_UNDECODABLE)
+ response = self.request(self.base_url + '/')
+- if sys.platform == 'darwin':
+- # On Mac OS the HFS+ filesystem replaces bytes that aren't valid
+- # UTF-8 into a percent-encoded value.
++ if is_apple:
++ # On Apple platforms the HFS+ filesystem replaces bytes that
++ # aren't valid UTF-8 into a percent-encoded value.
+ for name in os.listdir(self.tempdir):
+- if name != 'test': # Ignore a filename created in setUp().
++ if name != 'test': # Ignore a filename created in setUp().
+ filename = name
+ break
+ body = self.check_status_and_reason(response, HTTPStatus.OK)
+@@ -670,6 +671,7 @@
- # check for long file support functions
- AC_CHECK_FUNCS(fseek64 fseeko fstatvfs ftell64 ftello statvfs)
-@@ -4087,11 +4565,17 @@
- ])
- ])
+ @unittest.skipIf(hasattr(os, 'geteuid') and os.geteuid() == 0,
+ "This test can't be run reliably as root (issue #13308).")
++@requires_subprocess()
+ class CGIHTTPServerTestCase(BaseTestCase):
+ class request_handler(NoLogRequestHandler, CGIHTTPRequestHandler):
+ pass
+diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py
+index 21fec2ad960..c1cecb42f99 100644
+--- a/Lib/test/test_imp.py
++++ b/Lib/test/test_imp.py
+@@ -9,6 +9,7 @@
+ from test.support import import_helper
+ from test.support import os_helper
+ from test.support import script_helper
++from test.support import is_apple_mobile
+ import unittest
+ import warnings
+ with warnings.catch_warnings():
+@@ -225,6 +226,7 @@
+ self.assertIsNot(orig_getenv, new_os.getenv)
--AC_CHECK_FUNCS(clock_settime, [], [
-- AC_CHECK_LIB(rt, clock_settime, [
-- AC_DEFINE(HAVE_CLOCK_SETTIME, 1)
-- ])
--])
-+# On iOS, tvOS and watchOS, clock_settime can be linked (so it is found by
-+# configure), but when used in an unprivileged process, it crashes rather than
-+# returning an error. Force the symbol off.
-+if test "$ac_sys_system" != "iOS" -a "$ac_sys_system" != "tvOS" -a "$ac_sys_system" != "watchOS"
-+then
-+ AC_CHECK_FUNCS([clock_settime], [], [
-+ AC_CHECK_LIB([rt], [clock_settime], [
-+ AC_DEFINE([HAVE_CLOCK_SETTIME], [1])
-+ ])
-+ ])
-+fi
+ @requires_load_dynamic
++ @unittest.skipIf(is_apple_mobile, "FIXME: edge case of module loader")
+ def test_issue15828_load_extensions(self):
+ # Issue 15828 picked up that the adapter between the old imp API
+ # and importlib couldn't handle C extensions
+@@ -237,6 +239,7 @@
+ self.assertEqual(mod.__name__, example)
- AC_MSG_CHECKING(for major, minor, and makedev)
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[
-@@ -4221,7 +4705,9 @@
- [ac_cv_buggy_getaddrinfo=no],
- [ac_cv_buggy_getaddrinfo=yes],
- [
--if test "${enable_ipv6+set}" = set; then
-+if test "$ac_sys_system" = "Linux-android" -o "$ac_sys_system" = "iOS" -o "$ac_sys_system" = "tvOS" -o "$ac_sys_system" = "watchOS"; then
-+ ac_cv_buggy_getaddrinfo="no"
-+elif test "${enable_ipv6+set}" = set; then
- ac_cv_buggy_getaddrinfo="no -- configured with --(en|dis)able-ipv6"
- else
- ac_cv_buggy_getaddrinfo=yes
-@@ -4821,19 +5307,19 @@
- #
- # In Python 3.2 and older, --with-wide-unicode added a 'u' flag.
- # In Python 3.7 and older, --with-pymalloc added a 'm' flag.
--AC_SUBST(SOABI)
--AC_MSG_CHECKING(ABIFLAGS)
--AC_MSG_RESULT($ABIFLAGS)
--AC_MSG_CHECKING(SOABI)
--SOABI='cpython-'`echo $VERSION | tr -d .`${ABIFLAGS}${PLATFORM_TRIPLET:+-$PLATFORM_TRIPLET}
--AC_MSG_RESULT($SOABI)
-+AC_SUBST([SOABI])
-+AC_MSG_CHECKING([ABIFLAGS])
-+AC_MSG_RESULT([$ABIFLAGS])
-+AC_MSG_CHECKING([SOABI])
-+SOABI='cpython-'`echo $VERSION | tr -d .`${ABIFLAGS}${SOABI_PLATFORM:+-$SOABI_PLATFORM}
-+AC_MSG_RESULT([$SOABI])
+ @requires_load_dynamic
++ @unittest.skipIf(is_apple_mobile, "FIXME: edge case of module loader")
+ def test_issue16421_multiple_modules_in_one_dll(self):
+ # Issue 16421: loading several modules from the same compiled file fails
+ m = '_testimportmultiple'
+@@ -264,6 +267,7 @@
+ self.assertEqual(name, err.exception.name)
- # Release and debug (Py_DEBUG) ABI are compatible, but not Py_TRACE_REFS ABI
- if test "$Py_DEBUG" = 'true' -a "$with_trace_refs" != "yes"; then
- # Similar to SOABI but remove "d" flag from ABIFLAGS
-- AC_SUBST(ALT_SOABI)
-- ALT_SOABI='cpython-'`echo $VERSION | tr -d .``echo $ABIFLAGS | tr -d d`${PLATFORM_TRIPLET:+-$PLATFORM_TRIPLET}
-- AC_DEFINE_UNQUOTED(ALT_SOABI, "${ALT_SOABI}",
-+ AC_SUBST([ALT_SOABI])
-+ ALT_SOABI='cpython-'`echo $VERSION | tr -d .``echo $ABIFLAGS | tr -d d`${SOABI_PLATFORM:+-$SOABI_PLATFORM}
-+ AC_DEFINE_UNQUOTED([ALT_SOABI], ["${ALT_SOABI}"],
- [Alternative SOABI used in debug build to load C extensions built in release mode])
- fi
+ @requires_load_dynamic
++ @unittest.skipIf(is_apple_mobile, "FIXME: edge case of module loader")
+ def test_load_module_extension_file_is_None(self):
+ # When loading an extension module and the file is None, open one
+ # on the behalf of imp.load_dynamic().
+@@ -277,6 +281,7 @@
+ imp.load_module(name, None, *found[1:])
-@@ -5399,28 +5885,35 @@
- AC_MSG_NOTICE([checking for device files])
+ @requires_load_dynamic
++ @unittest.skipIf(is_apple_mobile, "FIXME: edge case of module loader")
+ def test_issue24748_load_module_skips_sys_modules_check(self):
+ name = 'test.imp_dummy'
+ try:
+diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py
+index 97447619b90..9abe0e0b7c0 100644
+--- a/Lib/test/test_import/__init__.py
++++ b/Lib/test/test_import/__init__.py
+@@ -19,7 +19,7 @@
+ from unittest import mock
+
+ from test.support import os_helper
+-from test.support import (is_jython, swap_attr, swap_item, cpython_only)
++from test.support import (is_apple_mobile, is_jython, swap_attr, swap_item, cpython_only)
+ from test.support.import_helper import (
+ forget, make_legacy_pyc, unlink, unload, DirsOnSysPath)
+ from test.support.os_helper import (
+@@ -93,6 +93,8 @@
+ self.assertRegex(str(cm.exception), r"cannot import name 'i_dont_exist' from 'os' \(.*os.py\)")
+
+ @cpython_only
++ @unittest.skipIf(is_apple_mobile,
++ "FIXME: edge case in loader")
+ def test_from_import_missing_attr_has_name_and_so_path(self):
+ import _testcapi
+ with self.assertRaises(ImportError) as cm:
+diff --git a/Lib/test/test_importlib/extension/test_finder.py b/Lib/test/test_importlib/extension/test_finder.py
+index e8065d7dade..d3e180db5eb 100644
+--- a/Lib/test/test_importlib/extension/test_finder.py
++++ b/Lib/test/test_importlib/extension/test_finder.py
+@@ -1,5 +1,5 @@
+-from .. import abc
+-from .. import util
++from test.support import is_apple_mobile
++from test.test_importlib import abc, util
- dnl NOTE: Inform user how to proceed with files when cross compiling.
--if test "x$cross_compiling" = xyes; then
-- if test "${ac_cv_file__dev_ptmx+set}" != set; then
-- AC_MSG_CHECKING([for /dev/ptmx])
-- AC_MSG_RESULT([not set])
-- AC_MSG_ERROR([set ac_cv_file__dev_ptmx to yes/no in your CONFIG_SITE file when cross compiling])
-- fi
-- if test "${ac_cv_file__dev_ptc+set}" != set; then
-- AC_MSG_CHECKING([for /dev/ptc])
-- AC_MSG_RESULT([not set])
-- AC_MSG_ERROR([set ac_cv_file__dev_ptc to yes/no in your CONFIG_SITE file when cross compiling])
-+dnl iOS cross-compile builds are predictable; they won't ever
-+dnl have /dev/ptmx or /dev/ptc, so we can set them explicitly.
-+if test "$ac_sys_system" = "iOS" -o "$ac_sys_system" = "tvOS" -o "$ac_sys_system" = "watchOS" ; then
-+ ac_cv_file__dev_ptmx=no
-+ ac_cv_file__dev_ptc=no
-+else
-+ if test "x$cross_compiling" = xyes; then
-+ if test "${ac_cv_file__dev_ptmx+set}" != set; then
-+ AC_MSG_CHECKING([for /dev/ptmx])
-+ AC_MSG_RESULT([not set])
-+ AC_MSG_ERROR([set ac_cv_file__dev_ptmx to yes/no in your CONFIG_SITE file when cross compiling])
-+ fi
-+ if test "${ac_cv_file__dev_ptc+set}" != set; then
-+ AC_MSG_CHECKING([for /dev/ptc])
-+ AC_MSG_RESULT([not set])
-+ AC_MSG_ERROR([set ac_cv_file__dev_ptc to yes/no in your CONFIG_SITE file when cross compiling])
-+ fi
- fi
--fi
+ machinery = util.import_importlib('importlib.machinery')
--AC_CHECK_FILE(/dev/ptmx, [], [])
--if test "x$ac_cv_file__dev_ptmx" = xyes; then
-- AC_DEFINE(HAVE_DEV_PTMX, 1,
-- [Define to 1 if you have the /dev/ptmx device file.])
--fi
--AC_CHECK_FILE(/dev/ptc, [], [])
--if test "x$ac_cv_file__dev_ptc" = xyes; then
-- AC_DEFINE(HAVE_DEV_PTC, 1,
-- [Define to 1 if you have the /dev/ptc device file.])
-+ AC_CHECK_FILE([/dev/ptmx], [], [])
-+ if test "x$ac_cv_file__dev_ptmx" = xyes; then
-+ AC_DEFINE([HAVE_DEV_PTMX], [1],
-+ [Define to 1 if you have the /dev/ptmx device file.])
-+ fi
-+ AC_CHECK_FILE([/dev/ptc], [], [])
-+ if test "x$ac_cv_file__dev_ptc" = xyes; then
-+ AC_DEFINE([HAVE_DEV_PTC], [1],
-+ [Define to 1 if you have the /dev/ptc device file.])
-+ fi
- fi
+@@ -12,9 +12,27 @@
+ """Test the finder for extension modules."""
- if test $ac_sys_system = Darwin
-@@ -5713,7 +6206,12 @@
- [AS_HELP_STRING([--with-ensurepip@<:@=install|upgrade|no@:>@],
- ["install" or "upgrade" using bundled pip (default is upgrade)])],
- [],
-- [with_ensurepip=upgrade])
-+ [
-+ AS_CASE([$ac_sys_system],
-+ [iOS|tvOS|watchOS], [with_ensurepip=no],
-+ [with_ensurepip=upgrade]
-+ )
-+ ])
- AS_CASE($with_ensurepip,
- [yes|upgrade],[ENSUREPIP=upgrade],
- [install],[ENSUREPIP=install],
---- /dev/null
-+++ b/iOS/README.rst
-@@ -0,0 +1,377 @@
-+====================
-+Python on iOS README
-+====================
-+
-+:Authors:
-+ Russell Keith-Magee (2023-11)
-+
-+This document provides a quick overview of some iOS specific features in the
-+Python distribution.
-+
-+These instructions are only needed if you're planning to compile Python for iOS
-+yourself. Most users should *not* need to do this. If you're looking to
-+experiment with writing an iOS app in Python, tools such as `BeeWare's Briefcase
-+`__ and `Kivy's Buildozer
-+`__ will provide a much more approachable
-+user experience.
-+
-+Compilers for building on iOS
-+=============================
-+
-+Building for iOS requires the use of Apple's Xcode tooling. It is strongly
-+recommended that you use the most recent stable release of Xcode. This will
-+require the use of the most (or second-most) recently released macOS version,
-+as Apple does not maintain Xcode for older macOS versions. The Xcode Command
-+Line Tools are not sufficient for iOS development; you need a *full* Xcode
-+install.
-+
-+If you want to run your code on the iOS simulator, you'll also need to install
-+an iOS Simulator Platform. You should be prompted to select an iOS Simulator
-+Platform when you first run Xcode. Alternatively, you can add an iOS Simulator
-+Platform by selecting an open the Platforms tab of the Xcode Settings panel.
-+
-+iOS specific arguments to configure
-+===================================
-+
-+* ``--enable-framework[=DIR]``
-+
-+ This argument specifies the location where the Python.framework will be
-+ installed. If ``DIR`` is not specified, the framework will be installed into
-+ a subdirectory of the ``iOS/Frameworks`` folder.
-+
-+ This argument *must* be provided when configuring iOS builds. iOS does not
-+ support non-framework builds.
-+
-+* ``--with-framework-name=NAME``
-+
-+ Specify the name for the Python framework; defaults to ``Python``.
-+
-+ .. admonition:: Use this option with care!
-+
-+ Unless you know what you're doing, changing the name of the Python
-+ framework on iOS is not advised. If you use this option, you won't be able
-+ to run the ``make testios`` target without making signficant manual
-+ alterations, and you won't be able to use any binary packages unless you
-+ compile them yourself using your own framework name.
-+
-+Building Python on iOS
-+======================
-+
-+ABIs and Architectures
-+----------------------
-+
-+iOS apps can be deployed on physical devices, and on the iOS simulator. Although
-+the API used on these devices is identical, the ABI is different - you need to
-+link against different libraries for an iOS device build (``iphoneos``) or an
-+iOS simulator build (``iphonesimulator``).
-+
-+Apple uses the ``XCframework`` format to allow specifying a single dependency
-+that supports multiple ABIs. An ``XCframework`` is a wrapper around multiple
-+ABI-specific frameworks that share a common API.
-+
-+iOS can also support different CPU architectures within each ABI. At present,
-+there is only a single supported architecture on physical devices - ARM64.
-+However, the *simulator* supports 2 architectures - ARM64 (for running on Apple
-+Silicon machines), and x86_64 (for running on older Intel-based machines).
-+
-+To support multiple CPU architectures on a single platform, Apple uses a "fat
-+binary" format - a single physical file that contains support for multiple
-+architectures. It is possible to compile and use a "thin" single architecture
-+version of a binary for testing purposes; however, the "thin" binary will not be
-+portable to machines using other architectures.
-+
-+Building a single-architecture framework
-+----------------------------------------
-+
-+The Python build system will create a ``Python.framework`` that supports a
-+*single* ABI with a *single* architecture. Unlike macOS, iOS does not allow a
-+framework to contain non-library content, so the iOS build will produce a
-+``bin`` and ``lib`` folder in the same output folder as ``Python.framework``.
-+The ``lib`` folder will be needed at runtime to support the Python library.
-+
-+If you want to use Python in a real iOS project, you need to produce multiple
-+``Python.framework`` builds, one for each ABI and architecture. iOS builds of
-+Python *must* be constructed as framework builds. To support this, you must
-+provide the ``--enable-framework`` flag when configuring the build. The build
-+also requires the use of cross-compilation. The minimal commands for building
-+Python for the ARM64 iOS simulator will look something like::
-+
-+ $ export PATH="$(pwd)/iOS/Resources/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin"
-+ $ ./configure \
-+ --enable-framework \
-+ --host=arm64-apple-ios-simulator \
-+ --build=arm64-apple-darwin \
-+ --with-build-python=/path/to/python.exe
-+ $ make
-+ $ make install
-+
-+In this invocation:
-+
-+* ``iOS/Resources/bin`` has been added to the path, providing some shims for the
-+ compilers and linkers needed by the build. Xcode requires the use of ``xcrun``
-+ to invoke compiler tooling. However, if ``xcrun`` is pre-evaluated and the
-+ result passed to ``configure``, these results can embed user- and
-+ version-specific paths into the sysconfig data, which limits the portability
-+ of the compiled Python. Alternatively, if ``xcrun`` is used *as* the compiler,
-+ it requires that compiler variables like ``CC`` include spaces, which can
-+ cause significant problems with many C configuration systems which assume that
-+ ``CC`` will be a single executable.
-+
-+ To work around this problem, the ``iOS/Resources/bin`` folder contains some
-+ wrapper scripts that present as simple compilers and linkers, but wrap
-+ underlying calls to ``xcrun``. This allows configure to use a ``CC``
-+ definition without spaces, and without user- or version-specific paths, while
-+ retaining the ability to adapt to the local Xcode install. These scripts are
-+ included in the ``bin`` directory of an iOS install.
-+
-+ These scripts will, by default, use the currently active Xcode installation.
-+ If you want to use a different Xcode installation, you can use
-+ ``xcode-select`` to set a new default Xcode globally, or you can use the
-+ ``DEVELOPER_DIR`` environment variable to specify an Xcode install. The
-+ scripts will use the default ``iphoneos``/``iphonesimulator`` SDK version for
-+ the select Xcode install; if you want to use a different SDK, you can set the
-+ ``IOS_SDK_VERSION`` environment variable. (e.g, setting
-+ ``IOS_SDK_VERSION=17.1`` would cause the scripts to use the ``iphoneos17.1``
-+ and ``iphonesimulator17.1`` SDKs, regardless of the Xcode default.)
-+
-+ The path has also been cleared of any user customizations. A common source of
-+ bugs is for tools like Homebrew to accidentally leak macOS binaries into an iOS
-+ build. Resetting the path to a known "bare bones" value is the easiest way to
-+ avoid these problems.
-+
-+* ``--host`` is the architecture and ABI that you want to build, in GNU compiler
-+ triple format. This will be one of:
-+
-+ - ``arm64-apple-ios`` for ARM64 iOS devices.
-+ - ``arm64-apple-ios-simulator`` for the iOS simulator running on Apple
-+ Silicon devices.
-+ - ``x86_64-apple-ios-simulator`` for the iOS simulator running on Intel
-+ devices.
-+
-+* ``--build`` is the GNU compiler triple for the machine that will be running
-+ the compiler. This is one of:
-+
-+ - ``arm64-apple-darwin`` for Apple Silicon devices.
-+ - ``x86_64-apple-darwin`` for Intel devices.
-+
-+* ``/path/to/python.exe`` is the path to a Python binary on the machine that
-+ will be running the compiler. This is needed because the Python compilation
-+ process involves running some Python code. On a normal desktop build of
-+ Python, you can compile a python interpreter and then use that interpreter to
-+ run Python code. However, the binaries produced for iOS won't run on macOS, so
-+ you need to provide an external Python interpreter. This interpreter must be
-+ the same version as the Python that is being compiled. To be completely safe,
-+ this should be the *exact* same commit hash. However, the longer a Python
-+ release has been stable, the more likely it is that this constraint can be
-+ relaxed - the same micro version will often be sufficient.
-+
-+* The ``install`` target for iOS builds is slightly different to other
-+ platforms. On most platforms, ``make install`` will install the build into
-+ the final runtime location. This won't be the case for iOS, as the final
-+ runtime location will be on a physical device.
-+
-+ However, you still need to run the ``install`` target for iOS builds, as it
-+ performs some final framework assembly steps. The location specified with
-+ ``--enable-framework`` will be the location where ``make install`` will
-+ assemble the complete iOS framework. This completed framework can then
-+ be copied and relocated as required.
-+
-+For a full CPython build, you also need to specify the paths to iOS builds of
-+the binary libraries that CPython depends on (XZ, BZip2, LibFFI and OpenSSL).
-+This can be done by defining the ``LIBLZMA_CFLAGS``, ``LIBLZMA_LIBS``,
-+``BZIP2_CFLAGS``, ``BZIP2_LIBS``, ``LIBFFI_CFLAGS``, and ``LIBFFI_LIBS``
-+environment variables, and the ``--with-openssl`` configure option. Versions of
-+these libraries pre-compiled for iOS can be found in `this repository
-+`__.
-+
-+By default, Python will be compiled with an iOS deployment target (i.e., the
-+minimum supported iOS version) of 13.0. To specify a different deployment
-+target, provide the version number as part of the ``--host`` argument - for
-+example, ``--host=arm64-apple-ios15.4-simulator`` would compile an ARM64
-+simulator build with a deployment target of 15.4.
-+
-+Merge thin frameworks into fat frameworks
-+-----------------------------------------
-+
-+Once you've built a ``Python.framework`` for each ABI and and architecture, you
-+must produce a "fat" framework for each ABI that contains all the architectures
-+for that ABI.
-+
-+The ``iphoneos`` build only needs to support a single architecture, so it can be
-+used without modification.
-+
-+If you only want to support a single simulator architecture, (e.g., only support
-+ARM64 simulators), you can use a single architecture ``Python.framework`` build.
-+However, if you want to create ``Python.xcframework`` that supports *all*
-+architectures, you'll need to merge the ``iphonesimulator`` builds for ARM64 and
-+x86_64 into a single "fat" framework.
-+
-+The "fat" framework can be constructed by performing a directory merge of the
-+content of the two "thin" ``Python.framework`` directories, plus the ``bin`` and
-+``lib`` folders for each thin framework. When performing this merge:
-+
-+* The pure Python standard library content is identical for each architecture,
-+ except for a handful of platform-specific files (such as the ``sysconfig``
-+ module). Ensure that the "fat" framework has the union of all standard library
-+ files.
-+
-+* Any binary files in the standard library, plus the main
-+ ``libPython3.X.dylib``, can be merged using the ``lipo`` tool, provide by
-+ Xcode::
-+
-+ $ lipo -create -output module.dylib path/to/x86_64/module.dylib path/to/arm64/module.dylib
-+
-+* The header files will be indentical on both architectures, except for
-+ ``pyconfig.h``. Copy all the headers from one platform (say, arm64), rename
-+ ``pyconfig.h`` to ``pyconfig-arm64.h``, and copy the ``pyconfig.h`` for the
-+ other architecture into the merged header folder as ``pyconfig-x86_64.h``.
-+ Then copy the ``iOS/Resources/pyconfig.h`` file from the CPython sources into
-+ the merged headers folder. This will allow the two Python architectures to
-+ share a common ``pyconfig.h`` header file.
-+
-+At this point, you should have 2 Python.framework folders - one for ``iphoneos``,
-+and one for ``iphonesimulator`` that is a merge of x86+64 and ARM64 content.
-+
-+Merge frameworks into an XCframework
-+------------------------------------
-+
-+Now that we have 2 (potentially fat) ABI-specific frameworks, we can merge those
-+frameworks into a single ``XCframework``.
-+
-+The initial skeleton of an ``XCframework`` is built using::
-+
-+ xcodebuild -create-xcframework -output Python.xcframework -framework path/to/iphoneos/Python.framework -framework path/to/iphonesimulator/Python.framework
-+
-+Then, copy the ``bin`` and ``lib`` folders into the architecture-specific slices of
-+the XCframework::
-+
-+ cp path/to/iphoneos/bin Python.xcframework/ios-arm64
-+ cp path/to/iphoneos/lib Python.xcframework/ios-arm64
-+
-+ cp path/to/iphonesimulator/bin Python.xcframework/ios-arm64_x86-64-simulator
-+ cp path/to/iphonesimulator/lib Python.xcframework/ios-arm64_x86-64-simulator
-+
-+Note that the name of the architecture-specific slice for the simulator will
-+depend on the CPU architecture that you build.
-+
-+Then, add symbolic links to "common" platform names for each slice::
-+
-+ ln -si ios-arm64 Python.xcframework/iphoneos
-+ ln -si ios-arm64_x86-64-simulator Python.xcframework/iphonesimulator
-+
-+You now have a Python.xcframework that can be used in a project.
-+
-+Testing Python on iOS
-+=====================
-+
-+The ``iOS/testbed`` folder that contains an Xcode project that is able to run
-+the iOS test suite. This project converts the Python test suite into a single
-+test case in Xcode's XCTest framework. The single XCTest passes if the test
-+suite passes.
+ def find_spec(self, fullname):
+- importer = self.machinery.FileFinder(util.EXTENSIONS.path,
+- (self.machinery.ExtensionFileLoader,
+- self.machinery.EXTENSION_SUFFIXES))
++ if is_apple_mobile:
++ # Apple mobile platforms require a specialist loader that uses
++ # .fwork files as placeholders for the true `.so` files.
++ loaders = [
++ (
++ self.machinery.AppleFrameworkLoader,
++ [
++ ext.replace(".so", ".fwork")
++ for ext in self.machinery.EXTENSION_SUFFIXES
++ ]
++ )
++ ]
++ else:
++ loaders = [
++ (
++ self.machinery.ExtensionFileLoader,
++ self.machinery.EXTENSION_SUFFIXES
++ )
++ ]
+
-+To run the test suite, configure a Python build for an iOS simulator (i.e.,
-+``--host=arm64-apple-ios-simulator`` or ``--host=x86_64-apple-ios-simulator``
-+), specifying a framework build (i.e. ``--enable-framework``). Ensure that your
-+``PATH`` has been configured to include the ``iOS/Resources/bin`` folder and
-+exclude any non-iOS tools, then run::
++ importer = self.machinery.FileFinder(util.EXTENSIONS.path, *loaders)
+
+ return importer.find_spec(fullname)
+
+diff --git a/Lib/test/test_importlib/extension/test_loader.py b/Lib/test/test_importlib/extension/test_loader.py
+index 8fd556dbed5..36d9ba9f078 100644
+--- a/Lib/test/test_importlib/extension/test_loader.py
++++ b/Lib/test/test_importlib/extension/test_loader.py
+@@ -1,3 +1,4 @@
++from test.support import is_apple_mobile
+ from warnings import catch_warnings
+ from .. import abc
+ from .. import util
+@@ -18,8 +19,15 @@
+ """Test load_module() for extension modules."""
+
+ def setUp(self):
+- self.loader = self.machinery.ExtensionFileLoader(util.EXTENSIONS.name,
+- util.EXTENSIONS.file_path)
+
-+ $ make all
-+ $ make install
-+ $ make testios
++ # Apple extensions must be distributed as frameworks. This requires
++ # a specialist loader.
++ if is_apple_mobile:
++ self.LoaderClass = self.machinery.AppleFrameworkLoader
++ else:
++ self.LoaderClass = self.machinery.ExtensionFileLoader
+
-+This will:
++ self.loader = self.LoaderClass(util.EXTENSIONS.name, util.EXTENSIONS.file_path)
+
+ def load_module(self, fullname):
+ with warnings.catch_warnings():
+@@ -36,13 +44,11 @@
+ self.load_module('XXX')
+
+ def test_equality(self):
+- other = self.machinery.ExtensionFileLoader(util.EXTENSIONS.name,
+- util.EXTENSIONS.file_path)
++ other = self.LoaderClass(util.EXTENSIONS.name, util.EXTENSIONS.file_path)
+ self.assertEqual(self.loader, other)
+
+ def test_inequality(self):
+- other = self.machinery.ExtensionFileLoader('_' + util.EXTENSIONS.name,
+- util.EXTENSIONS.file_path)
++ other = self.LoaderClass('_' + util.EXTENSIONS.name, util.EXTENSIONS.file_path)
+ self.assertNotEqual(self.loader, other)
+
+ def test_module(self):
+@@ -53,8 +59,7 @@
+ ('__package__', '')]:
+ self.assertEqual(getattr(module, attr), value)
+ self.assertIn(util.EXTENSIONS.name, sys.modules)
+- self.assertIsInstance(module.__loader__,
+- self.machinery.ExtensionFileLoader)
++ self.assertIsInstance(module.__loader__, self.LoaderClass)
+
+ # No extension module as __init__ available for testing.
+ test_package = None
+@@ -81,7 +86,7 @@
+ self.assertFalse(self.loader.is_package(util.EXTENSIONS.name))
+ for suffix in self.machinery.EXTENSION_SUFFIXES:
+ path = os.path.join('some', 'path', 'pkg', '__init__' + suffix)
+- loader = self.machinery.ExtensionFileLoader('pkg', path)
++ loader = self.LoaderClass('pkg', path)
+ self.assertTrue(loader.is_package('pkg'))
+
+ (Frozen_LoaderTests,
+@@ -92,12 +97,19 @@
+ # Test loading extension modules with multi-phase initialization (PEP 489).
+
+ def setUp(self):
+
-+* Build an iOS framework for your chosen architecture;
-+* Finalize the single-platform framework;
-+* Make a clean copy of the testbed project;
-+* Install the Python iOS framework into the copy of the testbed project; and
-+* Run the test suite on an "iPhone SE (3rd generation)" simulator.
++ # Apple extensions must be distributed as frameworks. This requires
++ # a specialist loader.
++ if is_apple_mobile:
++ self.LoaderClass = self.machinery.AppleFrameworkLoader
++ else:
++ self.LoaderClass = self.machinery.ExtensionFileLoader
+
-+On success, the test suite will exit and report successful completion of the
-+test suite. On a 2022 M1 MacBook Pro, the test suite takes approximately 15
-+minutes to run; a couple of extra minutes is required to compile the testbed
-+project, and then boot and prepare the iOS simulator.
+ self.name = '_testmultiphase'
+ finder = self.machinery.FileFinder(None)
+ self.spec = importlib.util.find_spec(self.name)
+ assert self.spec
+- self.loader = self.machinery.ExtensionFileLoader(
+- self.name, self.spec.origin)
++ self.loader = self.LoaderClass(self.name, self.spec.origin)
+
+ def load_module(self):
+ # Load the module from the test extension.
+@@ -108,7 +120,7 @@
+ def load_module_by_name(self, fullname):
+ # Load a module from the test extension by name.
+ origin = self.spec.origin
+- loader = self.machinery.ExtensionFileLoader(fullname, origin)
++ loader = self.LoaderClass(fullname, origin)
+ spec = importlib.util.spec_from_loader(fullname, loader)
+ module = importlib.util.module_from_spec(spec)
+ loader.exec_module(module)
+@@ -134,8 +146,7 @@
+ with self.assertRaises(AttributeError):
+ module.__path__
+ self.assertIs(module, sys.modules[self.name])
+- self.assertIsInstance(module.__loader__,
+- self.machinery.ExtensionFileLoader)
++ self.assertIsInstance(module.__loader__, self.LoaderClass)
+
+ def test_functionality(self):
+ # Test basic functionality of stuff defined in an extension module.
+diff --git a/Lib/test/test_importlib/util.py b/Lib/test/test_importlib/util.py
+index b14ecb51b25..7e58dc321a5 100644
+--- a/Lib/test/test_importlib/util.py
++++ b/Lib/test/test_importlib/util.py
+@@ -13,6 +13,7 @@
+ from pathlib import Path, PurePath
+ from test import support
+ from test.support import import_helper
++from test.support import is_apple_mobile
+ from test.support import os_helper
+ import unittest
+ import sys
+@@ -42,6 +43,11 @@
+ global EXTENSIONS
+ for path in sys.path:
+ for ext in machinery.EXTENSION_SUFFIXES:
++ # Apple mobile platforms mechanically load .so files,
++ # but the findable files are labelled .fwork
++ if is_apple_mobile:
++ ext = ext.replace(".so", ".fwork")
+
-+Debugging test failures
-+-----------------------
+ filename = EXTENSIONS.name + ext
+ file_path = os.path.join(path, filename)
+ if os.path.exists(file_path):
+diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
+index 5e430dad061..ad0728408df 100644
+--- a/Lib/test/test_inspect.py
++++ b/Lib/test/test_inspect.py
+@@ -24,7 +24,7 @@
+ except ImportError:
+ ThreadPoolExecutor = None
+
+-from test.support import cpython_only
++from test.support import cpython_only, is_apple_mobile
+ from test.support import MISSING_C_DOCSTRINGS, ALWAYS_EQ
+ from test.support.import_helper import DirsOnSysPath
+ from test.support.os_helper import TESTFN
+@@ -727,6 +727,7 @@
+ @unittest.skipIf(not hasattr(unicodedata, '__file__') or
+ unicodedata.__file__.endswith('.py'),
+ "unicodedata is not an external binary module")
++ @unittest.skipIf(is_apple_mobile, "FIXME: Edge case of module loader")
+ def test_findsource_binary(self):
+ self.assertRaises(OSError, inspect.getsource, unicodedata)
+ self.assertRaises(OSError, inspect.findsource, unicodedata)
+diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
+index 8dae85ac4f5..54359c36f15 100644
+--- a/Lib/test/test_io.py
++++ b/Lib/test/test_io.py
+@@ -39,11 +39,9 @@
+ from test import support
+ from test.support.script_helper import (
+ assert_python_ok, assert_python_failure, run_python_until_end)
+-from test.support import import_helper
+-from test.support import os_helper
+-from test.support import threading_helper
+-from test.support import warnings_helper
+-from test.support import skip_if_sanitizer
++from test.support import (
++ import_helper, is_apple, os_helper, skip_if_sanitizer, threading_helper, warnings_helper
++)
+ from test.support.os_helper import FakePath
+
+ import codecs
+@@ -598,10 +596,10 @@
+ self.read_ops(f, True)
+
+ def test_large_file_ops(self):
+- # On Windows and Mac OSX this test consumes large resources; It takes
+- # a long time to build the >2 GiB file and takes >2 GiB of disk space
+- # therefore the resource must be enabled to run this test.
+- if sys.platform[:3] == 'win' or sys.platform == 'darwin':
++ # On Windows and Apple platforms this test consumes large resources; It
++ # takes a long time to build the >2 GiB file and takes >2 GiB of disk
++ # space therefore the resource must be enabled to run this test.
++ if sys.platform[:3] == 'win' or is_apple:
+ support.requires(
+ 'largefile',
+ 'test requires %s bytes and a long time to run' % self.LARGE)
+diff --git a/Lib/test/test_json/test_tool.py b/Lib/test/test_json/test_tool.py
+index 1d7fca6efb1..0715cc75b66 100644
+--- a/Lib/test/test_json/test_tool.py
++++ b/Lib/test/test_json/test_tool.py
+@@ -85,6 +85,7 @@
+ }
+ """)
+
++ @support.requires_subprocess()
+ def test_stdin_stdout(self):
+ args = sys.executable, '-m', 'json.tool'
+ process = subprocess.run(args, input=self.data, capture_output=True, text=True, check=True)
+@@ -140,6 +141,7 @@
+ self.assertEqual(out, b'')
+ self.assertEqual(err, b'')
+
++ @support.requires_subprocess()
+ def test_jsonlines(self):
+ args = sys.executable, '-m', 'json.tool', '--json-lines'
+ process = subprocess.run(args, input=self.jsonlines_raw, capture_output=True, text=True, check=True)
+@@ -160,6 +162,7 @@
+ self.expect_without_sort_keys.encode().splitlines())
+ self.assertEqual(err, b'')
+
++ @support.requires_subprocess()
+ def test_indent(self):
+ input_ = '[1, 2]'
+ expect = textwrap.dedent('''\
+@@ -173,6 +176,7 @@
+ self.assertEqual(process.stdout, expect)
+ self.assertEqual(process.stderr, '')
+
++ @support.requires_subprocess()
+ def test_no_indent(self):
+ input_ = '[1,\n2]'
+ expect = '[1, 2]\n'
+@@ -181,6 +185,7 @@
+ self.assertEqual(process.stdout, expect)
+ self.assertEqual(process.stderr, '')
+
++ @support.requires_subprocess()
+ def test_tab(self):
+ input_ = '[1, 2]'
+ expect = '[\n\t1,\n\t2\n]\n'
+@@ -189,6 +194,7 @@
+ self.assertEqual(process.stdout, expect)
+ self.assertEqual(process.stderr, '')
+
++ @support.requires_subprocess()
+ def test_compact(self):
+ input_ = '[ 1 ,\n 2]'
+ expect = '[1,2]\n'
+@@ -197,6 +203,7 @@
+ self.assertEqual(process.stdout, expect)
+ self.assertEqual(process.stderr, '')
+
++ @unittest.skipIf(support.is_apple_mobile, "FIXME: Edge case in encoding handling")
+ def test_no_ensure_ascii_flag(self):
+ infile = self._create_infile('{"key":"💩"}')
+ outfile = os_helper.TESTFN + '.out'
+@@ -208,6 +215,7 @@
+ expected = [b'{', b' "key": "\xf0\x9f\x92\xa9"', b"}"]
+ self.assertEqual(lines, expected)
+
++ @unittest.skipIf(support.is_apple_mobile, "FIXME: Edge case in encoding handling")
+ def test_ensure_ascii_default(self):
+ infile = self._create_infile('{"key":"💩"}')
+ outfile = os_helper.TESTFN + '.out'
+@@ -220,6 +228,7 @@
+ self.assertEqual(lines, expected)
+
+ @unittest.skipIf(sys.platform =="win32", "The test is failed with ValueError on Windows")
++ @support.requires_subprocess()
+ def test_broken_pipe_error(self):
+ cmd = [sys.executable, '-m', 'json.tool']
+ proc = subprocess.Popen(cmd,
+diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py
+index 74e950450cf..b3dc348d2bc 100644
+--- a/Lib/test/test_logging.py
++++ b/Lib/test/test_logging.py
+@@ -43,6 +43,7 @@
+ import tempfile
+ from test.support.script_helper import assert_python_ok, assert_python_failure
+ from test import support
++from test.support import is_apple_mobile
+ from test.support import os_helper
+ from test.support import socket_helper
+ from test.support import threading_helper
+diff --git a/Lib/test/test_mailcap.py b/Lib/test/test_mailcap.py
+index 32f07ab290f..3ca7616feef 100644
+--- a/Lib/test/test_mailcap.py
++++ b/Lib/test/test_mailcap.py
+@@ -2,7 +2,7 @@
+ import os
+ import copy
+ import test.support
+-from test.support import os_helper
++from test.support import os_helper, requires_subprocess
+ import unittest
+ import sys
+
+@@ -220,6 +220,7 @@
+
+ @unittest.skipUnless(os.name == "posix", "Requires 'test' command on system")
+ @unittest.skipIf(sys.platform == "vxworks", "'test' command is not supported on VxWorks")
++ @requires_subprocess()
+ def test_test(self):
+ # findmatch() will automatically check any "test" conditions and skip
+ # the entry if the check fails.
+diff --git a/Lib/test/test_marshal.py b/Lib/test/test_marshal.py
+index 7bcf8e8399a..6ff818ac893 100644
+--- a/Lib/test/test_marshal.py
++++ b/Lib/test/test_marshal.py
+@@ -1,5 +1,5 @@
+ from test import support
+-from test.support import os_helper
++from test.support import is_apple_mobile, os_helper
+ import array
+ import io
+ import marshal
+@@ -233,6 +233,8 @@
+ #if os.name == 'nt' and hasattr(sys, 'gettotalrefcount'):
+ if os.name == 'nt':
+ MAX_MARSHAL_STACK_DEPTH = 1000
++ elif is_apple_mobile:
++ MAX_MARSHAL_STACK_DEPTH = 1500
+ else:
+ MAX_MARSHAL_STACK_DEPTH = 2000
+ for i in range(MAX_MARSHAL_STACK_DEPTH - 2):
+diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py
+index 307e2b93559..f241bfdaaa7 100644
+--- a/Lib/test/test_mmap.py
++++ b/Lib/test/test_mmap.py
+@@ -1,4 +1,6 @@
+-from test.support import (requires, _2G, _4G, gc_collect, cpython_only)
++from test.support import (
++ requires, _2G, _4G, gc_collect, cpython_only, is_apple,
++)
+ from test.support.import_helper import import_module
+ from test.support.os_helper import TESTFN, unlink
+ import unittest
+@@ -811,7 +813,7 @@
+ unlink(TESTFN)
+
+ def _make_test_file(self, num_zeroes, tail):
+- if sys.platform[:3] == 'win' or sys.platform == 'darwin':
++ if sys.platform[:3] == 'win' or is_apple:
+ requires('largefile',
+ 'test requires %s bytes and a long time to run' % str(0x180000000))
+ f = open(TESTFN, 'w+b')
+diff --git a/Lib/test/test_multiprocessing_fork.py b/Lib/test/test_multiprocessing_fork.py
+index 5000edb7c5c..5c2f1e08cc9 100644
+--- a/Lib/test/test_multiprocessing_fork.py
++++ b/Lib/test/test_multiprocessing_fork.py
+@@ -13,6 +13,9 @@
+ if sys.platform == 'darwin':
+ raise unittest.SkipTest("test may crash on macOS (bpo-33725)")
+
++if support.is_apple_mobile:
++ raise unittest.SkipTest("Can't use fork on Apple mobile")
+
-+Running ``make test`` generates a standalone version of the ``iOS/testbed``
-+project, and runs the full test suite. It does this using ``iOS/testbed``
-+itself - the folder is an executable module that can be used to create and run
-+a clone of the testbed project.
+ test._test_multiprocessing.install_tests_in_module_dict(globals(), 'fork')
+
+ if __name__ == '__main__':
+diff --git a/Lib/test/test_multiprocessing_forkserver.py b/Lib/test/test_multiprocessing_forkserver.py
+index 6ad5faf9e8a..0c0f470b6d3 100644
+--- a/Lib/test/test_multiprocessing_forkserver.py
++++ b/Lib/test/test_multiprocessing_forkserver.py
+@@ -10,6 +10,9 @@
+ if sys.platform == "win32":
+ raise unittest.SkipTest("forkserver is not available on Windows")
+
++if support.is_apple_mobile:
++ raise unittest.SkipTest("Can't use fork on Apple mobile")
+
-+You can generate your own standalone testbed instance by running::
+ test._test_multiprocessing.install_tests_in_module_dict(globals(), 'forkserver')
+
+ if __name__ == '__main__':
+diff --git a/Lib/test/test_multiprocessing_spawn.py b/Lib/test/test_multiprocessing_spawn.py
+index 6558952308f..9c3901a63f3 100644
+--- a/Lib/test/test_multiprocessing_spawn.py
++++ b/Lib/test/test_multiprocessing_spawn.py
+@@ -6,6 +6,9 @@
+ if support.PGO:
+ raise unittest.SkipTest("test is not helpful for PGO")
+
++if support.is_apple_mobile:
++ raise unittest.SkipTest("Can't use fork on Apple mobile")
+
-+ $ python iOS/testbed clone --framework iOS/Frameworks/arm64-iphonesimulator my-testbed
+ test._test_multiprocessing.install_tests_in_module_dict(globals(), 'spawn')
+
+ if __name__ == '__main__':
+diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
+index 044ce5c1a39..8daa5f4071d 100644
+--- a/Lib/test/test_os.py
++++ b/Lib/test/test_os.py
+@@ -33,6 +33,8 @@
+ from test import support
+ from test.support import import_helper
+ from test.support import os_helper
++from test.support import requires_fork
++from test.support import requires_subprocess
+ from test.support import socket_helper
+ from test.support import threading_helper
+ from test.support import warnings_helper
+@@ -1095,6 +1097,7 @@
+ value_str = value.decode(sys.getfilesystemencoding(), 'surrogateescape')
+ self.assertEqual(os.environ['bytes'], value_str)
+
++ @requires_subprocess()
+ def test_putenv_unsetenv(self):
+ name = "PYTHONTESTVAR"
+ value = "testvalue"
+@@ -2180,6 +2183,7 @@
+ self.check(os.fchown, -1, -1)
+
+ @unittest.skipUnless(hasattr(os, 'fpathconf'), 'test needs os.fpathconf()')
++ @unittest.skipIf(support.is_apple_mobile, "gh-118201: Test is flaky on iOS")
+ def test_fpathconf(self):
+ self.check(os.pathconf, "PC_NAME_MAX")
+ self.check(os.fpathconf, "PC_NAME_MAX")
+@@ -2306,6 +2310,7 @@
+ self.assertRaises(OverflowError, os.setreuid, 0, self.UID_OVERFLOW)
+
+ @unittest.skipUnless(hasattr(os, 'setreuid'), 'test needs os.setreuid()')
++ @requires_subprocess()
+ def test_setreuid_neg1(self):
+ # Needs to accept -1. We run this in a subprocess to avoid
+ # altering the test runner's process state (issue8045).
+@@ -2323,6 +2328,7 @@
+ self.assertRaises(OverflowError, os.setregid, 0, self.GID_OVERFLOW)
+
+ @unittest.skipUnless(hasattr(os, 'setregid'), 'test needs os.setregid()')
++ @requires_subprocess()
+ def test_setregid_neg1(self):
+ # Needs to accept -1. We run this in a subprocess to avoid
+ # altering the test runner's process state (issue8045).
+@@ -2995,6 +3001,7 @@
+
+ class PidTests(unittest.TestCase):
+ @unittest.skipUnless(hasattr(os, 'getppid'), "test needs os.getppid")
++ @requires_subprocess()
+ def test_getppid(self):
+ p = subprocess.Popen([sys.executable, '-c',
+ 'import os; print(os.getppid())'],
+@@ -3003,6 +3010,7 @@
+ # We are the parent of our subprocess
+ self.assertEqual(int(stdout), os.getpid())
+
++ @requires_fork()
+ def check_waitpid(self, code, exitcode, callback=None):
+ if sys.platform == 'win32':
+ # On Windows, os.spawnv() simply joins arguments with spaces:
+@@ -3065,6 +3073,7 @@
+ self.check_waitpid(code, exitcode=-signum, callback=kill_process)
+
+
++@requires_fork()
+ class SpawnTests(unittest.TestCase):
+ def create_args(self, *, with_env=False, use_bytes=False):
+ self.exitcode = 17
+@@ -3147,6 +3156,7 @@
+ self.assertEqual(exitcode, self.exitcode)
+
+ @requires_os_func('spawnv')
++ @requires_fork()
+ def test_nowait(self):
+ args = self.create_args()
+ pid = os.spawnv(os.P_NOWAIT, args[0], args)
+@@ -3690,6 +3700,7 @@
+ self.assertGreaterEqual(size.columns, 0)
+ self.assertGreaterEqual(size.lines, 0)
+
++ @support.requires_subprocess()
+ def test_stty_match(self):
+ """Check if stty returns the same results
+
+diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py
+index bf3fc5fb249..3da409e9917 100644
+--- a/Lib/test/test_pathlib.py
++++ b/Lib/test/test_pathlib.py
+@@ -12,6 +12,7 @@
+ from unittest import mock
+
+ from test.support import import_helper
++from test.support import is_apple_mobile
+ from test.support import os_helper
+ from test.support.os_helper import TESTFN, FakePath
+
+@@ -1468,6 +1469,7 @@
+ self.assertIs(type(p), type(q))
+ self.assertTrue(p.is_absolute())
+
++ @unittest.skipIf(is_apple_mobile, "No home folder on Apple mobile")
+ def test_home(self):
+ with os_helper.EnvironmentVarGuard() as env:
+ self._test_home(self.cls.home())
+@@ -2546,6 +2548,7 @@
+ 'pwd module does not expose getpwall()')
+ @unittest.skipIf(sys.platform == "vxworks",
+ "no home directory on VxWorks")
++ @unittest.skipIf(is_apple_mobile, "No home folder on Apple mobile")
+ def test_expanduser(self):
+ P = self.cls
+ import_helper.import_module('pwd')
+diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py
+index 77f68084482..94cde4008ea 100644
+--- a/Lib/test/test_pdb.py
++++ b/Lib/test/test_pdb.py
+@@ -13,7 +13,7 @@
+
+ from contextlib import ExitStack, redirect_stdout
+ from io import StringIO
+-from test.support import os_helper
++from test.support import os_helper, requires_subprocess
+ # This little helper class is essential for testing pdb under doctest.
+ from test.test_doctest import _FakeInput
+ from unittest.mock import patch
+@@ -1531,6 +1531,7 @@
+ """
+
+
++@requires_subprocess()
+ class PdbTestCase(unittest.TestCase):
+ def tearDown(self):
+ os_helper.unlink(os_helper.TESTFN)
+diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py
+index 2d41166644a..964e8fa3154 100644
+--- a/Lib/test/test_platform.py
++++ b/Lib/test/test_platform.py
+@@ -10,6 +10,14 @@
+ from test import support
+ from test.support import os_helper
+
++try:
++ # Some of the iOS tests need ctypes to operate.
++ # Confirm that the ctypes module is available
++ # is available.
++ import _ctypes
++except ImportError:
++ _ctypes = None
+
-+This invocation assumes that ``iOS/Frameworks/arm64-iphonesimulator`` is the
-+path to the iOS simulator framework for your platform (ARM64 in this case);
-+``my-testbed`` is the name of the folder for the new testbed clone.
+ FEDORA_OS_RELEASE = """\
+ NAME=Fedora
+ VERSION="32 (Thirty Two)"
+@@ -228,6 +236,29 @@
+ self.assertEqual(res[-1], res.processor)
+ self.assertEqual(len(res), 6)
+
++ if os.name == "posix":
++ uname = os.uname()
++ self.assertEqual(res.node, uname.nodename)
++ self.assertEqual(res.version, uname.version)
++ self.assertEqual(res.machine, uname.machine)
+
-+You can then use the ``my-testbed`` folder to run the Python test suite,
-+passing in any command line arguments you may require. For example, if you're
-+trying to diagnose a failure in the ``os`` module, you might run::
++ if sys.platform == "android":
++ self.assertEqual(res.system, "Android")
++ self.assertEqual(res.release, platform.android_ver().release)
++ elif sys.platform == "ios":
++ # Platform module needs ctypes for full operation. If ctypes
++ # isn't available, there's no ObjC module, and dummy values are
++ # returned.
++ if _ctypes:
++ self.assertIn(res.system, {"iOS", "iPadOS"})
++ self.assertEqual(res.release, platform.ios_ver().release)
++ else:
++ self.assertEqual(res.system, "")
++ self.assertEqual(res.release, "")
++ else:
++ self.assertEqual(res.system, uname.sysname)
++ self.assertEqual(res.release, uname.release)
+
-+ $ python my-testbed run -- test -W test_os
+ def test_uname_cast_to_tuple(self):
+ res = platform.uname()
+ expected = (
+@@ -277,6 +308,7 @@
+ self.assertIn('processor', res)
+
+ @unittest.skipIf(sys.platform in ['win32', 'OpenVMS'], "uname -p not used")
++ @support.requires_subprocess()
+ def test_uname_processor(self):
+ """
+ On some systems, the processor must match the output
+@@ -318,6 +350,7 @@
+ def test_win32_ver(self):
+ res = platform.win32_ver()
+
++ @support.requires_subprocess()
+ def test_mac_ver(self):
+ res = platform.mac_ver()
+
+@@ -370,6 +403,56 @@
+ # parent
+ support.wait_process(pid, exitcode=0)
+
++ def test_ios_ver(self):
++ result = platform.ios_ver()
+
-+This is the equivalent of running ``python -m test -W test_os`` on a desktop
-+Python build. Any arguments after the ``--`` will be passed to testbed as if
-+they were arguments to ``python -m`` on a desktop machine.
++ # ios_ver is only fully available on iOS where ctypes is available.
++ if sys.platform == "ios" and _ctypes:
++ system, release, model, is_simulator = result
++ # Result is a namedtuple
++ self.assertEqual(result.system, system)
++ self.assertEqual(result.release, release)
++ self.assertEqual(result.model, model)
++ self.assertEqual(result.is_simulator, is_simulator)
+
-+You can also open the testbed project in Xcode by running::
++ # We can't assert specific values without reproducing the logic of
++ # ios_ver(), so we check that the values are broadly what we expect.
+
-+ $ open my-testbed/iOSTestbed.xcodeproj
++ # System is either iOS or iPadOS, depending on the test device
++ self.assertIn(system, {"iOS", "iPadOS"})
+
-+This will allow you to use the full Xcode suite of tools for debugging.
++ # Release is a numeric version specifier with at least 2 parts
++ parts = release.split(".")
++ self.assertGreaterEqual(len(parts), 2)
++ self.assertTrue(all(part.isdigit() for part in parts))
+
-+Testing on an iOS device
-+^^^^^^^^^^^^^^^^^^^^^^^^
++ # If this is a simulator, we get a high level device descriptor
++ # with no identifying model number. If this is a physical device,
++ # we get a model descriptor like "iPhone13,1"
++ if is_simulator:
++ self.assertIn(model, {"iPhone", "iPad"})
++ else:
++ self.assertTrue(
++ (model.startswith("iPhone") or model.startswith("iPad"))
++ and "," in model
++ )
+
-+To test on an iOS device, the app needs to be signed with known developer
-+credentials. To obtain these credentials, you must have an iOS Developer
-+account, and your Xcode install will need to be logged into your account (see
-+the Accounts tab of the Preferences dialog).
++ self.assertEqual(type(is_simulator), bool)
++ else:
++ # On non-iOS platforms, calling ios_ver doesn't fail; you get
++ # default values
++ self.assertEqual(result.system, "")
++ self.assertEqual(result.release, "")
++ self.assertEqual(result.model, "")
++ self.assertFalse(result.is_simulator)
+
-+Once the project is open, and you're signed into your Apple Developer account,
-+select the root node of the project tree (labeled "iOSTestbed"), then the
-+"Signing & Capabilities" tab in the details page. Select a development team
-+(this will likely be your own name), and plug in a physical device to your
-+macOS machine with a USB cable. You should then be able to select your physical
-+device from the list of targets in the pulldown in the Xcode titlebar.
++ # Check the fallback values can be overridden by arguments
++ override = platform.ios_ver("Foo", "Bar", "Whiz", True)
++ self.assertEqual(override.system, "Foo")
++ self.assertEqual(override.release, "Bar")
++ self.assertEqual(override.model, "Whiz")
++ self.assertTrue(override.is_simulator)
+
-+Running specific tests
-+^^^^^^^^^^^^^^^^^^^^^^
-+
-+As the test suite is being executed on an iOS simulator, it is not possible to
-+pass in command line arguments to configure test suite operation. To work
-+around this limitation, the arguments that would normally be passed as command
-+line arguments are configured as part of the ``iOSTestbed-Info.plist`` file
-+that is used to configure the iOS testbed app. In this file, the ``TestArgs``
-+key is an array containing the arguments that would be passed to ``python -m``
-+on the command line (including ``test`` in position 0, the name of the test
-+module to be executed).
-+
-+Disabling automated breakpoints
-+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-+
-+By default, Xcode will inserts an automatic breakpoint whenever a signal is
-+raised. The Python test suite raises many of these signals as part of normal
-+operation; unless you are trying to diagnose an issue with signals, the
-+automatic breakpoints can be inconvenient. However, they can be disabled by
-+creating a symbolic breakpoint that is triggered at the start of the test run.
-+
-+Select "Debug > Breakpoints > Create Symbolic Breakpoint" from the Xcode menu, and
-+populate the new brewpoint with the following details:
-+
-+* **Name**: IgnoreSignals
-+* **Symbol**: UIApplicationMain
-+* **Action**: Add debugger commands for:
-+ - ``process handle SIGINT -n true -p true -s false``
-+ - ``process handle SIGUSR1 -n true -p true -s false``
-+ - ``process handle SIGUSR2 -n true -p true -s false``
-+ - ``process handle SIGXFSZ -n true -p true -s false``
-+* Check the "Automatically continue after evaluating" box.
-+
-+All other details can be left blank. When the process executes the
-+``UIApplicationMain`` entry point, the breakpoint will trigger, run the debugger
-+commands to disable the automatic breakpoints, and automatically resume.
---- /dev/null
-+++ b/iOS/Resources/Info.plist.in
-@@ -0,0 +1,34 @@
-+
-+
-+
-+
-+ CFBundleDevelopmentRegion
-+ en
-+ CFBundleExecutable
-+ Python
-+ CFBundleGetInfoString
-+ Python Runtime and Library
-+ CFBundleIdentifier
-+ @PYTHONFRAMEWORKIDENTIFIER@
-+ CFBundleInfoDictionaryVersion
-+ 6.0
-+ CFBundleName
-+ Python
-+ CFBundlePackageType
-+ FMWK
-+ CFBundleShortVersionString
-+ %VERSION%
-+ CFBundleLongVersionString
-+ %VERSION%, (c) 2001-2024 Python Software Foundation.
-+ CFBundleSignature
-+ ????
-+ CFBundleVersion
-+ %VERSION%
-+ CFBundleSupportedPlatforms
-+
-+ iPhoneOS
-+
-+ MinimumOSVersion
-+ @IPHONEOS_DEPLOYMENT_TARGET@
-+
-+
---- /dev/null
-+++ b/iOS/Resources/bin/arm64-apple-ios-ar
-@@ -0,0 +1,2 @@
-+#!/bin/sh
-+xcrun --sdk iphoneos${IOS_SDK_VERSION} ar "$@"
---- /dev/null
-+++ b/iOS/Resources/bin/arm64-apple-ios-clang
-@@ -0,0 +1,2 @@
-+#!/bin/sh
-+xcrun --sdk iphoneos${IOS_SDK_VERSION} clang -target arm64-apple-ios "$@"
---- /dev/null
-+++ b/iOS/Resources/bin/arm64-apple-ios-clang++
-@@ -0,0 +1,2 @@
-+#!/bin/sh
-+xcrun --sdk iphoneos${IOS_SDK_VERSION} clang++ -target arm64-apple-ios "$@"
---- /dev/null
-+++ b/iOS/Resources/bin/arm64-apple-ios-cpp
-@@ -0,0 +1,2 @@
-+#!/bin/sh
-+xcrun --sdk iphoneos${IOS_SDK_VERSION} clang -target arm64-apple-ios -E "$@"
---- /dev/null
-+++ b/iOS/Resources/bin/arm64-apple-ios-simulator-ar
-@@ -0,0 +1,2 @@
-+#!/bin/sh
-+xcrun --sdk iphonesimulator${IOS_SDK_VERSION} ar "$@"
---- /dev/null
-+++ b/iOS/Resources/bin/arm64-apple-ios-simulator-clang
-@@ -0,0 +1,2 @@
-+#!/bin/sh
-+xcrun --sdk iphonesimulator${IOS_SDK_VERSION} clang -target arm64-apple-ios-simulator "$@"
---- /dev/null
-+++ b/iOS/Resources/bin/arm64-apple-ios-simulator-clang++
-@@ -0,0 +1,2 @@
-+#!/bin/sh
-+xcrun --sdk iphonesimulator${IOS_SDK_VERSION} clang++ -target arm64-apple-ios-simulator "$@"
---- /dev/null
-+++ b/iOS/Resources/bin/arm64-apple-ios-simulator-cpp
-@@ -0,0 +1,2 @@
-+#!/bin/sh
-+xcrun --sdk iphonesimulator${IOS_SDK_VERSION} clang -target arm64-apple-ios-simulator -E "$@"
---- /dev/null
-+++ b/iOS/Resources/bin/x86_64-apple-ios-simulator-ar
-@@ -0,0 +1,2 @@
-+#!/bin/sh
-+xcrun --sdk iphonesimulator${IOS_SDK_VERSION} ar "$@"
---- /dev/null
-+++ b/iOS/Resources/bin/x86_64-apple-ios-simulator-clang
-@@ -0,0 +1,2 @@
-+#!/bin/sh
-+xcrun --sdk iphonesimulator${IOS_SDK_VERSION} clang -target x86_64-apple-ios-simulator "$@"
---- /dev/null
-+++ b/iOS/Resources/bin/x86_64-apple-ios-simulator-clang++
-@@ -0,0 +1,2 @@
-+#!/bin/sh
-+xcrun --sdk iphonesimulator${IOS_SDK_VERSION} clang++ -target x86_64-apple-ios-simulator "$@"
---- /dev/null
-+++ b/iOS/Resources/bin/x86_64-apple-ios-simulator-cpp
-@@ -0,0 +1,2 @@
-+#!/bin/sh
-+xcrun --sdk iphonesimulator${IOS_SDK_VERSION} clang -target x86_64-apple-ios-simulator -E "$@"
---- /dev/null
-+++ b/iOS/Resources/dylib-Info-template.plist
-@@ -0,0 +1,26 @@
-+
-+
-+
-+
-+ CFBundleDevelopmentRegion
-+ en
-+ CFBundleExecutable
-+
-+ CFBundleIdentifier
-+
-+ CFBundleInfoDictionaryVersion
-+ 6.0
-+ CFBundlePackageType
-+ APPL
-+ CFBundleShortVersionString
-+ 1.0
-+ CFBundleSupportedPlatforms
-+
-+ iPhoneOS
-+
-+ MinimumOSVersion
-+ 12.0
-+ CFBundleVersion
-+ 1
-+
-+
---- /dev/null
-+++ b/iOS/Resources/pyconfig.h
-@@ -0,0 +1,7 @@
-+#ifdef __arm64__
-+#include "pyconfig-arm64.h"
-+#endif
+ def test_libc_ver(self):
+ # check that libc_ver(executable) doesn't raise an exception
+ if os.path.isdir(sys.executable) and \
+@@ -464,7 +547,8 @@
+ 'root:xnu-4570.71.2~1/RELEASE_X86_64'),
+ 'x86_64', 'i386')
+ arch = ('64bit', '')
+- with mock.patch.object(platform, 'uname', return_value=uname), \
++ with mock.patch.object(sys, "platform", "darwin"), \
++ mock.patch.object(platform, 'uname', return_value=uname), \
+ mock.patch.object(platform, 'architecture', return_value=arch):
+ for mac_ver, expected_terse, expected in [
+ # darwin: mac_ver() returns empty strings
+diff --git a/Lib/test/test_poll.py b/Lib/test/test_poll.py
+index 82bbb3af9f1..2a09eed55b6 100644
+--- a/Lib/test/test_poll.py
++++ b/Lib/test/test_poll.py
+@@ -8,6 +8,7 @@
+ import time
+ import unittest
+ from test.support import cpython_only
++from test.support import requires_subprocess
+ from test.support import threading_helper
+ from test.support.os_helper import TESTFN
+
+@@ -120,6 +121,7 @@
+ # Another test case for poll(). This is copied from the test case for
+ # select(), modified to use poll() instead.
+
++ @requires_subprocess()
+ def test_poll2(self):
+ cmd = 'for i in 0 1 2 3 4 5 6 7 8 9; do echo testing...; sleep 1; done'
+ proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
+diff --git a/Lib/test/test_popen.py b/Lib/test/test_popen.py
+index cac2f6177f3..50ceffc81b8 100644
+--- a/Lib/test/test_popen.py
++++ b/Lib/test/test_popen.py
+@@ -7,7 +7,7 @@
+ from test import support
+ import os, sys
+
+-if not hasattr(os, 'popen'):
++if not hasattr(os, 'popen') or support.is_apple_mobile:
+ raise unittest.SkipTest("need os.popen()")
+
+ # Test that command-lines get down as we expect.
+diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py
+index 19bc8853159..e2308875a30 100644
+--- a/Lib/test/test_posix.py
++++ b/Lib/test/test_posix.py
+@@ -555,6 +555,7 @@
+
+ @unittest.skipUnless(hasattr(posix, 'confstr'),
+ 'test needs posix.confstr()')
++ @unittest.skipIf(support.is_apple_mobile, "gh-118201: Test is flaky on iOS")
+ def test_confstr(self):
+ self.assertRaises(ValueError, posix.confstr, "CS_garbage")
+ self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
+@@ -766,9 +767,10 @@
+ check_stat(uid, gid)
+ self.assertRaises(OSError, chown_func, first_param, 0, -1)
+ check_stat(uid, gid)
+- if 0 not in os.getgroups():
+- self.assertRaises(OSError, chown_func, first_param, -1, 0)
+- check_stat(uid, gid)
++ if hasattr(os, 'getgroups'):
++ if 0 not in os.getgroups():
++ self.assertRaises(OSError, chown_func, first_param, -1, 0)
++ check_stat(uid, gid)
+ # test illegal types
+ for t in str, float:
+ self.assertRaises(TypeError, chown_func, first_param, t(uid), gid)
+@@ -1048,6 +1050,7 @@
+ @unittest.skipUnless(hasattr(posix, 'getgrouplist'), "test needs posix.getgrouplist()")
+ @unittest.skipUnless(hasattr(pwd, 'getpwuid'), "test needs pwd.getpwuid()")
+ @unittest.skipUnless(hasattr(os, 'getuid'), "test needs os.getuid()")
++ @unittest.skipIf(support.is_apple_mobile, "FIXME: edge case of getpwuid() on simulator")
+ def test_getgrouplist(self):
+ user = pwd.getpwuid(os.getuid())[0]
+ group = pwd.getpwuid(os.getuid())[3]
+@@ -1056,6 +1059,7 @@
+
+ @unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()")
+ @unittest.skipUnless(hasattr(os, 'popen'), "test needs os.popen()")
++ @support.requires_subprocess()
+ def test_getgroups(self):
+ with os.popen('id -G 2>/dev/null') as idg:
+ groups = idg.read().strip()
+@@ -1113,8 +1117,8 @@
+ self.assertIsInstance(lo, int)
+ self.assertIsInstance(hi, int)
+ self.assertGreaterEqual(hi, lo)
+- # OSX evidently just returns 15 without checking the argument.
+- if sys.platform != "darwin":
++ # Apple plaforms return 15 without checking the argument.
++ if not support.is_apple:
+ self.assertRaises(OSError, posix.sched_get_priority_min, -23)
+ self.assertRaises(OSError, posix.sched_get_priority_max, -23)
+
+@@ -1880,11 +1884,13 @@
+
+
+ @unittest.skipUnless(hasattr(os, 'posix_spawn'), "test needs os.posix_spawn")
++@support.requires_subprocess()
+ class TestPosixSpawn(unittest.TestCase, _PosixSpawnMixin):
+ spawn_func = getattr(posix, 'posix_spawn', None)
+
+
+ @unittest.skipUnless(hasattr(os, 'posix_spawnp'), "test needs os.posix_spawnp")
++@support.requires_subprocess()
+ class TestPosixSpawnP(unittest.TestCase, _PosixSpawnMixin):
+ spawn_func = getattr(posix, 'posix_spawnp', None)
+
+diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py
+index cef227cba60..f06bed405d6 100644
+--- a/Lib/test/test_posixpath.py
++++ b/Lib/test/test_posixpath.py
+@@ -7,6 +7,7 @@
+ from test import support
+ from test import test_genericpath
+ from test.support import import_helper
++from test.support import is_apple_mobile
+ from test.support import os_helper
+ from test.support.os_helper import FakePath
+ from unittest import mock
+@@ -289,6 +290,7 @@
+
+ @unittest.skipIf(sys.platform == "vxworks",
+ "no home directory on VxWorks")
++ @unittest.skipIf(is_apple_mobile, "FIXME: Edge case of getpwuid handling")
+ def test_expanduser_pwd(self):
+ pwd = import_helper.import_module('pwd')
+
+diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py
+index 0243b8a30b9..f300555eaa1 100644
+--- a/Lib/test/test_pty.py
++++ b/Lib/test/test_pty.py
+@@ -1,20 +1,24 @@
+-from test.support import verbose, reap_children
++import sys
++import unittest
++from test.support import is_apple_mobile, reap_children, verbose
+ from test.support.import_helper import import_module
++from test.support.os_helper import TESTFN, unlink
+
+ # Skip these tests if termios is not available
+ import_module('termios')
+
++# Skip tests on WASM platforms, plus iOS/tvOS/watchOS
++if is_apple_mobile:
++ raise unittest.SkipTest(f"pty tests not required on {sys.platform}")
+
-+#ifdef __x86_64__
-+#include "pyconfig-x86_64.h"
-+#endif
---- /dev/null
-+++ b/iOS/testbed/Python.xcframework/Info.plist
-@@ -0,0 +1,44 @@
-+
-+
-+
-+
-+ AvailableLibraries
-+
-+
-+ BinaryPath
-+ Python.framework/Python
-+ LibraryIdentifier
-+ ios-arm64
-+ LibraryPath
-+ Python.framework
-+ SupportedArchitectures
-+
-+ arm64
-+
-+ SupportedPlatform
-+ ios
-+
-+
-+ BinaryPath
-+ Python.framework/Python
-+ LibraryIdentifier
-+ ios-arm64_x86_64-simulator
-+ LibraryPath
-+ Python.framework
-+ SupportedArchitectures
-+
-+ arm64
-+ x86_64
-+
-+ SupportedPlatform
-+ ios
-+ SupportedPlatformVariant
-+ simulator
-+
-+
-+ CFBundlePackageType
-+ XFWK
-+ XCFrameworkFormatVersion
-+ 1.0
-+
-+
---- /dev/null
-+++ b/iOS/testbed/Python.xcframework/ios-arm64/README
-@@ -0,0 +1,4 @@
-+This directory is intentionally empty.
+ import errno
+ import os
+ import pty
+ import tty
+-import sys
+ import select
+ import signal
+ import socket
+ import io # readline
+-import unittest
+-
+ import struct
+ import fcntl
+ import warnings
+diff --git a/Lib/test/test_py_compile.py b/Lib/test/test_py_compile.py
+index 5ed98dbff17..794d6436b61 100644
+--- a/Lib/test/test_py_compile.py
++++ b/Lib/test/test_py_compile.py
+@@ -230,6 +230,7 @@
+ def tearDown(self):
+ os_helper.rmtree(self.directory)
+
++ @support.requires_subprocess()
+ def pycompilecmd(self, *args, **kwargs):
+ # assert_python_* helpers don't return proc object. We'll just use
+ # subprocess.run() instead of spawn_python() and its friends to test
+diff --git a/Lib/test/test_quopri.py b/Lib/test/test_quopri.py
+index 715544c8a96..152d1858dcd 100644
+--- a/Lib/test/test_quopri.py
++++ b/Lib/test/test_quopri.py
+@@ -3,6 +3,7 @@
+ import sys, io, subprocess
+ import quopri
+
++from test import support
+
+
+ ENCSAMPLE = b"""\
+@@ -180,6 +181,7 @@
+ for p, e in self.HSTRINGS:
+ self.assertEqual(quopri.decodestring(e, header=True), p)
+
++ @support.requires_subprocess()
+ def test_scriptencode(self):
+ (p, e) = self.STRINGS[-1]
+ process = subprocess.Popen([sys.executable, "-mquopri"],
+@@ -196,6 +198,7 @@
+ self.assertEqual(cout[i], e[i])
+ self.assertEqual(cout, e)
+
++ @support.requires_subprocess()
+ def test_scriptdecode(self):
+ (p, e) = self.STRINGS[-1]
+ process = subprocess.Popen([sys.executable, "-mquopri", "-d"],
+diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py
+index 62e6c28280e..76ae976e69a 100644
+--- a/Lib/test/test_regrtest.py
++++ b/Lib/test/test_regrtest.py
+@@ -513,6 +513,7 @@
+ self.assertTrue(0 <= randseed <= 10000000, randseed)
+ return randseed
+
++ @support.requires_subprocess()
+ def run_command(self, args, input=None, exitcode=0, **kw):
+ if not input:
+ input = ''
+diff --git a/Lib/test/test_repl.py b/Lib/test/test_repl.py
+index 03bf8d8b548..9775c3e89af 100644
+--- a/Lib/test/test_repl.py
++++ b/Lib/test/test_repl.py
+@@ -5,9 +5,10 @@
+ import unittest
+ import subprocess
+ from textwrap import dedent
+-from test.support import cpython_only, SuppressCrashReport
++from test.support import cpython_only, SuppressCrashReport, requires_subprocess
+ from test.support.script_helper import kill_python
+
++@requires_subprocess()
+ def spawn_repl(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw):
+ """Run the Python REPL with the given arguments.
+
+diff --git a/Lib/test/test_runpy.py b/Lib/test/test_runpy.py
+index e6d36825f15..93e1ab556ae 100644
+--- a/Lib/test/test_runpy.py
++++ b/Lib/test/test_runpy.py
+@@ -12,7 +12,7 @@
+ import textwrap
+ import unittest
+ import warnings
+-from test.support import no_tracing, verbose
++from test.support import no_tracing, verbose, requires_subprocess
+ from test.support.import_helper import forget, make_legacy_pyc, unload
+ from test.support.os_helper import create_empty_file, temp_dir
+ from test.support.script_helper import make_script, make_zip_script
+@@ -780,6 +780,7 @@
+ )
+ super().run(*args, **kwargs)
+
++ @requires_subprocess()
+ def assertSigInt(self, *args, **kwargs):
+ proc = subprocess.run(*args, **kwargs, text=True, stderr=subprocess.PIPE)
+ self.assertTrue(proc.stderr.endswith("\nKeyboardInterrupt\n"))
+diff --git a/Lib/test/test_select.py b/Lib/test/test_select.py
+index cf32cf2f6a6..810c67aa2b3 100644
+--- a/Lib/test/test_select.py
++++ b/Lib/test/test_select.py
+@@ -47,6 +47,7 @@
+ self.assertIsNot(w, x)
+
+ @unittest.skipUnless(hasattr(os, 'popen'), "need os.popen()")
++ @support.requires_subprocess()
+ def test_select(self):
+ code = textwrap.dedent('''
+ import time
+diff --git a/Lib/test/test_selectors.py b/Lib/test/test_selectors.py
+index fe6b725a4bd..456ee9aea7b 100644
+--- a/Lib/test/test_selectors.py
++++ b/Lib/test/test_selectors.py
+@@ -6,8 +6,7 @@
+ import socket
+ import sys
+ from test import support
+-from test.support import os_helper
+-from test.support import socket_helper
++from test.support import is_apple, os_helper, socket_helper
+ from time import sleep
+ import unittest
+ import unittest.mock
+@@ -486,7 +485,7 @@
+ try:
+ fds = s.select()
+ except OSError as e:
+- if e.errno == errno.EINVAL and sys.platform == 'darwin':
++ if e.errno == errno.EINVAL and is_apple:
+ # unexplainable errors on macOS don't need to fail the test
+ self.skipTest("Invalid argument error calling poll()")
+ raise
+diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py
+index 72fb3afcbef..ccb37967780 100644
+--- a/Lib/test/test_shutil.py
++++ b/Lib/test/test_shutil.py
+@@ -1777,6 +1777,7 @@
+ check_chown(dirname, uid, gid)
+
+
++@support.requires_subprocess()
+ class TestWhich(BaseTest, unittest.TestCase):
+
+ def setUp(self):
+@@ -2644,6 +2645,7 @@
+ self.assertGreaterEqual(size.lines, 0)
+
+ @unittest.skipUnless(os.isatty(sys.__stdout__.fileno()), "not on tty")
++ @support.requires_subprocess()
+ @unittest.skipUnless(hasattr(os, 'get_terminal_size'),
+ 'need os.get_terminal_size()')
+ def test_stty_match(self):
+diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py
+index 294cf3888d1..26d51621647 100644
+--- a/Lib/test/test_signal.py
++++ b/Lib/test/test_signal.py
+@@ -11,7 +11,7 @@
+ import time
+ import unittest
+ from test import support
+-from test.support import os_helper
++from test.support import is_apple, is_apple_mobile, os_helper
+ from test.support.script_helper import assert_python_ok, spawn_python
+ try:
+ import _testcapi
+@@ -89,6 +89,7 @@
+ self.assertLess(len(s), signal.NSIG)
+
+ @unittest.skipUnless(sys.executable, "sys.executable required.")
++ @support.requires_subprocess()
+ def test_keyboard_interrupt_exit_code(self):
+ """KeyboardInterrupt triggers exit via SIGINT."""
+ process = subprocess.run(
+@@ -139,6 +140,7 @@
+ signal.signal(7, handler)
+
+ @unittest.skipUnless(sys.executable, "sys.executable required.")
++ @support.requires_subprocess()
+ def test_keyboard_interrupt_exit_code(self):
+ """KeyboardInterrupt triggers an exit using STATUS_CONTROL_C_EXIT."""
+ # We don't test via os.kill(os.getpid(), signal.CTRL_C_EVENT) here
+@@ -612,6 +614,7 @@
+ @unittest.skipUnless(hasattr(signal, 'siginterrupt'), "needs signal.siginterrupt()")
+ class SiginterruptTest(unittest.TestCase):
+
++ @support.requires_fork()
+ def readpipe_interrupted(self, interrupt):
+ """Perform a read during which a signal will arrive. Return True if the
+ read is interrupted by the signal and raises an exception. Return False
+@@ -746,7 +749,7 @@
+ self.assertEqual(self.hndl_called, True)
+
+ # Issue 3864, unknown if this affects earlier versions of freebsd also
+- @unittest.skipIf(sys.platform in ('netbsd5',),
++ @unittest.skipIf(sys.platform in ('netbsd5',) or is_apple_mobile,
+ 'itimer not reliable (does not mix well with threading) on some BSDs.')
+ def test_itimer_virtual(self):
+ self.itimer = signal.ITIMER_VIRTUAL
+@@ -1261,6 +1264,7 @@
+ # Python handler
+ self.assertEqual(len(sigs), N, "Some signals were lost")
+
++ @unittest.skipIf(is_apple, "crashes due to system bug (FB13453490)")
+ @unittest.skipUnless(hasattr(signal, "SIGUSR1"),
+ "test needs SIGUSR1")
+ def test_stress_modifying_handlers(self):
+diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
+index c70e1fa9ae1..18086ac55b9 100644
+--- a/Lib/test/test_site.py
++++ b/Lib/test/test_site.py
+@@ -221,6 +221,7 @@
+ pth_file.cleanup()
+
+ @unittest.skipUnless(sys.platform == 'win32', 'test needs Windows')
++ @support.requires_subprocess()
+ def test_addsitedir_hidden_file_attribute(self):
+ pth_file = PthFile()
+ pth_file.cleanup(prep=True)
+@@ -249,6 +250,7 @@
+
+ @unittest.skipUnless(site.ENABLE_USER_SITE, "requires access to PEP 370 "
+ "user-site (site.ENABLE_USER_SITE)")
++ @support.requires_subprocess()
+ def test_s_option(self):
+ # (ncoghlan) Change this to use script_helper...
+ usersite = os.path.normpath(site.USER_SITE)
+@@ -534,6 +536,7 @@
+
+ class StartupImportTests(unittest.TestCase):
+
++ @support.requires_subprocess()
+ def test_startup_imports(self):
+ # Get sys.path in isolated mode (python3 -I)
+ popen = subprocess.Popen([sys.executable, '-I', '-c',
+@@ -582,17 +585,20 @@
+ }.difference(sys.builtin_module_names)
+ self.assertFalse(modules.intersection(collection_mods), stderr)
+
++ @support.requires_subprocess()
+ def test_startup_interactivehook(self):
+ r = subprocess.Popen([sys.executable, '-c',
+ 'import sys; sys.exit(hasattr(sys, "__interactivehook__"))']).wait()
+ self.assertTrue(r, "'__interactivehook__' not added by site")
+
++ @support.requires_subprocess()
+ def test_startup_interactivehook_isolated(self):
+ # issue28192 readline is not automatically enabled in isolated mode
+ r = subprocess.Popen([sys.executable, '-I', '-c',
+ 'import sys; sys.exit(hasattr(sys, "__interactivehook__"))']).wait()
+ self.assertFalse(r, "'__interactivehook__' added in isolated mode")
+
++ @support.requires_subprocess()
+ def test_startup_interactivehook_isolated_explicit(self):
+ # issue28192 readline can be explicitly enabled in isolated mode
+ r = subprocess.Popen([sys.executable, '-I', '-c',
+@@ -631,6 +637,7 @@
+ sys_path.append(abs_path)
+ return sys_path
+
++ @support.requires_subprocess()
+ def test_underpth_nosite_file(self):
+ libpath = os.path.dirname(os.path.dirname(encodings.__file__))
+ exe_prefix = os.path.dirname(sys.executable)
+@@ -659,6 +666,7 @@
+ "sys.path is incorrect"
+ )
+
++ @support.requires_subprocess()
+ def test_underpth_file(self):
+ libpath = os.path.dirname(os.path.dirname(encodings.__file__))
+ exe_prefix = os.path.dirname(sys.executable)
+diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
+index 15f7fb4a808..bbd2c604be1 100644
+--- a/Lib/test/test_socket.py
++++ b/Lib/test/test_socket.py
+@@ -3,6 +3,7 @@
+ from test.support import os_helper
+ from test.support import socket_helper
+ from test.support import threading_helper
++from test.support import is_apple
+
+ import errno
+ import io
+@@ -707,7 +708,7 @@
+ super().setUp()
+
+ def bindSock(self, sock):
+- path = tempfile.mktemp(dir=self.dir_path)
++ path = socket_helper.create_unix_domain_name()
+ socket_helper.bind_unix_socket(sock, path)
+ self.addCleanup(os_helper.unlink, path)
+
+@@ -1169,8 +1170,11 @@
+ # Find one service that exists, then check all the related interfaces.
+ # I've ordered this by protocols that have both a tcp and udp
+ # protocol, at least for modern Linuxes.
+- if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
+- or sys.platform in ('linux', 'darwin')):
++ if (
++ sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
++ or sys.platform == 'linux'
++ or is_apple
++ ):
+ # avoid the 'echo' service on this platform, as there is an
+ # assumption breaking non-standard port/protocol entry
+ services = ('daytime', 'qotd', 'domain')
+@@ -1928,12 +1932,13 @@
+ self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
+
+ if hasattr(socket, "AF_UNIX"):
+- tmpdir = tempfile.mkdtemp()
+- self.addCleanup(shutil.rmtree, tmpdir)
++ unix_name = socket_helper.create_unix_domain_name()
++ self.addCleanup(os_helper.unlink, unix_name)
+
-+It should be used as a target for `--enable-framework` when compiling an iOS on-device
-+build for testing purposes.
---- /dev/null
-+++ b/iOS/testbed/Python.xcframework/ios-arm64_x86_64-simulator/README
-@@ -0,0 +1,4 @@
-+This directory is intentionally empty.
+ s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+ self.addCleanup(s.close)
+ try:
+- s.bind(os.path.join(tmpdir, 'socket'))
++ s.bind(unix_name)
+ except PermissionError:
+ pass
+ else:
+@@ -3541,7 +3546,7 @@
+ def _testFDPassCMSG_LEN(self):
+ self.createAndSendFDs(1)
+
+- @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
++ @unittest.skipIf(is_apple, "skipping, see issue #12958")
+ @unittest.skipIf(AIX, "skipping, see issue #22397")
+ @requireAttrs(socket, "CMSG_SPACE")
+ def testFDPassSeparate(self):
+@@ -3552,7 +3557,7 @@
+ maxcmsgs=2)
+
+ @testFDPassSeparate.client_skip
+- @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
++ @unittest.skipIf(is_apple, "skipping, see issue #12958")
+ @unittest.skipIf(AIX, "skipping, see issue #22397")
+ def _testFDPassSeparate(self):
+ fd0, fd1 = self.newFDs(2)
+@@ -3565,7 +3570,7 @@
+ array.array("i", [fd1]))]),
+ len(MSG))
+
+- @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
++ @unittest.skipIf(is_apple, "skipping, see issue #12958")
+ @unittest.skipIf(AIX, "skipping, see issue #22397")
+ @requireAttrs(socket, "CMSG_SPACE")
+ def testFDPassSeparateMinSpace(self):
+@@ -3579,7 +3584,7 @@
+ maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
+
+ @testFDPassSeparateMinSpace.client_skip
+- @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
++ @unittest.skipIf(is_apple, "skipping, see issue #12958")
+ @unittest.skipIf(AIX, "skipping, see issue #22397")
+ def _testFDPassSeparateMinSpace(self):
+ fd0, fd1 = self.newFDs(2)
+@@ -3603,7 +3608,7 @@
+ nbytes = self.sendmsgToServer([msg])
+ self.assertEqual(nbytes, len(msg))
+
+- @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
++ @unittest.skipIf(is_apple, "skipping, see issue #12958")
+ def testFDPassEmpty(self):
+ # Try to pass an empty FD array. Can receive either no array
+ # or an empty array.
+diff --git a/Lib/test/test_socketserver.py b/Lib/test/test_socketserver.py
+index 211321f3761..3ad5b9a43f2 100644
+--- a/Lib/test/test_socketserver.py
++++ b/Lib/test/test_socketserver.py
+@@ -96,8 +96,7 @@
+ else:
+ # XXX: We need a way to tell AF_UNIX to pick its own name
+ # like AF_INET provides port==0.
+- dir = None
+- fn = tempfile.mktemp(prefix='unix_socket.', dir=dir)
++ fn = socket_helper.create_unix_domain_name()
+ self.test_files.append(fn)
+ return fn
+
+@@ -233,12 +232,16 @@
+ self.dgram_examine)
+
+ @requires_unix_sockets
++ @unittest.skipIf(test.support.is_apple_mobile and test.support.on_github_actions,
++ "gh-140702: Test fails regularly on iOS simulator on GitHub Actions")
+ def test_UnixDatagramServer(self):
+ self.run_server(socketserver.UnixDatagramServer,
+ socketserver.DatagramRequestHandler,
+ self.dgram_examine)
+
+ @requires_unix_sockets
++ @unittest.skipIf(test.support.is_apple_mobile and test.support.on_github_actions,
++ "gh-140702: Test fails regularly on iOS simulator on GitHub Actions")
+ def test_ThreadingUnixDatagramServer(self):
+ self.run_server(socketserver.ThreadingUnixDatagramServer,
+ socketserver.DatagramRequestHandler,
+diff --git a/Lib/test/test_source_encoding.py b/Lib/test/test_source_encoding.py
+index 219c25cd2f6..d2ad941c051 100644
+--- a/Lib/test/test_source_encoding.py
++++ b/Lib/test/test_source_encoding.py
+@@ -1,7 +1,7 @@
+ # -*- coding: koi8-r -*-
+
+ import unittest
+-from test.support import script_helper, captured_stdout
++from test.support import script_helper, captured_stdout, requires_subprocess, is_apple_mobile
+ from test.support.os_helper import TESTFN, unlink, rmtree
+ from test.support.import_helper import unload
+ import importlib
+@@ -12,13 +12,14 @@
+
+ class MiscSourceEncodingTest(unittest.TestCase):
+
++ @unittest.skipIf(is_apple_mobile, "FIXME: Edge case of encoding")
+ def test_pep263(self):
+ self.assertEqual(
+- "ðÉÔÏÎ".encode("utf-8"),
++ "�����".encode("utf-8"),
+ b'\xd0\x9f\xd0\xb8\xd1\x82\xd0\xbe\xd0\xbd'
+ )
+ self.assertEqual(
+- "\ð".encode("utf-8"),
++ "\�".encode("utf-8"),
+ b'\\\xd0\x9f'
+ )
+
+@@ -65,6 +66,7 @@
+ # two bytes in common with the UTF-8 BOM
+ self.assertRaises(SyntaxError, eval, b'\xef\xbb\x20')
+
++ @requires_subprocess()
+ def test_20731(self):
+ sub = subprocess.Popen([sys.executable,
+ os.path.join(os.path.dirname(__file__),
+diff --git a/Lib/test/test_stat.py b/Lib/test/test_stat.py
+index 2e1e2c349c8..867c4723086 100644
+--- a/Lib/test/test_stat.py
++++ b/Lib/test/test_stat.py
+@@ -2,8 +2,7 @@
+ import os
+ import socket
+ import sys
+-from test.support import os_helper
+-from test.support import socket_helper
++from test.support import is_apple, os_helper, socket_helper
+ from test.support.import_helper import import_fresh_module
+ from test.support.os_helper import TESTFN
+
+diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
+index 0d3afe612a3..3fc38f8a754 100644
+--- a/Lib/test/test_subprocess.py
++++ b/Lib/test/test_subprocess.py
+@@ -48,6 +48,8 @@
+
+ if support.PGO:
+ raise unittest.SkipTest("test is not helpful for PGO")
++if not support.has_subprocess_support:
++ raise unittest.SkipTest("test requires subprocess support")
+
+ mswindows = (sys.platform == "win32")
+
+diff --git a/Lib/test/test_sundry.py b/Lib/test/test_sundry.py
+index f27450e4a35..2a49771c5d4 100644
+--- a/Lib/test/test_sundry.py
++++ b/Lib/test/test_sundry.py
+@@ -2,6 +2,7 @@
+ import importlib
+ import platform
+ import sys
++import sys
+ from test import support
+ from test.support import import_helper
+ from test.support import warnings_helper
+@@ -49,7 +50,8 @@
+
+ import distutils.bcppcompiler
+ import distutils.ccompiler
+- import distutils.cygwinccompiler
++ if sys.platform.startswith("win"):
++ import distutils.cygwinccompiler
+ import distutils.filelist
+ import distutils.text_file
+ import distutils.unixccompiler
+diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py
+index 79290986c49..86c2e6ff817 100644
+--- a/Lib/test/test_support.py
++++ b/Lib/test/test_support.py
+@@ -489,6 +489,7 @@
+ # pending child process
+ support.reap_children()
+
++ @support.requires_subprocess()
+ def check_options(self, args, func, expected=None):
+ code = f'from test.support import {func}; print(repr({func}()))'
+ cmd = [sys.executable, *args, '-c', code]
+diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py
+index 1094d40849d..61f6c6b2840 100644
+--- a/Lib/test/test_sys.py
++++ b/Lib/test/test_sys.py
+@@ -633,6 +633,7 @@
+ def test_clear_type_cache(self):
+ sys._clear_type_cache()
+
++ @support.requires_subprocess()
+ def test_ioencoding(self):
+ env = dict(os.environ)
+
+@@ -680,6 +681,7 @@
+ 'requires OS support of non-ASCII encodings')
+ @unittest.skipUnless(sys.getfilesystemencoding() == locale.getpreferredencoding(False),
+ 'requires FS encoding to match locale')
++ @support.requires_subprocess()
+ def test_ioencoding_nonascii(self):
+ env = dict(os.environ)
+
+@@ -692,6 +694,7 @@
+
+ @unittest.skipIf(sys.base_prefix != sys.prefix,
+ 'Test is not venv-compatible')
++ @support.requires_subprocess()
+ def test_executable(self):
+ # sys.executable should be absolute
+ self.assertEqual(os.path.abspath(sys.executable), sys.executable)
+@@ -726,6 +729,7 @@
+ expected = None
+ self.check_fsencoding(fs_encoding, expected)
+
++ @support.requires_subprocess()
+ def c_locale_get_error_handler(self, locale, isolated=False, encoding=None):
+ # Force the POSIX locale
+ env = os.environ.copy()
+@@ -933,6 +937,7 @@
+ self.assertIsInstance(level, int)
+ self.assertGreater(level, 0)
+
++ @support.requires_subprocess()
+ def test_sys_tracebacklimit(self):
+ code = """if 1:
+ import sys
+@@ -979,6 +984,7 @@
+ out = out.decode('ascii', 'replace').rstrip()
+ self.assertEqual(out, 'mbcs replace')
+
++ @support.requires_subprocess()
+ def test_orig_argv(self):
+ code = textwrap.dedent('''
+ import sys
+diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py
+index 5ee9839c048..e4b37afab4e 100644
+--- a/Lib/test/test_sysconfig.py
++++ b/Lib/test/test_sysconfig.py
+@@ -5,7 +5,7 @@
+ import shutil
+ from copy import copy
+
+-from test.support import (captured_stdout, PythonSymlink)
++from test.support import (is_apple_mobile, captured_stdout, PythonSymlink)
+ from test.support.import_helper import import_module
+ from test.support.os_helper import (TESTFN, unlink, skip_unless_symlink,
+ change_cwd)
+@@ -258,12 +258,14 @@
+
+ # XXX more platforms to tests here
+
++ @unittest.skipIf(is_apple_mobile,
++ f"{sys.platform} doesn't distribute header files in the runtime environment")
+ def test_get_config_h_filename(self):
+ config_h = sysconfig.get_config_h_filename()
+ self.assertTrue(os.path.isfile(config_h), config_h)
+
+ def test_get_scheme_names(self):
+- wanted = ['nt', 'posix_home', 'posix_prefix']
++ wanted = ['nt', 'nt_venv', 'posix_home', 'posix_prefix', 'posix_venv']
+ if HAS_USER_BASE:
+ wanted.extend(['nt_user', 'osx_framework_user', 'posix_user'])
+ self.assertEqual(get_scheme_names(), tuple(sorted(wanted)))
+@@ -364,6 +366,8 @@
+ self.assertEqual(status, 0)
+ self.assertEqual(my_platform, test_platform)
+
++ @unittest.skipIf(is_apple_mobile,
++ f"{sys.platform} doesn't include config folder at runtime")
+ def test_srcdir(self):
+ # See Issues #15322, #15364.
+ srcdir = sysconfig.get_config_var('srcdir')
+@@ -440,6 +444,8 @@
+
+ @unittest.skipIf(sys.platform.startswith('win'),
+ 'Test is not Windows compatible')
++ @unittest.skipIf(is_apple_mobile,
++ f"{sys.platform} doesn't include config folder at runtime")
+ def test_get_makefile_filename(self):
+ makefile = sysconfig.get_makefile_filename()
+ self.assertTrue(os.path.isfile(makefile), makefile)
+diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py
+index 6e06bfc7f2f..e1fb2a39750 100644
+--- a/Lib/test/test_tempfile.py
++++ b/Lib/test/test_tempfile.py
+@@ -201,6 +201,7 @@
+
+ @unittest.skipUnless(hasattr(os, 'fork'),
+ "os.fork is required for this test")
++ @support.requires_fork()
+ def test_process_awareness(self):
+ # ensure that the random source differs between
+ # child and parent.
+@@ -462,6 +463,7 @@
+ self.assertEqual(mode, expected)
+
+ @unittest.skipUnless(has_spawnl, 'os.spawnl not available')
++ @support.requires_fork()
+ def test_noinherit(self):
+ # _mkstemp_inner file handles are not inherited by child processes
+
+diff --git a/Lib/test/test_thread.py b/Lib/test/test_thread.py
+index 4ae8a833b99..76ea55f14ad 100644
+--- a/Lib/test/test_thread.py
++++ b/Lib/test/test_thread.py
+@@ -225,6 +225,7 @@
+ self.read_fd, self.write_fd = os.pipe()
+
+ @unittest.skipUnless(hasattr(os, 'fork'), 'need os.fork')
++ @support.requires_fork()
+ @threading_helper.reap_threads
+ def test_forkinthread(self):
+ pid = None
+diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py
+index c54806e5946..1a01b06e722 100644
+--- a/Lib/test/test_threading.py
++++ b/Lib/test/test_threading.py
+@@ -1258,6 +1258,7 @@
+ lock = threading.Lock()
+ self.assertRaises(RuntimeError, lock.release)
+
++ @support.requires_subprocess()
+ def test_recursion_limit(self):
+ # Issue 9670
+ # test that excessive recursion within a non-main thread causes
+diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py
+index 18cd4aba24a..1c65268411e 100644
+--- a/Lib/test/test_traceback.py
++++ b/Lib/test/test_traceback.py
+@@ -130,6 +130,7 @@
+ str_name = '.'.join([X.__module__, X.__qualname__])
+ self.assertEqual(err[0], "%s: %s\n" % (str_name, str_value))
+
++ @support.requires_subprocess()
+ def test_encoded_file(self):
+ # Test that tracebacks are correctly printed for encoded source files:
+ # - correct line number (Issue2384)
+diff --git a/Lib/test/test_unicode_file_functions.py b/Lib/test/test_unicode_file_functions.py
+index 54916dec4ea..06f3f7051f3 100644
+--- a/Lib/test/test_unicode_file_functions.py
++++ b/Lib/test/test_unicode_file_functions.py
+@@ -5,7 +5,7 @@
+ import unittest
+ import warnings
+ from unicodedata import normalize
+-from test.support import os_helper
++from test.support import is_apple, os_helper
+
+
+ filenames = [
+@@ -22,13 +22,13 @@
+ '10_\u1fee\u1ffd',
+ ]
+
+-# Mac OS X decomposes Unicode names, using Normal Form D.
++# Apple platforms decompose Unicode names, using Normal Form D.
+ # http://developer.apple.com/mac/library/qa/qa2001/qa1173.html
+ # "However, most volume formats do not follow the exact specification for
+ # these normal forms. For example, HFS Plus uses a variant of Normal Form D
+ # in which U+2000 through U+2FFF, U+F900 through U+FAFF, and U+2F800 through
+ # U+2FAFF are not decomposed."
+-if sys.platform != 'darwin':
++if not is_apple:
+ filenames.extend([
+ # Specific code points: NFC(fn), NFD(fn), NFKC(fn) and NFKD(fn) all different
+ '11_\u0385\u03d3\u03d4',
+@@ -118,11 +118,11 @@
+ os.stat(name)
+ self._apply_failure(os.listdir, name, self._listdir_failure)
+
+- # Skip the test on darwin, because darwin does normalize the filename to
++ # Skip the test on Apple platforms, because they don't normalize the filename to
+ # NFD (a variant of Unicode NFD form). Normalize the filename to NFC, NFKC,
+ # NFKD in Python is useless, because darwin will normalize it later and so
+ # open(), os.stat(), etc. don't raise any exception.
+- @unittest.skipIf(sys.platform == 'darwin', 'irrelevant test on Mac OS X')
++ @unittest.skipIf(is_apple, 'irrelevant test on Apple platforms')
+ def test_normalize(self):
+ files = set(self.files)
+ others = set()
+@@ -137,10 +137,10 @@
+ self._apply_failure(os.remove, name)
+ self._apply_failure(os.listdir, name)
+
+- # Skip the test on darwin, because darwin uses a normalization different
++ # Skip the test on Apple platforms, because they use a normalization different
+ # than Python NFD normalization: filenames are different even if we use
+ # Python NFD normalization.
+- @unittest.skipIf(sys.platform == 'darwin', 'irrelevant test on Mac OS X')
++ @unittest.skipIf(is_apple, 'irrelevant test on Apple platforms')
+ def test_listdir(self):
+ sf0 = set(self.files)
+ with warnings.catch_warnings():
+diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py
+index fe17aac6c1f..0df55745afd 100644
+--- a/Lib/test/test_urllib2.py
++++ b/Lib/test/test_urllib2.py
+@@ -1,7 +1,7 @@
+ import unittest
+ from test import support
+ from test.support import os_helper
+-from test.support import socket_helper
++from test.support import requires_subprocess
+ from test.support import warnings_helper
+ from test import test_urllib
+
+@@ -985,6 +985,7 @@
+
+ file_obj.close()
+
++ @requires_subprocess()
+ def test_http_body_pipe(self):
+ # A file reading from a pipe.
+ # A pipe cannot be seek'ed. There is no way to determine the
+diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py
+index d8ee66e4990..ebbd71aabe7 100644
+--- a/Lib/test/test_venv.py
++++ b/Lib/test/test_venv.py
+@@ -17,7 +17,8 @@
+ import tempfile
+ import shlex
+ from test.support import (captured_stdout, captured_stderr, requires_zlib,
+- skip_if_broken_multiprocessing_synchronize)
++ skip_if_broken_multiprocessing_synchronize,
++ requires_subprocess, is_apple_mobile)
+ from test.support.os_helper import (can_symlink, EnvironmentVarGuard, rmtree)
+ import unittest
+ import venv
+@@ -35,6 +36,12 @@
+ or sys._base_executable != sys.executable,
+ 'cannot run venv.create from within a venv on this platform')
+
++# Skip tests on iOS/tvOS/watchOS
++if is_apple_mobile:
++ raise unittest.SkipTest(f"venv tests not required on {sys.platform}")
+
-+It should be used as a target for `--enable-framework` when compiling an iOS simulator
-+build for testing purposes (either x86_64 or ARM64).
---- /dev/null
-+++ b/iOS/testbed/__main__.py
-@@ -0,0 +1,468 @@
-+import argparse
-+import asyncio
-+import json
-+import plistlib
-+import re
-+import shutil
-+import subprocess
-+import sys
-+from contextlib import asynccontextmanager
-+from datetime import datetime
-+from itertools import chain
-+from pathlib import Path
+
++@requires_subprocess()
+ def check_output(cmd, encoding=None):
+ p = subprocess.Popen(cmd,
+ stdout=subprocess.PIPE,
+diff --git a/Lib/test/test_wait3.py b/Lib/test/test_wait3.py
+index aa166baa400..964fd82e38f 100644
+--- a/Lib/test/test_wait3.py
++++ b/Lib/test/test_wait3.py
+@@ -15,6 +15,9 @@
+ if not hasattr(os, 'wait3'):
+ raise unittest.SkipTest("os.wait3 not defined")
+
++if support.is_apple_mobile:
++ raise unittest.SkipTest("os.wait3 doesn't work on Apple mobile")
+
-+DECODE_ARGS = ("UTF-8", "backslashreplace")
+ class Wait3Test(ForkWait):
+ def wait_impl(self, cpid, *, exitcode):
+ # This many iterations can be required, since some previously run
+diff --git a/Lib/test/test_webbrowser.py b/Lib/test/test_webbrowser.py
+index 673cc995d3f..547fcf40ac7 100644
+--- a/Lib/test/test_webbrowser.py
++++ b/Lib/test/test_webbrowser.py
+@@ -5,8 +5,10 @@
+ import subprocess
+ from unittest import mock
+ from test import support
++from test.support import is_apple_mobile
+ from test.support import import_helper
+ from test.support import os_helper
++from test.support import requires_subprocess
+
+
+ URL = 'http://www.example.com'
+@@ -22,6 +24,7 @@
+ return 0
+
+
++@requires_subprocess()
+ class CommandTestMixin:
+
+ def _test(self, meth, *, args=[URL], kw={}, options, arguments):
+@@ -217,6 +220,73 @@
+ arguments=['openURL({},new-tab)'.format(URL)])
+
+
++@unittest.skipUnless(sys.platform == "ios", "Test only applicable to iOS")
++class IOSBrowserTest(unittest.TestCase):
++ def _obj_ref(self, *args):
++ # Construct a string representation of the arguments that can be used
++ # as a proxy for object instance references
++ return "|".join(str(a) for a in args)
+
-+# The system log prefixes each line:
-+# 2025-01-17 16:14:29.090 Df iOSTestbed[23987:1fd393b4] (Python) ...
-+# 2025-01-17 16:14:29.090 E iOSTestbed[23987:1fd393b4] (Python) ...
++ @unittest.skipIf(getattr(webbrowser, "objc", None) is None,
++ "iOS Webbrowser tests require ctypes")
++ def setUp(self):
++ # Intercept the the objc library. Wrap the calls to get the
++ # references to classes and selectors to return strings, and
++ # wrap msgSend to return stringified object references
++ self.orig_objc = webbrowser.objc
+
-+LOG_PREFIX_REGEX = re.compile(
-+ r"^\d{4}-\d{2}-\d{2}" # YYYY-MM-DD
-+ r"\s+\d+:\d{2}:\d{2}\.\d+" # HH:MM:SS.sss
-+ r"\s+\w+" # Df/E
-+ r"\s+iOSTestbed\[\d+:\w+\]" # Process/thread ID
-+ r"\s+\(Python\)\s" # Logger name
-+)
++ webbrowser.objc = mock.Mock()
++ webbrowser.objc.objc_getClass = lambda cls: f"C#{cls.decode()}"
++ webbrowser.objc.sel_registerName = lambda sel: f"S#{sel.decode()}"
++ webbrowser.objc.objc_msgSend.side_effect = self._obj_ref
+
++ def tearDown(self):
++ webbrowser.objc = self.orig_objc
+
-+# Work around a bug involving sys.exit and TaskGroups
-+# (https://github.com/python/cpython/issues/101515).
-+def exit(*args):
-+ raise MySystemExit(*args)
++ def _test(self, meth, **kwargs):
++ # The browser always gets focus, there's no concept of separate browser
++ # windows, and there's no API-level control over creating a new tab.
++ # Therefore, all calls to webbrowser are effectively the same.
++ getattr(webbrowser, meth)(URL, **kwargs)
+
++ # The ObjC String version of the URL is created with UTF-8 encoding
++ url_string_args = [
++ "C#NSString",
++ "S#stringWithCString:encoding:",
++ b'http://www.example.com',
++ 4,
++ ]
++ # The NSURL version of the URL is created from that string
++ url_obj_args = [
++ "C#NSURL",
++ "S#URLWithString:",
++ self._obj_ref(*url_string_args),
++ ]
++ # The openURL call is invoked on the shared application
++ shared_app_args = ["C#UIApplication", "S#sharedApplication"]
+
-+class MySystemExit(Exception):
-+ pass
++ # Verify that the last call is the one that opens the URL.
++ webbrowser.objc.objc_msgSend.assert_called_with(
++ self._obj_ref(*shared_app_args),
++ "S#openURL:options:completionHandler:",
++ self._obj_ref(*url_obj_args),
++ None,
++ None
++ )
+
++ def test_open(self):
++ self._test('open')
+
-+# All subprocesses are executed through this context manager so that no matter
-+# what happens, they can always be cancelled from another task, and they will
-+# always be cleaned up on exit.
-+@asynccontextmanager
-+async def async_process(*args, **kwargs):
-+ process = await asyncio.create_subprocess_exec(*args, **kwargs)
-+ try:
-+ yield process
-+ finally:
-+ if process.returncode is None:
-+ # Allow a reasonably long time for Xcode to clean itself up,
-+ # because we don't want stale emulators left behind.
-+ timeout = 10
-+ process.terminate()
-+ try:
-+ await asyncio.wait_for(process.wait(), timeout)
-+ except TimeoutError:
-+ print(
-+ f"Command {args} did not terminate after {timeout} seconds "
-+ f" - sending SIGKILL"
-+ )
-+ process.kill()
++ def test_open_with_autoraise_false(self):
++ self._test('open', autoraise=False)
+
-+ # Even after killing the process we must still wait for it,
-+ # otherwise we'll get the warning "Exception ignored in __del__".
-+ await asyncio.wait_for(process.wait(), timeout=1)
++ def test_open_new(self):
++ self._test('open_new')
+
++ def test_open_new_tab(self):
++ self._test('open_new_tab')
+
-+async def async_check_output(*args, **kwargs):
-+ async with async_process(
-+ *args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kwargs
-+ ) as process:
-+ stdout, stderr = await process.communicate()
-+ if process.returncode == 0:
-+ return stdout.decode(*DECODE_ARGS)
-+ else:
-+ raise subprocess.CalledProcessError(
-+ process.returncode,
-+ args,
-+ stdout.decode(*DECODE_ARGS),
-+ stderr.decode(*DECODE_ARGS),
-+ )
+
+ class BrowserRegistrationTest(unittest.TestCase):
+
+ def setUp(self):
+@@ -300,6 +370,10 @@
+ webbrowser.register(name, None, webbrowser.GenericBrowser(name))
+ webbrowser.get(sys.executable)
+
++ @unittest.skipIf(
++ is_apple_mobile,
++ "Apple mobile doesn't allow modifying browser with environment"
++ )
+ def test_environment(self):
+ webbrowser = import_helper.import_fresh_module('webbrowser')
+ try:
+@@ -311,6 +385,10 @@
+ webbrowser = import_helper.import_fresh_module('webbrowser')
+ webbrowser.get()
+
++ @unittest.skipIf(
++ is_apple_mobile,
++ "Apple mobile doesn't allow modifying browser with environment"
++ )
+ def test_environment_preferred(self):
+ webbrowser = import_helper.import_fresh_module('webbrowser')
+ try:
+diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py
+index 55e9792b36a..31ab7c51ab7 100644
+--- a/Lib/test/test_zipfile.py
++++ b/Lib/test/test_zipfile.py
+@@ -21,7 +21,7 @@
+ from tempfile import TemporaryFile
+ from random import randint, random, randbytes
+
+-from test.support import script_helper
++from test.support import script_helper, requires_subprocess
+ from test.support import (findfile, requires_zlib, requires_bz2,
+ requires_lzma, captured_stdout)
+ from test.support.os_helper import TESTFN, unlink, rmtree, temp_dir, temp_cwd
+@@ -2913,6 +2913,7 @@
+ @unittest.skipUnless(sys.executable, 'sys.executable required.')
+ @unittest.skipUnless(os.access('/bin/bash', os.X_OK),
+ 'Test relies on #!/bin/bash working.')
++ @requires_subprocess()
+ def test_execute_zip2(self):
+ output = subprocess.check_output([self.exe_zip, sys.executable])
+ self.assertIn(b'number in executable: 5', output)
+@@ -2920,6 +2921,7 @@
+ @unittest.skipUnless(sys.executable, 'sys.executable required.')
+ @unittest.skipUnless(os.access('/bin/bash', os.X_OK),
+ 'Test relies on #!/bin/bash working.')
++ @requires_subprocess()
+ def test_execute_zip64(self):
+ output = subprocess.check_output([self.exe_zip64, sys.executable])
+ self.assertIn(b'number in executable: 5', output)
+diff --git a/Lib/test/test_zipimport_support.py b/Lib/test/test_zipimport_support.py
+index 7bf50a33728..d172895be51 100644
+--- a/Lib/test/test_zipimport_support.py
++++ b/Lib/test/test_zipimport_support.py
+@@ -13,7 +13,7 @@
+ import inspect
+ import linecache
+ import unittest
+-from test.support import os_helper
++from test.support import os_helper, is_apple_mobile
+ from test.support.script_helper import (spawn_python, kill_python, assert_python_ok,
+ make_script, make_zip_script)
+
+@@ -92,6 +92,7 @@
+ finally:
+ del sys.modules["zip_pkg"]
+
++ @unittest.skipIf(is_apple_mobile, "FIXME: Edge case of doctest importer")
+ def test_doctest_issue4197(self):
+ # To avoid having to keep two copies of the doctest module's
+ # unit tests in sync, this test works by taking the source of
+diff --git a/Lib/unittest/test/test_program.py b/Lib/unittest/test/test_program.py
+index b7fbbc1e7ba..a544819d516 100644
+--- a/Lib/unittest/test/test_program.py
++++ b/Lib/unittest/test/test_program.py
+@@ -1,5 +1,3 @@
+-import io
+-
+ import os
+ import sys
+ import subprocess
+@@ -427,6 +425,7 @@
+
+ self.assertEqual(program.testNamePatterns, ['*foo*', '*bar*', '*pat*'])
+
++ @support.requires_subprocess()
+ def testSelectedTestNamesFunctionalTest(self):
+ def run_unittest(args):
+ p = subprocess.Popen([sys.executable, '-m', 'unittest'] + args,
+diff --git a/Lib/unittest/test/test_runner.py b/Lib/unittest/test/test_runner.py
+index 0082d394dc9..c6ef4851745 100644
+--- a/Lib/unittest/test/test_runner.py
++++ b/Lib/unittest/test/test_runner.py
+@@ -9,6 +9,7 @@
+
+ from unittest.test.support import (LoggingResult,
+ ResultWithNoStartTestRunStopTestRun)
++from test import support
+
+
+ def resultFactory(*_):
+@@ -1176,6 +1177,7 @@
+ expectedresult = (runner.stream, DESCRIPTIONS, VERBOSITY)
+ self.assertEqual(runner._makeResult(), expectedresult)
+
++ @support.requires_subprocess()
+ def test_warnings(self):
+ """
+ Check that warnings argument of TextTestRunner correctly affects the
+diff --git a/Lib/webbrowser.py b/Lib/webbrowser.py
+index ec3cece48c9..34a772ab3c4 100755
+--- a/Lib/webbrowser.py
++++ b/Lib/webbrowser.py
+@@ -532,6 +532,9 @@
+ # OS X can use below Unix support (but we prefer using the OS X
+ # specific stuff)
+
++ if sys.platform == "ios":
++ register("iosbrowser", None, IOSBrowser(), preferred=True)
++
+ if sys.platform == "serenityos":
+ # SerenityOS webbrowser, simply called "Browser".
+ register("Browser", None, BackgroundBrowser("Browser"))
+@@ -688,6 +691,70 @@
+ rc = osapipe.close()
+ return not rc
+
++#
++# Platform support for iOS
++#
++if sys.platform == "ios":
++ from _ios_support import objc
++ if objc:
++ # If objc exists, we know ctypes is also importable.
++ from ctypes import c_void_p, c_char_p, c_ulong
+
-+# Return a list of UDIDs associated with booted simulators
-+async def list_devices():
-+ try:
-+ # List the testing simulators, in JSON format
-+ raw_json = await async_check_output(
-+ "xcrun", "simctl", "--set", "testing", "list", "-j"
-+ )
-+ json_data = json.loads(raw_json)
-+
-+ # Filter out the booted iOS simulators
-+ return [
-+ simulator["udid"]
-+ for runtime, simulators in json_data["devices"].items()
-+ for simulator in simulators
-+ if runtime.split(".")[-1].startswith("iOS") and simulator["state"] == "Booted"
-+ ]
-+ except subprocess.CalledProcessError as e:
-+ # If there's no ~/Library/Developer/XCTestDevices folder (which is the
-+ # case on fresh installs, and in some CI environments), `simctl list`
-+ # returns error code 1, rather than an empty list. Handle that case,
-+ # but raise all other errors.
-+ if e.returncode == 1:
-+ return []
-+ else:
-+ raise
-+
-+
-+async def find_device(initial_devices):
-+ while True:
-+ new_devices = set(await list_devices()).difference(initial_devices)
-+ if len(new_devices) == 0:
-+ await asyncio.sleep(1)
-+ elif len(new_devices) == 1:
-+ udid = new_devices.pop()
-+ print(f"{datetime.now():%Y-%m-%d %H:%M:%S}: New test simulator detected")
-+ print(f"UDID: {udid}")
-+ return udid
-+ else:
-+ exit(f"Found more than one new device: {new_devices}")
++ class IOSBrowser(BaseBrowser):
++ def open(self, url, new=0, autoraise=True):
++ sys.audit("webbrowser.open", url)
++ # If ctypes isn't available, we can't open a browser
++ if objc is None:
++ return False
+
++ # All the messages in this call return object references.
++ objc.objc_msgSend.restype = c_void_p
+
-+async def log_stream_task(initial_devices):
-+ # Wait up to 5 minutes for the build to complete and the simulator to boot.
-+ udid = await asyncio.wait_for(find_device(initial_devices), 5 * 60)
++ # This is the equivalent of:
++ # NSString url_string =
++ # [NSString stringWithCString:url.encode("utf-8")
++ # encoding:NSUTF8StringEncoding];
++ NSString = objc.objc_getClass(b"NSString")
++ constructor = objc.sel_registerName(b"stringWithCString:encoding:")
++ objc.objc_msgSend.argtypes = [c_void_p, c_void_p, c_char_p, c_ulong]
++ url_string = objc.objc_msgSend(
++ NSString,
++ constructor,
++ url.encode("utf-8"),
++ 4, # NSUTF8StringEncoding = 4
++ )
+
-+ # Stream the iOS device's logs, filtering out messages that come from the
-+ # XCTest test suite (catching NSLog messages from the test method), or
-+ # Python itself (catching stdout/stderr content routed to the system log
-+ # with config->use_system_logger).
-+ args = [
-+ "xcrun",
-+ "simctl",
-+ "--set",
-+ "testing",
-+ "spawn",
-+ udid,
-+ "log",
-+ "stream",
-+ "--style",
-+ "compact",
-+ "--predicate",
-+ (
-+ 'senderImagePath ENDSWITH "/iOSTestbedTests.xctest/iOSTestbedTests"'
-+ ' OR senderImagePath ENDSWITH "/Python.framework/Python"'
-+ ),
-+ ]
++ # Create an NSURL object representing the URL
++ # This is the equivalent of:
++ # NSURL *nsurl = [NSURL URLWithString:url];
++ NSURL = objc.objc_getClass(b"NSURL")
++ urlWithString_ = objc.sel_registerName(b"URLWithString:")
++ objc.objc_msgSend.argtypes = [c_void_p, c_void_p, c_void_p]
++ ns_url = objc.objc_msgSend(NSURL, urlWithString_, url_string)
+
-+ async with async_process(
-+ *args,
-+ stdout=subprocess.PIPE,
-+ stderr=subprocess.STDOUT,
-+ ) as process:
-+ suppress_dupes = False
-+ while line := (await process.stdout.readline()).decode(*DECODE_ARGS):
-+ # Strip the prefix from each log line
-+ line = LOG_PREFIX_REGEX.sub("", line)
-+ # The iOS log streamer can sometimes lag; when it does, it outputs
-+ # a warning about messages being dropped... often multiple times.
-+ # Only print the first of these duplicated warnings.
-+ if line.startswith("=== Messages dropped "):
-+ if not suppress_dupes:
-+ suppress_dupes = True
-+ sys.stdout.write(line)
-+ else:
-+ suppress_dupes = False
-+ sys.stdout.write(line)
-+ sys.stdout.flush()
++ # Get the shared UIApplication instance
++ # This code is the equivalent of:
++ # UIApplication shared_app = [UIApplication sharedApplication]
++ UIApplication = objc.objc_getClass(b"UIApplication")
++ sharedApplication = objc.sel_registerName(b"sharedApplication")
++ objc.objc_msgSend.argtypes = [c_void_p, c_void_p]
++ shared_app = objc.objc_msgSend(UIApplication, sharedApplication)
+
++ # Open the URL on the shared application
++ # This code is the equivalent of:
++ # [shared_app openURL:ns_url
++ # options:NIL
++ # completionHandler:NIL];
++ openURL_ = objc.sel_registerName(b"openURL:options:completionHandler:")
++ objc.objc_msgSend.argtypes = [
++ c_void_p, c_void_p, c_void_p, c_void_p, c_void_p
++ ]
++ # Method returns void
++ objc.objc_msgSend.restype = None
++ objc.objc_msgSend(shared_app, openURL_, ns_url, None, None)
+
-+async def xcode_test(location, simulator, verbose):
-+ # Run the test suite on the named simulator
-+ print("Starting xcodebuild...")
-+ args = [
-+ "xcodebuild",
-+ "test",
-+ "-project",
-+ str(location / "iOSTestbed.xcodeproj"),
-+ "-scheme",
-+ "iOSTestbed",
-+ "-destination",
-+ f"platform=iOS Simulator,name={simulator}",
-+ "-resultBundlePath",
-+ str(location / f"{datetime.now():%Y%m%d-%H%M%S}.xcresult"),
-+ "-derivedDataPath",
-+ str(location / "DerivedData"),
-+ ]
-+ if not verbose:
-+ args += ["-quiet"]
++ return True
+
-+ async with async_process(
-+ *args,
-+ stdout=subprocess.PIPE,
-+ stderr=subprocess.STDOUT,
-+ ) as process:
-+ while line := (await process.stdout.readline()).decode(*DECODE_ARGS):
-+ sys.stdout.write(line)
-+ sys.stdout.flush()
+
+ def main():
+ import getopt
+--- /dev/null
++++ b/Mac/Resources/app-store-compliance.patch
+@@ -0,0 +1 @@
++# No compliance patching required.
+diff --git a/Makefile.pre.in b/Makefile.pre.in
+index fa99dd86c41..51bd9edd8d5 100644
+--- a/Makefile.pre.in
++++ b/Makefile.pre.in
+@@ -170,18 +170,29 @@
+ EXE= @EXEEXT@
+ BUILDEXE= @BUILDEXEEXT@
+
++# Name of the patch file to apply for app store compliance
++APP_STORE_COMPLIANCE_PATCH=@APP_STORE_COMPLIANCE_PATCH@
+
-+ status = await asyncio.wait_for(process.wait(), timeout=1)
-+ exit(status)
+ # Short name and location for Mac OS X Python framework
+ UNIVERSALSDK=@UNIVERSALSDK@
+ PYTHONFRAMEWORK= @PYTHONFRAMEWORK@
+ PYTHONFRAMEWORKDIR= @PYTHONFRAMEWORKDIR@
+ PYTHONFRAMEWORKPREFIX= @PYTHONFRAMEWORKPREFIX@
+ PYTHONFRAMEWORKINSTALLDIR= @PYTHONFRAMEWORKINSTALLDIR@
+-# Deployment target selected during configure, to be checked
++PYTHONFRAMEWORKINSTALLNAMEPREFIX= @PYTHONFRAMEWORKINSTALLNAMEPREFIX@
++RESSRCDIR= @RESSRCDIR@
++# macOS deployment target selected during configure, to be checked
+ # by distutils. The export statement is needed to ensure that the
+ # deployment target is active during build.
+ MACOSX_DEPLOYMENT_TARGET=@CONFIGURE_MACOSX_DEPLOYMENT_TARGET@
+ @EXPORT_MACOSX_DEPLOYMENT_TARGET@export MACOSX_DEPLOYMENT_TARGET
+
++# iOS Deployment target selected during configure. Unlike macOS, the iOS
++# deployment target is controlled using `-mios-version-min` arguments added to
++# CFLAGS and LDFLAGS by the configure script. This variable is not used during
++# the build, and is only listed here so it will be included in sysconfigdata.
++IPHONEOS_DEPLOYMENT_TARGET=@IPHONEOS_DEPLOYMENT_TARGET@
+
+ # Option to install to strip binaries
+ STRIPFLAG=-s
+
+@@ -307,6 +318,8 @@
+ ##########################################################################
+
+ LIBFFI_INCLUDEDIR= @LIBFFI_INCLUDEDIR@
++LIBFFI_LIBDIR= @LIBFFI_LIBDIR@
++LIBFFI_LIB= @LIBFFI_LIB@
+
+ ##########################################################################
+ # Parser
+@@ -471,7 +484,7 @@
+
+ # Default target
+ all: @DEF_MAKE_ALL_RULE@
+-build_all: check-clean-src $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks \
++build_all: check-clean-src check-app-store-compliance $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks \
+ Programs/_testembed python-config
+
+ # Check that the source is clean when building out of source.
+@@ -483,6 +496,16 @@
+ exit 1; \
+ fi
+
++# Check that the app store compliance patch can be applied (if configured).
++# This is checked as a dry-run against the original library sources;
++# the patch will be actually applied during the install phase.
++.PHONY: check-app-store-compliance
++check-app-store-compliance:
++ @if [ "$(APP_STORE_COMPLIANCE_PATCH)" != "" ]; then \
++ patch --dry-run --quiet --force --strip 1 --directory "$(abs_srcdir)" --input "$(abs_srcdir)/$(APP_STORE_COMPLIANCE_PATCH)"; \
++ echo "App store compliance patch can be applied."; \
++ fi
+
-+# A backport of Path.relative_to(*, walk_up=True)
-+def relative_to(target, other):
-+ for step, path in enumerate(chain([other], other.parents)):
-+ if path == target or path in target.parents:
-+ break
-+ else:
-+ raise ValueError(f"{str(target)!r} and {str(other)!r} have different anchors")
-+ parts = ['..'] * step + list(target.parts[len(path.parts):])
-+ return Path("/".join(parts))
+ # Profile generation build must start from a clean tree.
+ profile-clean-stamp:
+ $(MAKE) clean
+@@ -651,7 +674,7 @@
+ $(BLDSHARED) $(NO_AS_NEEDED) -o $@ -Wl,-h$@ $^
+
+ libpython$(LDVERSION).dylib: $(LIBRARY_OBJS)
+- $(CC) -dynamiclib -Wl,-single_module $(PY_CORE_LDFLAGS) -undefined dynamic_lookup -Wl,-install_name,$(prefix)/lib/libpython$(LDVERSION).dylib -Wl,-compatibility_version,$(VERSION) -Wl,-current_version,$(VERSION) -o $@ $(LIBRARY_OBJS) $(DTRACE_OBJS) $(SHLIBS) $(LIBC) $(LIBM); \
++ $(CC) -dynamiclib $(PY_CORE_LDFLAGS) -undefined dynamic_lookup -Wl,-install_name,$(prefix)/lib/libpython$(LDVERSION).dylib -Wl,-compatibility_version,$(VERSION) -Wl,-current_version,$(VERSION) -o $@ $(LIBRARY_OBJS) $(DTRACE_OBJS) $(SHLIBS) $(LIBC) $(LIBM); \
+
+
+ libpython$(VERSION).sl: $(LIBRARY_OBJS)
+@@ -675,14 +698,13 @@
+ # This rule is here for OPENSTEP/Rhapsody/MacOSX. It builds a temporary
+ # minimal framework (not including the Lib directory and such) in the current
+ # directory.
+-RESSRCDIR=Mac/Resources/framework
+ $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK): \
+ $(LIBRARY) \
+ $(RESSRCDIR)/Info.plist
+ $(INSTALL) -d -m $(DIRMODE) $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)
+ $(CC) -o $(LDLIBRARY) $(PY_CORE_LDFLAGS) -dynamiclib \
+- -all_load $(LIBRARY) -Wl,-single_module \
+- -install_name $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK) \
++ -all_load $(LIBRARY) \
++ -install_name $(DESTDIR)$(PYTHONFRAMEWORKINSTALLNAMEPREFIX)/$(PYTHONFRAMEWORK) \
+ -compatibility_version $(VERSION) \
+ -current_version $(VERSION) \
+ -framework CoreFoundation $(LIBS);
+@@ -694,6 +716,21 @@
+ $(LN) -fsn Versions/Current/$(PYTHONFRAMEWORK) $(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK)
+ $(LN) -fsn Versions/Current/Resources $(PYTHONFRAMEWORKDIR)/Resources
+
++# This rule is for iOS, which requires an annoyingly just slighly different
++# format for frameworks to macOS. It *doesn't* use a versioned framework, and
++# the Info.plist must be in the root of the framework.
++$(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK): \
++ $(LIBRARY) \
++ $(RESSRCDIR)/Info.plist
++ $(INSTALL) -d -m $(DIRMODE) $(PYTHONFRAMEWORKDIR)
++ $(CC) -o $(LDLIBRARY) $(PY_CORE_LDFLAGS) -dynamiclib \
++ -all_load $(LIBRARY) \
++ -install_name $(PYTHONFRAMEWORKINSTALLNAMEPREFIX)/$(PYTHONFRAMEWORK) \
++ -compatibility_version $(VERSION) \
++ -current_version $(VERSION) \
++ -framework CoreFoundation $(LIBS);
++ $(INSTALL_DATA) $(RESSRCDIR)/Info.plist $(PYTHONFRAMEWORKDIR)/Info.plist
+
+ # This rule builds the Cygwin Python DLL and import library if configured
+ # for a shared core library; otherwise, this rule is a noop.
+ $(DLLLIBRARY) libpython$(LDVERSION).dll.a: $(LIBRARY_OBJS)
+@@ -1236,6 +1273,36 @@
+ $(RUNSHARED) /usr/libexec/oah/translate \
+ ./$(BUILDPYTHON) -E -m test -j 0 -u all $(TESTOPTS)
+
++# Run the test suite on the iOS simulator. Must be run on a macOS machine with
++# a full Xcode install that has an iPhone SE (3rd edition) simulator available.
++# This must be run *after* a `make install` has completed the build. The
++# `--with-framework-name` argument *cannot* be used when configuring the build.
++XCFOLDER:=iOSTestbed.$(MULTIARCH).$(shell date +%s)
++.PHONY: testios
++testios:
++ @if test "$(MACHDEP)" != "ios"; then \
++ echo "Cannot run the iOS testbed for a non-iOS build."; \
++ exit 1;\
++ fi
++ @if test "$(findstring -iphonesimulator,$(MULTIARCH))" != "-iphonesimulator"; then \
++ echo "Cannot run the iOS testbed for non-simulator builds."; \
++ exit 1;\
++ fi
++ @if test $(PYTHONFRAMEWORK) != "Python"; then \
++ echo "Cannot run the iOS testbed with a non-default framework name."; \
++ exit 1;\
++ fi
++ @if ! test -d $(PYTHONFRAMEWORKPREFIX); then \
++ echo "Cannot find a finalized iOS Python.framework. Have you run 'make install' to finalize the framework build?"; \
++ exit 1;\
++ fi
+
-+def clone_testbed(
-+ source: Path,
-+ target: Path,
-+ framework: Path,
-+ apps: list[Path],
-+) -> None:
-+ if target.exists():
-+ print(f"{target} already exists; aborting without creating project.")
-+ sys.exit(10)
++ # Clone the testbed project into the XCFOLDER
++ $(PYTHON_FOR_BUILD) $(srcdir)/Apple/testbed clone --framework $(PYTHONFRAMEWORKPREFIX) "$(XCFOLDER)"
+
-+ if framework is None:
-+ if not (
-+ source / "Python.xcframework/ios-arm64_x86_64-simulator/bin"
-+ ).is_dir():
-+ print(
-+ f"The testbed being cloned ({source}) does not contain "
-+ f"a simulator framework. Re-run with --framework"
-+ )
-+ sys.exit(11)
-+ else:
-+ if not framework.is_dir():
-+ print(f"{framework} does not exist.")
-+ sys.exit(12)
-+ elif not (
-+ framework.suffix == ".xcframework"
-+ or (framework / "Python.framework").is_dir()
-+ ):
-+ print(
-+ f"{framework} is not an XCframework, "
-+ f"or a simulator slice of a framework build."
-+ )
-+ sys.exit(13)
++ # Run the testbed project
++ $(PYTHON_FOR_BUILD) "$(XCFOLDER)" run --verbose -- test -uall --single-process --rerun -W
+
-+ print("Cloning testbed project:")
-+ print(f" Cloning {source}...", end="", flush=True)
-+ shutil.copytree(source, target, symlinks=True)
-+ print(" done")
+ # Like testall, but with only one pass and without multiple processes.
+ # Run an optional script to include information about the build environment.
+ buildbottest: build_all platform
+@@ -1264,7 +1331,11 @@
+ multissltest: build_all
+ $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/ssl/multissltests.py
+
+-install: @FRAMEWORKINSTALLFIRST@ commoninstall bininstall maninstall @FRAMEWORKINSTALLLAST@
++# All install targets use the "all" target as synchronization point to
++# prevent race conditions with PGO builds. PGO builds use recursive make,
++# which can lead to two parallel `./python setup.py build` processes that
++# step on each others toes.
++install: @FRAMEWORKINSTALLFIRST@ @INSTALLTARGETS@ @FRAMEWORKINSTALLLAST@
+ if test "x$(ENSUREPIP)" != "xno" ; then \
+ case $(ENSUREPIP) in \
+ upgrade) ensurepip="--upgrade" ;; \
+@@ -1601,7 +1672,16 @@
+ $(INSTALL_DATA) $(srcdir)/Modules/xxmodule.c \
+ $(DESTDIR)$(LIBDEST)/distutils/tests ; \
+ fi
+- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
++ @ # If app store compliance has been configured, apply the patch to the
++ @ # installed library code. The patch has been previously validated against
++ @ # the original source tree, so we can ignore any errors that are raised
++ @ # due to files that are missing because of --disable-test-modules etc.
++ @if [ "$(APP_STORE_COMPLIANCE_PATCH)" != "" ]; then \
++ echo "Applying app store compliance patch"; \
++ patch --force --reject-file "$(abs_builddir)/app-store-compliance.rej" --strip 2 --directory "$(DESTDIR)$(LIBDEST)" --input "$(abs_srcdir)/$(APP_STORE_COMPLIANCE_PATCH)" || true ; \
++ fi
++ @ # Build PYC files for the 3 optimization levels (0, 1, 2)
++ -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
+ $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
+ -j0 -d $(LIBDEST) -f \
+ -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
+@@ -1771,9 +1851,11 @@
+ # automatically set prefix to the location deep down in the framework, so we
+ # only have to cater for the structural bits of the framework.
+
+-frameworkinstallframework: frameworkinstallstructure install frameworkinstallmaclib
++frameworkinstallframework: @FRAMEWORKINSTALLFIRST@ install frameworkinstallmaclib
+
+-frameworkinstallstructure: $(LDLIBRARY)
++# macOS uses a versioned frameworks structure that includes a full install
++.PHONY: frameworkinstallversionedstructure
++frameworkinstallversionedstructure: $(LDLIBRARY)
+ @if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
+ echo Not configured with --enable-framework; \
+ exit 1; \
+@@ -1794,6 +1876,30 @@
+ $(LN) -fsn Versions/Current/Resources $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Resources
+ $(INSTALL_SHARED) $(LDLIBRARY) $(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/$(LDLIBRARY)
+
++# iOS/tvOS/watchOS uses a non-versioned framework with Info.plist in the
++# framework root, no .lproj data, and only stub compilation assistance binaries
++.PHONY: frameworkinstallunversionedstructure
++frameworkinstallunversionedstructure: $(LDLIBRARY)
++ @if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
++ echo Not configured with --enable-framework; \
++ exit 1; \
++ else true; \
++ fi
++ if test -d $(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/include; then \
++ echo "Clearing stale header symlink directory"; \
++ rm -rf $(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/include; \
++ fi
++ $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)
++ sed 's/%VERSION%/'"`$(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import platform; print(platform.python_version())'`"'/g' < $(RESSRCDIR)/Info.plist > $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Info.plist
++ $(INSTALL_SHARED) $(LDLIBRARY) $(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/$(LDLIBRARY)
++ $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(LIBDIR)
++ $(LN) -fs "../$(LDLIBRARY)" "$(DESTDIR)$(prefix)/lib/libpython$(LDVERSION).dylib"
++ $(LN) -fs "../$(LDLIBRARY)" "$(DESTDIR)$(prefix)/lib/libpython$(VERSION).dylib"
++ $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(BINDIR)
++ for file in $(srcdir)/$(RESSRCDIR)/bin/* ; do \
++ $(INSTALL) -m $(EXEMODE) $$file $(DESTDIR)$(BINDIR); \
++ done
+
-+ xc_framework_path = target / "Python.xcframework"
-+ sim_framework_path = xc_framework_path / "ios-arm64_x86_64-simulator"
-+ if framework is not None:
-+ if framework.suffix == ".xcframework":
-+ print(" Installing XCFramework...", end="", flush=True)
-+ if xc_framework_path.is_dir():
-+ shutil.rmtree(xc_framework_path)
-+ else:
-+ xc_framework_path.unlink(missing_ok=True)
-+ xc_framework_path.symlink_to(
-+ relative_to(framework, xc_framework_path.parent)
-+ )
-+ print(" done")
-+ else:
-+ print(" Installing simulator framework...", end="", flush=True)
-+ if sim_framework_path.is_dir():
-+ shutil.rmtree(sim_framework_path)
-+ else:
-+ sim_framework_path.unlink(missing_ok=True)
-+ sim_framework_path.symlink_to(
-+ relative_to(framework, sim_framework_path.parent)
-+ )
-+ print(" done")
-+ else:
-+ if (
-+ xc_framework_path.is_symlink()
-+ and not xc_framework_path.readlink().is_absolute()
-+ ):
-+ # XCFramework is a relative symlink. Rewrite the symlink relative
-+ # to the new location.
-+ print(" Rewriting symlink to XCframework...", end="", flush=True)
-+ orig_xc_framework_path = (
-+ source
-+ / xc_framework_path.readlink()
-+ ).resolve()
-+ xc_framework_path.unlink()
-+ xc_framework_path.symlink_to(
-+ orig_xc_framework_path.relative_to(
-+ xc_framework_path.parent, walk_up=True
-+ )
-+ )
-+ print(" done")
-+ elif (
-+ sim_framework_path.is_symlink()
-+ and not sim_framework_path.readlink().is_absolute()
-+ ):
-+ print(" Rewriting symlink to simulator framework...", end="", flush=True)
-+ # Simulator framework is a relative symlink. Rewrite the symlink
-+ # relative to the new location.
-+ orig_sim_framework_path = (
-+ source
-+ / "Python.XCframework"
-+ / sim_framework_path.readlink()
-+ ).resolve()
-+ sim_framework_path.unlink()
-+ sim_framework_path.symlink_to(
-+ orig_sim_framework_path.relative_to(
-+ sim_framework_path.parent, walk_up=True
-+ )
-+ )
-+ print(" done")
-+ else:
-+ print(" Using pre-existing iOS framework.")
+ # This installs Mac/Lib into the framework
+ # Install a number of symlinks to keep software that expects a normal unix
+ # install (which includes python-config) happy.
+@@ -1828,6 +1934,19 @@
+ frameworkinstallextras:
+ cd Mac && $(MAKE) installextras DESTDIR="$(DESTDIR)"
+
++# On iOS, bin/lib can't live inside the framework; include needs to be called
++# "Headers", but *must* be in the framework, and *not* include the `python3.X`
++# subdirectory. The install has put these folders in the same folder as
++# Python.framework; Move the headers to their final framework-compatible home.
++.PHONY: frameworkinstallmobileheaders
++frameworkinstallmobileheaders: frameworkinstallunversionedstructure inclinstall
++ if test -d $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Headers; then \
++ echo "Removing old framework headers"; \
++ rm -rf $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Headers; \
++ fi
++ mv "$(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/include/python$(LDVERSION)" "$(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Headers"
++ $(LN) -fs "../$(PYTHONFRAMEWORKDIR)/Headers" "$(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/include/python$(LDVERSION)"
+
-+ for app_src in apps:
-+ print(f" Installing app {app_src.name!r}...", end="", flush=True)
-+ app_target = target / f"iOSTestbed/app/{app_src.name}"
-+ if app_target.is_dir():
-+ shutil.rmtree(app_target)
-+ shutil.copytree(app_src, app_target)
-+ print(" done")
+ # Build the toplevel Makefile
+ Makefile.pre: $(srcdir)/Makefile.pre.in config.status
+ CONFIG_FILES=Makefile.pre CONFIG_HEADERS= $(SHELL) config.status
+@@ -1928,6 +2047,10 @@
+ -find build -type f -a ! -name '*.gc??' -exec rm -f {} ';'
+ -rm -f Include/pydtrace_probes.h
+ -rm -f profile-gen-stamp
++ -rm -rf Apple/iOS/testbed/Python.xcframework/ios-*/bin
++ -rm -rf Apple/iOS/testbed/Python.xcframework/ios-*/lib
++ -rm -rf Apple/iOS/testbed/Python.xcframework/ios-*/include
++ -rm -rf Apple/iOS/testbed/Python.xcframework/ios-*/Python.framework
+
+ profile-removal:
+ find . -name '*.gc??' -exec rm -f {} ';'
+@@ -1949,6 +2072,8 @@
+ config.cache config.log pyconfig.h Modules/config.c
+ -rm -rf build platform
+ -rm -rf $(PYTHONFRAMEWORKDIR)
++ -rm -rf Apple/iOS/Frameworks
++ -rm -rf iOSTestbed.*
+ -rm -f python-config.py python-config
+
+ # Make things extra clean, before making a distribution:
+@@ -2028,7 +2153,7 @@
+ .PHONY: all build_all sharedmods check-clean-src oldsharedmods test quicktest
+ .PHONY: install altinstall oldsharedinstall bininstall altbininstall
+ .PHONY: maninstall libinstall inclinstall libainstall sharedinstall
+-.PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure
++.PHONY: frameworkinstall frameworkinstallframework
+ .PHONY: frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools
+ .PHONY: frameworkaltinstallunixtools recheck clean clobber distclean
+ .PHONY: smelly funny patchcheck touch altmaninstall commoninstall
+diff --git a/Modules/getpath.c b/Modules/getpath.c
+index ef6dd59a084..e8f91831286 100644
+--- a/Modules/getpath.c
++++ b/Modules/getpath.c
+@@ -10,6 +10,7 @@
+ #include
+
+ #ifdef __APPLE__
++# include "TargetConditionals.h"
+ # include
+ #endif
+
+@@ -1090,7 +1091,7 @@
+ #endif /* HAVE_READLINK */
+
+
+-#ifdef WITH_NEXT_FRAMEWORK
++#if defined(WITH_NEXT_FRAMEWORK) && !defined(TARGET_OS_IPHONE)
+ static PyStatus
+ calculate_argv0_path_framework(PyCalculatePath *calculate, _PyPathConfig *pathconfig)
+ {
+@@ -1184,7 +1185,7 @@
+ return _PyStatus_NO_MEMORY();
+ }
+
+-#ifdef WITH_NEXT_FRAMEWORK
++#if defined(WITH_NEXT_FRAMEWORK) && !defined(TARGET_OS_IPHONE)
+ status = calculate_argv0_path_framework(calculate, pathconfig);
+ if (_PyStatus_EXCEPTION(status)) {
+ return status;
+diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
+index feffa43cfd0..50397b35207 100644
+--- a/Modules/posixmodule.c
++++ b/Modules/posixmodule.c
+@@ -332,8 +332,6 @@
+ # else
+ /* Unix functions that the configure script doesn't check for */
+ # ifndef __VXWORKS__
+-# define HAVE_EXECV 1
+-# define HAVE_FORK 1
+ # if defined(__USLC__) && defined(__SCO_VERSION__) /* SCO UDK Compiler */
+ # define HAVE_FORK1 1
+ # endif
+@@ -346,7 +344,6 @@
+ # define HAVE_KILL 1
+ # define HAVE_OPENDIR 1
+ # define HAVE_PIPE 1
+-# define HAVE_SYSTEM 1
+ # define HAVE_WAIT 1
+ # define HAVE_TTYNAME 1
+ # endif /* _MSC_VER */
+diff --git a/Python/importlib_external.h b/Python/importlib_external.h
+index e77ca4c2194..724aefabdee 100644
+--- a/Python/importlib_external.h
++++ b/Python/importlib_external.h
+@@ -1,7 +1,7 @@
+ /* Auto-generated by Programs/_freeze_importlib.c */
+ const unsigned char _Py_M__importlib_bootstrap_external[] = {
+ 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+- 0,5,0,0,0,64,0,0,0,115,250,2,0,0,100,0,
++ 0,5,0,0,0,64,0,0,0,115,10,3,0,0,100,0,
+ 90,0,100,1,97,1,100,2,100,1,108,2,90,2,100,2,
+ 100,1,108,3,90,3,100,2,100,1,108,4,90,4,100,2,
+ 100,1,108,5,90,5,100,2,100,1,108,6,90,6,101,4,
+@@ -21,21 +21,21 @@
+ 132,0,90,30,100,28,100,29,132,0,90,31,100,30,100,31,
+ 132,0,90,32,100,32,100,33,132,0,90,33,101,8,114,150,
+ 100,34,100,35,132,0,90,34,110,4,100,36,100,35,132,0,
+- 90,34,100,112,100,38,100,39,132,1,90,35,101,36,101,35,
++ 90,34,100,114,100,38,100,39,132,1,90,35,101,36,101,35,
+ 106,37,131,1,90,38,100,40,160,39,100,41,100,42,161,2,
+ 100,43,23,0,90,40,101,41,160,42,101,40,100,42,161,2,
+ 90,43,100,44,90,44,100,45,90,45,100,46,103,1,90,46,
+ 101,8,114,192,101,46,160,47,100,47,161,1,1,0,101,2,
+ 160,48,161,0,90,49,100,48,103,1,90,50,101,50,4,0,
+- 90,51,90,52,100,113,100,1,100,49,156,1,100,50,100,51,
++ 90,51,90,52,100,115,100,1,100,49,156,1,100,50,100,51,
+ 132,3,90,53,100,52,100,53,132,0,90,54,100,54,100,55,
+ 132,0,90,55,100,56,100,57,132,0,90,56,100,58,100,59,
+ 132,0,90,57,100,60,100,61,132,0,90,58,100,62,100,63,
+ 132,0,90,59,100,64,100,65,132,0,90,60,100,66,100,67,
+- 132,0,90,61,100,68,100,69,132,0,90,62,100,114,100,70,
+- 100,71,132,1,90,63,100,115,100,72,100,73,132,1,90,64,
+- 100,116,100,75,100,76,132,1,90,65,100,77,100,78,132,0,
+- 90,66,101,67,131,0,90,68,100,113,100,1,101,68,100,79,
++ 132,0,90,61,100,68,100,69,132,0,90,62,100,116,100,70,
++ 100,71,132,1,90,63,100,117,100,72,100,73,132,1,90,64,
++ 100,118,100,75,100,76,132,1,90,65,100,77,100,78,132,0,
++ 90,66,101,67,131,0,90,68,100,115,100,1,101,68,100,79,
+ 156,2,100,80,100,81,132,3,90,69,71,0,100,82,100,83,
+ 132,0,100,83,131,2,90,70,71,0,100,84,100,85,132,0,
+ 100,85,131,2,90,71,71,0,100,86,100,87,132,0,100,87,
+@@ -47,9 +47,10 @@
+ 132,0,100,97,131,2,90,77,71,0,100,98,100,99,132,0,
+ 100,99,131,2,90,78,71,0,100,100,100,101,132,0,100,101,
+ 131,2,90,79,71,0,100,102,100,103,132,0,100,103,131,2,
+- 90,80,100,113,100,104,100,105,132,1,90,81,100,106,100,107,
+- 132,0,90,82,100,108,100,109,132,0,90,83,100,110,100,111,
+- 132,0,90,84,100,1,83,0,41,117,97,94,1,0,0,67,
++ 90,80,71,0,100,104,100,105,132,0,100,105,101,76,131,3,
++ 90,81,100,115,100,106,100,107,132,1,90,82,100,108,100,109,
++ 132,0,90,83,100,110,100,111,132,0,90,84,100,112,100,113,
++ 132,0,90,85,100,1,83,0,41,119,97,94,1,0,0,67,
+ 111,114,101,32,105,109,112,108,101,109,101,110,116,97,116,105,
+ 111,110,32,111,102,32,112,97,116,104,45,98,97,115,101,100,
+ 32,105,109,112,111,114,116,46,10,10,84,104,105,115,32,109,
+@@ -90,2569 +91,2629 @@
+ 41,2,114,5,0,0,0,218,1,115,114,7,0,0,0,114,
+ 7,0,0,0,114,8,0,0,0,218,9,60,115,101,116,99,
+ 111,109,112,62,50,0,0,0,115,2,0,0,0,22,0,114,
+- 13,0,0,0,41,1,218,3,119,105,110,41,2,90,6,99,
+- 121,103,119,105,110,90,6,100,97,114,119,105,110,99,0,0,
+- 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,
+- 0,0,3,0,0,0,115,62,0,0,0,116,0,106,1,160,
+- 2,116,3,161,1,114,25,116,0,106,1,160,2,116,4,161,
+- 1,114,15,100,1,137,0,110,2,100,2,137,0,135,0,102,
+- 1,100,3,100,4,132,8,125,0,124,0,83,0,100,5,100,
+- 4,132,0,125,0,124,0,83,0,41,6,78,90,12,80,89,
+- 84,72,79,78,67,65,83,69,79,75,115,12,0,0,0,80,
+- 89,84,72,79,78,67,65,83,69,79,75,99,0,0,0,0,
+- 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,
+- 19,0,0,0,115,20,0,0,0,116,0,106,1,106,2,12,
+- 0,111,9,136,0,116,3,106,4,118,0,83,0,41,1,122,
+- 94,84,114,117,101,32,105,102,32,102,105,108,101,110,97,109,
+- 101,115,32,109,117,115,116,32,98,101,32,99,104,101,99,107,
+- 101,100,32,99,97,115,101,45,105,110,115,101,110,115,105,116,
+- 105,118,101,108,121,32,97,110,100,32,105,103,110,111,114,101,
+- 32,101,110,118,105,114,111,110,109,101,110,116,32,102,108,97,
+- 103,115,32,97,114,101,32,110,111,116,32,115,101,116,46,41,
+- 5,218,3,115,121,115,218,5,102,108,97,103,115,218,18,105,
+- 103,110,111,114,101,95,101,110,118,105,114,111,110,109,101,110,
+- 116,218,3,95,111,115,90,7,101,110,118,105,114,111,110,114,
+- 7,0,0,0,169,1,218,3,107,101,121,114,7,0,0,0,
+- 114,8,0,0,0,218,11,95,114,101,108,97,120,95,99,97,
+- 115,101,67,0,0,0,243,2,0,0,0,20,2,122,37,95,
+- 109,97,107,101,95,114,101,108,97,120,95,99,97,115,101,46,
+- 60,108,111,99,97,108,115,62,46,95,114,101,108,97,120,95,
+- 99,97,115,101,99,0,0,0,0,0,0,0,0,0,0,0,
+- 0,0,0,0,0,1,0,0,0,83,0,0,0,243,4,0,
+- 0,0,100,1,83,0,41,2,122,53,84,114,117,101,32,105,
+- 102,32,102,105,108,101,110,97,109,101,115,32,109,117,115,116,
+- 32,98,101,32,99,104,101,99,107,101,100,32,99,97,115,101,
+- 45,105,110,115,101,110,115,105,116,105,118,101,108,121,46,70,
+- 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
+- 7,0,0,0,114,8,0,0,0,114,21,0,0,0,71,0,
+- 0,0,243,2,0,0,0,4,2,41,5,114,15,0,0,0,
+- 218,8,112,108,97,116,102,111,114,109,218,10,115,116,97,114,
+- 116,115,119,105,116,104,218,27,95,67,65,83,69,95,73,78,
+- 83,69,78,83,73,84,73,86,69,95,80,76,65,84,70,79,
+- 82,77,83,218,35,95,67,65,83,69,95,73,78,83,69,78,
+- 83,73,84,73,86,69,95,80,76,65,84,70,79,82,77,83,
+- 95,83,84,82,95,75,69,89,41,1,114,21,0,0,0,114,
+- 7,0,0,0,114,19,0,0,0,114,8,0,0,0,218,16,
+- 95,109,97,107,101,95,114,101,108,97,120,95,99,97,115,101,
+- 60,0,0,0,115,16,0,0,0,12,1,12,1,6,1,4,
+- 2,12,2,4,7,8,253,4,3,114,29,0,0,0,99,1,
+- 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,
+- 0,0,0,67,0,0,0,115,20,0,0,0,116,0,124,0,
+- 131,1,100,1,64,0,160,1,100,2,100,3,161,2,83,0,
+- 41,4,122,42,67,111,110,118,101,114,116,32,97,32,51,50,
+- 45,98,105,116,32,105,110,116,101,103,101,114,32,116,111,32,
+- 108,105,116,116,108,101,45,101,110,100,105,97,110,46,236,3,
+- 0,0,0,255,127,255,127,3,0,233,4,0,0,0,218,6,
+- 108,105,116,116,108,101,41,2,218,3,105,110,116,218,8,116,
+- 111,95,98,121,116,101,115,41,1,218,1,120,114,7,0,0,
+- 0,114,7,0,0,0,114,8,0,0,0,218,12,95,112,97,
+- 99,107,95,117,105,110,116,51,50,79,0,0,0,114,22,0,
+- 0,0,114,36,0,0,0,99,1,0,0,0,0,0,0,0,
+- 0,0,0,0,1,0,0,0,4,0,0,0,67,0,0,0,
+- 243,28,0,0,0,116,0,124,0,131,1,100,1,107,2,115,
+- 8,74,0,130,1,116,1,160,2,124,0,100,2,161,2,83,
+- 0,41,3,122,47,67,111,110,118,101,114,116,32,52,32,98,
++ 13,0,0,0,41,1,218,3,119,105,110,41,5,90,6,99,
++ 121,103,119,105,110,90,6,100,97,114,119,105,110,218,3,105,
++ 111,115,218,4,116,118,111,115,218,7,119,97,116,99,104,111,
++ 115,99,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
++ 0,0,3,0,0,0,3,0,0,0,115,62,0,0,0,116,
++ 0,106,1,160,2,116,3,161,1,114,25,116,0,106,1,160,
++ 2,116,4,161,1,114,15,100,1,137,0,110,2,100,2,137,
++ 0,135,0,102,1,100,3,100,4,132,8,125,0,124,0,83,
++ 0,100,5,100,4,132,0,125,0,124,0,83,0,41,6,78,
++ 90,12,80,89,84,72,79,78,67,65,83,69,79,75,115,12,
++ 0,0,0,80,89,84,72,79,78,67,65,83,69,79,75,99,
++ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
++ 2,0,0,0,19,0,0,0,115,20,0,0,0,116,0,106,
++ 1,106,2,12,0,111,9,136,0,116,3,106,4,118,0,83,
++ 0,41,1,122,94,84,114,117,101,32,105,102,32,102,105,108,
++ 101,110,97,109,101,115,32,109,117,115,116,32,98,101,32,99,
++ 104,101,99,107,101,100,32,99,97,115,101,45,105,110,115,101,
++ 110,115,105,116,105,118,101,108,121,32,97,110,100,32,105,103,
++ 110,111,114,101,32,101,110,118,105,114,111,110,109,101,110,116,
++ 32,102,108,97,103,115,32,97,114,101,32,110,111,116,32,115,
++ 101,116,46,41,5,218,3,115,121,115,218,5,102,108,97,103,
++ 115,218,18,105,103,110,111,114,101,95,101,110,118,105,114,111,
++ 110,109,101,110,116,218,3,95,111,115,90,7,101,110,118,105,
++ 114,111,110,114,7,0,0,0,169,1,218,3,107,101,121,114,
++ 7,0,0,0,114,8,0,0,0,218,11,95,114,101,108,97,
++ 120,95,99,97,115,101,67,0,0,0,243,2,0,0,0,20,
++ 2,122,37,95,109,97,107,101,95,114,101,108,97,120,95,99,
++ 97,115,101,46,60,108,111,99,97,108,115,62,46,95,114,101,
++ 108,97,120,95,99,97,115,101,99,0,0,0,0,0,0,0,
++ 0,0,0,0,0,0,0,0,0,1,0,0,0,83,0,0,
++ 0,243,4,0,0,0,100,1,83,0,41,2,122,53,84,114,
++ 117,101,32,105,102,32,102,105,108,101,110,97,109,101,115,32,
++ 109,117,115,116,32,98,101,32,99,104,101,99,107,101,100,32,
++ 99,97,115,101,45,105,110,115,101,110,115,105,116,105,118,101,
++ 108,121,46,70,114,7,0,0,0,114,7,0,0,0,114,7,
++ 0,0,0,114,7,0,0,0,114,8,0,0,0,114,24,0,
++ 0,0,71,0,0,0,243,2,0,0,0,4,2,41,5,114,
++ 18,0,0,0,218,8,112,108,97,116,102,111,114,109,218,10,
++ 115,116,97,114,116,115,119,105,116,104,218,27,95,67,65,83,
++ 69,95,73,78,83,69,78,83,73,84,73,86,69,95,80,76,
++ 65,84,70,79,82,77,83,218,35,95,67,65,83,69,95,73,
++ 78,83,69,78,83,73,84,73,86,69,95,80,76,65,84,70,
++ 79,82,77,83,95,83,84,82,95,75,69,89,41,1,114,24,
++ 0,0,0,114,7,0,0,0,114,22,0,0,0,114,8,0,
++ 0,0,218,16,95,109,97,107,101,95,114,101,108,97,120,95,
++ 99,97,115,101,60,0,0,0,115,16,0,0,0,12,1,12,
++ 1,6,1,4,2,12,2,4,7,8,253,4,3,114,32,0,
++ 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,
++ 0,0,0,4,0,0,0,67,0,0,0,115,20,0,0,0,
++ 116,0,124,0,131,1,100,1,64,0,160,1,100,2,100,3,
++ 161,2,83,0,41,4,122,42,67,111,110,118,101,114,116,32,
++ 97,32,51,50,45,98,105,116,32,105,110,116,101,103,101,114,
++ 32,116,111,32,108,105,116,116,108,101,45,101,110,100,105,97,
++ 110,46,236,3,0,0,0,255,127,255,127,3,0,233,4,0,
++ 0,0,218,6,108,105,116,116,108,101,41,2,218,3,105,110,
++ 116,218,8,116,111,95,98,121,116,101,115,41,1,218,1,120,
++ 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,
++ 12,95,112,97,99,107,95,117,105,110,116,51,50,79,0,0,
++ 0,114,25,0,0,0,114,39,0,0,0,99,1,0,0,0,
++ 0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,
++ 67,0,0,0,243,28,0,0,0,116,0,124,0,131,1,100,
++ 1,107,2,115,8,74,0,130,1,116,1,160,2,124,0,100,
++ 2,161,2,83,0,41,3,122,47,67,111,110,118,101,114,116,
++ 32,52,32,98,121,116,101,115,32,105,110,32,108,105,116,116,
++ 108,101,45,101,110,100,105,97,110,32,116,111,32,97,110,32,
++ 105,110,116,101,103,101,114,46,114,34,0,0,0,114,35,0,
++ 0,0,169,3,114,4,0,0,0,114,36,0,0,0,218,10,
++ 102,114,111,109,95,98,121,116,101,115,169,1,218,4,100,97,
++ 116,97,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
++ 0,218,14,95,117,110,112,97,99,107,95,117,105,110,116,51,
++ 50,84,0,0,0,243,4,0,0,0,16,2,12,1,114,45,
++ 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,
++ 1,0,0,0,4,0,0,0,67,0,0,0,114,40,0,0,
++ 0,41,3,122,47,67,111,110,118,101,114,116,32,50,32,98,
+ 121,116,101,115,32,105,110,32,108,105,116,116,108,101,45,101,
+ 110,100,105,97,110,32,116,111,32,97,110,32,105,110,116,101,
+- 103,101,114,46,114,31,0,0,0,114,32,0,0,0,169,3,
+- 114,4,0,0,0,114,33,0,0,0,218,10,102,114,111,109,
+- 95,98,121,116,101,115,169,1,218,4,100,97,116,97,114,7,
+- 0,0,0,114,7,0,0,0,114,8,0,0,0,218,14,95,
+- 117,110,112,97,99,107,95,117,105,110,116,51,50,84,0,0,
+- 0,243,4,0,0,0,16,2,12,1,114,42,0,0,0,99,
+- 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+- 4,0,0,0,67,0,0,0,114,37,0,0,0,41,3,122,
+- 47,67,111,110,118,101,114,116,32,50,32,98,121,116,101,115,
+- 32,105,110,32,108,105,116,116,108,101,45,101,110,100,105,97,
+- 110,32,116,111,32,97,110,32,105,110,116,101,103,101,114,46,
+- 233,2,0,0,0,114,32,0,0,0,114,38,0,0,0,114,
+- 40,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
+- 0,0,0,218,14,95,117,110,112,97,99,107,95,117,105,110,
+- 116,49,54,89,0,0,0,114,43,0,0,0,114,45,0,0,
+- 0,99,0,0,0,0,0,0,0,0,0,0,0,0,5,0,
+- 0,0,4,0,0,0,71,0,0,0,115,228,0,0,0,124,
+- 0,115,4,100,1,83,0,116,0,124,0,131,1,100,2,107,
+- 2,114,14,124,0,100,3,25,0,83,0,100,1,125,1,103,
+- 0,125,2,116,1,116,2,106,3,124,0,131,2,68,0,93,
+- 61,92,2,125,3,125,4,124,3,160,4,116,5,161,1,115,
+- 38,124,3,160,6,116,5,161,1,114,51,124,3,160,7,116,
+- 8,161,1,112,44,124,1,125,1,116,9,124,4,23,0,103,
+- 1,125,2,113,24,124,3,160,6,100,4,161,1,114,76,124,
+- 1,160,10,161,0,124,3,160,10,161,0,107,3,114,70,124,
+- 3,125,1,124,4,103,1,125,2,113,24,124,2,160,11,124,
+- 4,161,1,1,0,113,24,124,3,112,79,124,1,125,1,124,
+- 2,160,11,124,4,161,1,1,0,113,24,100,5,100,6,132,
+- 0,124,2,68,0,131,1,125,2,116,0,124,2,131,1,100,
+- 2,107,2,114,107,124,2,100,3,25,0,115,107,124,1,116,
+- 9,23,0,83,0,124,1,116,9,160,12,124,2,161,1,23,
+- 0,83,0,41,7,250,31,82,101,112,108,97,99,101,109,101,
+- 110,116,32,102,111,114,32,111,115,46,112,97,116,104,46,106,
+- 111,105,110,40,41,46,114,10,0,0,0,114,3,0,0,0,
+- 114,0,0,0,0,114,11,0,0,0,99,1,0,0,0,0,
+- 0,0,0,0,0,0,0,2,0,0,0,5,0,0,0,83,
+- 0,0,0,243,26,0,0,0,103,0,124,0,93,9,125,1,
+- 124,1,114,2,124,1,160,0,116,1,161,1,145,2,113,2,
+- 83,0,114,7,0,0,0,169,2,218,6,114,115,116,114,105,
+- 112,218,15,112,97,116,104,95,115,101,112,97,114,97,116,111,
+- 114,115,169,2,114,5,0,0,0,218,1,112,114,7,0,0,
+- 0,114,7,0,0,0,114,8,0,0,0,218,10,60,108,105,
+- 115,116,99,111,109,112,62,119,0,0,0,115,2,0,0,0,
+- 26,0,250,30,95,112,97,116,104,95,106,111,105,110,46,60,
+- 108,111,99,97,108,115,62,46,60,108,105,115,116,99,111,109,
+- 112,62,41,13,114,4,0,0,0,218,3,109,97,112,114,18,
+- 0,0,0,218,15,95,112,97,116,104,95,115,112,108,105,116,
+- 114,111,111,116,114,26,0,0,0,218,14,112,97,116,104,95,
+- 115,101,112,95,116,117,112,108,101,218,8,101,110,100,115,119,
+- 105,116,104,114,49,0,0,0,114,50,0,0,0,218,8,112,
+- 97,116,104,95,115,101,112,218,8,99,97,115,101,102,111,108,
+- 100,218,6,97,112,112,101,110,100,218,4,106,111,105,110,41,
+- 5,218,10,112,97,116,104,95,112,97,114,116,115,218,4,114,
+- 111,111,116,218,4,112,97,116,104,90,8,110,101,119,95,114,
+- 111,111,116,218,4,116,97,105,108,114,7,0,0,0,114,7,
+- 0,0,0,114,8,0,0,0,218,10,95,112,97,116,104,95,
+- 106,111,105,110,96,0,0,0,115,42,0,0,0,4,2,4,
+- 1,12,1,8,1,4,1,4,1,20,1,20,1,14,1,12,
+- 1,10,1,16,1,4,3,8,1,12,2,8,2,12,1,14,
+- 1,20,1,8,2,14,1,114,67,0,0,0,99,0,0,0,
+- 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,
+- 0,71,0,0,0,115,20,0,0,0,116,0,160,1,100,1,
+- 100,2,132,0,124,0,68,0,131,1,161,1,83,0,41,3,
+- 114,46,0,0,0,99,1,0,0,0,0,0,0,0,0,0,
+- 0,0,2,0,0,0,5,0,0,0,83,0,0,0,114,47,
+- 0,0,0,114,7,0,0,0,114,48,0,0,0,41,2,114,
+- 5,0,0,0,218,4,112,97,114,116,114,7,0,0,0,114,
+- 7,0,0,0,114,8,0,0,0,114,53,0,0,0,128,0,
+- 0,0,115,6,0,0,0,6,0,4,1,16,255,114,54,0,
+- 0,0,41,2,114,59,0,0,0,114,62,0,0,0,41,1,
+- 114,63,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
+- 8,0,0,0,114,67,0,0,0,126,0,0,0,115,6,0,
+- 0,0,10,2,2,1,8,255,99,1,0,0,0,0,0,0,
+- 0,0,0,0,0,2,0,0,0,4,0,0,0,3,0,0,
+- 0,115,66,0,0,0,116,0,135,0,102,1,100,1,100,2,
+- 132,8,116,1,68,0,131,1,131,1,125,1,124,1,100,3,
+- 107,0,114,19,100,4,136,0,102,2,83,0,136,0,100,5,
+- 124,1,133,2,25,0,136,0,124,1,100,6,23,0,100,5,
+- 133,2,25,0,102,2,83,0,41,7,122,32,82,101,112,108,
+- 97,99,101,109,101,110,116,32,102,111,114,32,111,115,46,112,
+- 97,116,104,46,115,112,108,105,116,40,41,46,99,1,0,0,
+- 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,
+- 0,51,0,0,0,115,26,0,0,0,129,0,124,0,93,8,
+- 125,1,136,0,160,0,124,1,161,1,86,0,1,0,113,2,
+- 100,0,83,0,169,1,78,41,1,218,5,114,102,105,110,100,
+- 114,51,0,0,0,169,1,114,65,0,0,0,114,7,0,0,
+- 0,114,8,0,0,0,114,9,0,0,0,134,0,0,0,115,
+- 4,0,0,0,2,128,24,0,122,30,95,112,97,116,104,95,
+- 115,112,108,105,116,46,60,108,111,99,97,108,115,62,46,60,
+- 103,101,110,101,120,112,114,62,114,0,0,0,0,114,10,0,
+- 0,0,78,114,3,0,0,0,41,2,218,3,109,97,120,114,
+- 50,0,0,0,41,2,114,65,0,0,0,218,1,105,114,7,
+- 0,0,0,114,71,0,0,0,114,8,0,0,0,218,11,95,
+- 112,97,116,104,95,115,112,108,105,116,132,0,0,0,115,8,
+- 0,0,0,22,2,8,1,8,1,28,1,114,74,0,0,0,
+- 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+- 0,3,0,0,0,67,0,0,0,115,10,0,0,0,116,0,
+- 160,1,124,0,161,1,83,0,41,1,122,126,83,116,97,116,
+- 32,116,104,101,32,112,97,116,104,46,10,10,32,32,32,32,
+- 77,97,100,101,32,97,32,115,101,112,97,114,97,116,101,32,
+- 102,117,110,99,116,105,111,110,32,116,111,32,109,97,107,101,
+- 32,105,116,32,101,97,115,105,101,114,32,116,111,32,111,118,
+- 101,114,114,105,100,101,32,105,110,32,101,120,112,101,114,105,
+- 109,101,110,116,115,10,32,32,32,32,40,101,46,103,46,32,
+- 99,97,99,104,101,32,115,116,97,116,32,114,101,115,117,108,
+- 116,115,41,46,10,10,32,32,32,32,41,2,114,18,0,0,
+- 0,90,4,115,116,97,116,114,71,0,0,0,114,7,0,0,
+- 0,114,7,0,0,0,114,8,0,0,0,218,10,95,112,97,
+- 116,104,95,115,116,97,116,140,0,0,0,115,2,0,0,0,
+- 10,7,114,75,0,0,0,99,2,0,0,0,0,0,0,0,
+- 0,0,0,0,3,0,0,0,8,0,0,0,67,0,0,0,
+- 115,48,0,0,0,122,6,116,0,124,0,131,1,125,2,87,
+- 0,110,10,4,0,116,1,121,16,1,0,1,0,1,0,89,
+- 0,100,1,83,0,119,0,124,2,106,2,100,2,64,0,124,
+- 1,107,2,83,0,41,3,122,49,84,101,115,116,32,119,104,
+- 101,116,104,101,114,32,116,104,101,32,112,97,116,104,32,105,
+- 115,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,
+- 109,111,100,101,32,116,121,112,101,46,70,105,0,240,0,0,
+- 41,3,114,75,0,0,0,218,7,79,83,69,114,114,111,114,
+- 218,7,115,116,95,109,111,100,101,41,3,114,65,0,0,0,
+- 218,4,109,111,100,101,90,9,115,116,97,116,95,105,110,102,
+- 111,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
+- 218,18,95,112,97,116,104,95,105,115,95,109,111,100,101,95,
+- 116,121,112,101,150,0,0,0,115,12,0,0,0,2,2,12,
+- 1,12,1,6,1,2,255,14,2,114,79,0,0,0,99,1,
+- 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,
+- 0,0,0,67,0,0,0,115,10,0,0,0,116,0,124,0,
+- 100,1,131,2,83,0,41,2,122,31,82,101,112,108,97,99,
+- 101,109,101,110,116,32,102,111,114,32,111,115,46,112,97,116,
+- 104,46,105,115,102,105,108,101,46,105,0,128,0,0,41,1,
+- 114,79,0,0,0,114,71,0,0,0,114,7,0,0,0,114,
+- 7,0,0,0,114,8,0,0,0,218,12,95,112,97,116,104,
+- 95,105,115,102,105,108,101,159,0,0,0,243,2,0,0,0,
+- 10,2,114,80,0,0,0,99,1,0,0,0,0,0,0,0,
+- 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,
+- 115,22,0,0,0,124,0,115,6,116,0,160,1,161,0,125,
+- 0,116,2,124,0,100,1,131,2,83,0,41,2,122,30,82,
+- 101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,111,
+- 115,46,112,97,116,104,46,105,115,100,105,114,46,105,0,64,
+- 0,0,41,3,114,18,0,0,0,218,6,103,101,116,99,119,
+- 100,114,79,0,0,0,114,71,0,0,0,114,7,0,0,0,
+- 114,7,0,0,0,114,8,0,0,0,218,11,95,112,97,116,
+- 104,95,105,115,100,105,114,164,0,0,0,115,6,0,0,0,
+- 4,2,8,1,10,1,114,83,0,0,0,99,1,0,0,0,
+- 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,
+- 67,0,0,0,115,62,0,0,0,124,0,115,4,100,1,83,
+- 0,116,0,160,1,124,0,161,1,100,2,25,0,160,2,100,
+- 3,100,4,161,2,125,1,116,3,124,1,131,1,100,5,107,
+- 4,111,30,124,1,160,4,100,6,161,1,112,30,124,1,160,
+- 5,100,4,161,1,83,0,41,7,250,30,82,101,112,108,97,
++ 103,101,114,46,233,2,0,0,0,114,35,0,0,0,114,41,
++ 0,0,0,114,43,0,0,0,114,7,0,0,0,114,7,0,
++ 0,0,114,8,0,0,0,218,14,95,117,110,112,97,99,107,
++ 95,117,105,110,116,49,54,89,0,0,0,114,46,0,0,0,
++ 114,48,0,0,0,99,0,0,0,0,0,0,0,0,0,0,
++ 0,0,5,0,0,0,4,0,0,0,71,0,0,0,115,228,
++ 0,0,0,124,0,115,4,100,1,83,0,116,0,124,0,131,
++ 1,100,2,107,2,114,14,124,0,100,3,25,0,83,0,100,
++ 1,125,1,103,0,125,2,116,1,116,2,106,3,124,0,131,
++ 2,68,0,93,61,92,2,125,3,125,4,124,3,160,4,116,
++ 5,161,1,115,38,124,3,160,6,116,5,161,1,114,51,124,
++ 3,160,7,116,8,161,1,112,44,124,1,125,1,116,9,124,
++ 4,23,0,103,1,125,2,113,24,124,3,160,6,100,4,161,
++ 1,114,76,124,1,160,10,161,0,124,3,160,10,161,0,107,
++ 3,114,70,124,3,125,1,124,4,103,1,125,2,113,24,124,
++ 2,160,11,124,4,161,1,1,0,113,24,124,3,112,79,124,
++ 1,125,1,124,2,160,11,124,4,161,1,1,0,113,24,100,
++ 5,100,6,132,0,124,2,68,0,131,1,125,2,116,0,124,
++ 2,131,1,100,2,107,2,114,107,124,2,100,3,25,0,115,
++ 107,124,1,116,9,23,0,83,0,124,1,116,9,160,12,124,
++ 2,161,1,23,0,83,0,41,7,250,31,82,101,112,108,97,
+ 99,101,109,101,110,116,32,102,111,114,32,111,115,46,112,97,
+- 116,104,46,105,115,97,98,115,46,70,114,0,0,0,0,114,
+- 2,0,0,0,114,1,0,0,0,114,3,0,0,0,122,2,
+- 92,92,41,6,114,18,0,0,0,114,56,0,0,0,218,7,
+- 114,101,112,108,97,99,101,114,4,0,0,0,114,26,0,0,
+- 0,114,58,0,0,0,41,2,114,65,0,0,0,114,64,0,
+- 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
+- 0,218,11,95,112,97,116,104,95,105,115,97,98,115,172,0,
+- 0,0,115,8,0,0,0,4,2,4,1,22,1,32,1,114,
+- 86,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,
+- 0,1,0,0,0,3,0,0,0,67,0,0,0,115,10,0,
+- 0,0,124,0,160,0,116,1,161,1,83,0,41,1,114,84,
+- 0,0,0,41,2,114,26,0,0,0,114,50,0,0,0,114,
+- 71,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
+- 0,0,0,114,86,0,0,0,180,0,0,0,114,81,0,0,
+- 0,233,182,1,0,0,99,3,0,0,0,0,0,0,0,0,
+- 0,0,0,6,0,0,0,11,0,0,0,67,0,0,0,115,
+- 170,0,0,0,100,1,160,0,124,0,116,1,124,0,131,1,
+- 161,2,125,3,116,2,160,3,124,3,116,2,106,4,116,2,
+- 106,5,66,0,116,2,106,6,66,0,124,2,100,2,64,0,
+- 161,3,125,4,122,36,116,7,160,8,124,4,100,3,161,2,
+- 143,13,125,5,124,5,160,9,124,1,161,1,1,0,87,0,
+- 100,4,4,0,4,0,131,3,1,0,110,8,49,0,115,47,
+- 119,1,1,0,1,0,1,0,89,0,1,0,116,2,160,10,
+- 124,3,124,0,161,2,1,0,87,0,100,4,83,0,4,0,
+- 116,11,121,84,1,0,1,0,1,0,122,7,116,2,160,12,
+- 124,3,161,1,1,0,87,0,130,0,4,0,116,11,121,83,
+- 1,0,1,0,1,0,89,0,130,0,119,0,119,0,41,5,
+- 122,162,66,101,115,116,45,101,102,102,111,114,116,32,102,117,
+- 110,99,116,105,111,110,32,116,111,32,119,114,105,116,101,32,
+- 100,97,116,97,32,116,111,32,97,32,112,97,116,104,32,97,
+- 116,111,109,105,99,97,108,108,121,46,10,32,32,32,32,66,
+- 101,32,112,114,101,112,97,114,101,100,32,116,111,32,104,97,
+- 110,100,108,101,32,97,32,70,105,108,101,69,120,105,115,116,
+- 115,69,114,114,111,114,32,105,102,32,99,111,110,99,117,114,
+- 114,101,110,116,32,119,114,105,116,105,110,103,32,111,102,32,
+- 116,104,101,10,32,32,32,32,116,101,109,112,111,114,97,114,
+- 121,32,102,105,108,101,32,105,115,32,97,116,116,101,109,112,
+- 116,101,100,46,250,5,123,125,46,123,125,114,87,0,0,0,
+- 90,2,119,98,78,41,13,218,6,102,111,114,109,97,116,218,
+- 2,105,100,114,18,0,0,0,90,4,111,112,101,110,90,6,
+- 79,95,69,88,67,76,90,7,79,95,67,82,69,65,84,90,
+- 8,79,95,87,82,79,78,76,89,218,3,95,105,111,218,6,
+- 70,105,108,101,73,79,218,5,119,114,105,116,101,114,85,0,
+- 0,0,114,76,0,0,0,90,6,117,110,108,105,110,107,41,
+- 6,114,65,0,0,0,114,41,0,0,0,114,78,0,0,0,
+- 90,8,112,97,116,104,95,116,109,112,90,2,102,100,218,4,
+- 102,105,108,101,114,7,0,0,0,114,7,0,0,0,114,8,
+- 0,0,0,218,13,95,119,114,105,116,101,95,97,116,111,109,
+- 105,99,185,0,0,0,115,36,0,0,0,16,5,6,1,22,
+- 1,4,255,2,2,14,3,12,1,28,255,18,2,12,1,2,
+- 1,12,1,2,3,12,254,2,1,2,1,2,254,2,253,114,
+- 95,0,0,0,105,111,13,0,0,114,44,0,0,0,114,32,
+- 0,0,0,115,2,0,0,0,13,10,90,11,95,95,112,121,
+- 99,97,99,104,101,95,95,122,4,111,112,116,45,122,3,46,
+- 112,121,122,4,46,112,121,119,122,4,46,112,121,99,41,1,
+- 218,12,111,112,116,105,109,105,122,97,116,105,111,110,99,2,
+- 0,0,0,0,0,0,0,1,0,0,0,12,0,0,0,5,
+- 0,0,0,67,0,0,0,115,80,1,0,0,124,1,100,1,
+- 117,1,114,26,116,0,160,1,100,2,116,2,161,2,1,0,
+- 124,2,100,1,117,1,114,20,100,3,125,3,116,3,124,3,
+- 131,1,130,1,124,1,114,24,100,4,110,1,100,5,125,2,
+- 116,4,160,5,124,0,161,1,125,0,116,6,124,0,131,1,
+- 92,2,125,4,125,5,124,5,160,7,100,6,161,1,92,3,
+- 125,6,125,7,125,8,116,8,106,9,106,10,125,9,124,9,
+- 100,1,117,0,114,57,116,11,100,7,131,1,130,1,100,4,
+- 160,12,124,6,114,63,124,6,110,1,124,8,124,7,124,9,
+- 103,3,161,1,125,10,124,2,100,1,117,0,114,86,116,8,
+- 106,13,106,14,100,8,107,2,114,82,100,4,125,2,110,4,
+- 116,8,106,13,106,14,125,2,116,15,124,2,131,1,125,2,
+- 124,2,100,4,107,3,114,112,124,2,160,16,161,0,115,105,
+- 116,17,100,9,160,18,124,2,161,1,131,1,130,1,100,10,
+- 160,18,124,10,116,19,124,2,161,3,125,10,124,10,116,20,
+- 100,8,25,0,23,0,125,11,116,8,106,21,100,1,117,1,
+- 114,162,116,22,124,4,131,1,115,134,116,23,116,4,160,24,
+- 161,0,124,4,131,2,125,4,124,4,100,5,25,0,100,11,
+- 107,2,114,152,124,4,100,8,25,0,116,25,118,1,114,152,
+- 124,4,100,12,100,1,133,2,25,0,125,4,116,23,116,8,
+- 106,21,124,4,160,26,116,25,161,1,124,11,131,3,83,0,
+- 116,23,124,4,116,27,124,11,131,3,83,0,41,13,97,254,
+- 2,0,0,71,105,118,101,110,32,116,104,101,32,112,97,116,
+- 104,32,116,111,32,97,32,46,112,121,32,102,105,108,101,44,
+- 32,114,101,116,117,114,110,32,116,104,101,32,112,97,116,104,
+- 32,116,111,32,105,116,115,32,46,112,121,99,32,102,105,108,
+- 101,46,10,10,32,32,32,32,84,104,101,32,46,112,121,32,
+- 102,105,108,101,32,100,111,101,115,32,110,111,116,32,110,101,
+- 101,100,32,116,111,32,101,120,105,115,116,59,32,116,104,105,
+- 115,32,115,105,109,112,108,121,32,114,101,116,117,114,110,115,
+- 32,116,104,101,32,112,97,116,104,32,116,111,32,116,104,101,
+- 10,32,32,32,32,46,112,121,99,32,102,105,108,101,32,99,
+- 97,108,99,117,108,97,116,101,100,32,97,115,32,105,102,32,
+- 116,104,101,32,46,112,121,32,102,105,108,101,32,119,101,114,
+- 101,32,105,109,112,111,114,116,101,100,46,10,10,32,32,32,
+- 32,84,104,101,32,39,111,112,116,105,109,105,122,97,116,105,
+- 111,110,39,32,112,97,114,97,109,101,116,101,114,32,99,111,
+- 110,116,114,111,108,115,32,116,104,101,32,112,114,101,115,117,
+- 109,101,100,32,111,112,116,105,109,105,122,97,116,105,111,110,
+- 32,108,101,118,101,108,32,111,102,10,32,32,32,32,116,104,
+- 101,32,98,121,116,101,99,111,100,101,32,102,105,108,101,46,
+- 32,73,102,32,39,111,112,116,105,109,105,122,97,116,105,111,
+- 110,39,32,105,115,32,110,111,116,32,78,111,110,101,44,32,
+- 116,104,101,32,115,116,114,105,110,103,32,114,101,112,114,101,
+- 115,101,110,116,97,116,105,111,110,10,32,32,32,32,111,102,
+- 32,116,104,101,32,97,114,103,117,109,101,110,116,32,105,115,
+- 32,116,97,107,101,110,32,97,110,100,32,118,101,114,105,102,
+- 105,101,100,32,116,111,32,98,101,32,97,108,112,104,97,110,
+- 117,109,101,114,105,99,32,40,101,108,115,101,32,86,97,108,
+- 117,101,69,114,114,111,114,10,32,32,32,32,105,115,32,114,
+- 97,105,115,101,100,41,46,10,10,32,32,32,32,84,104,101,
+- 32,100,101,98,117,103,95,111,118,101,114,114,105,100,101,32,
+- 112,97,114,97,109,101,116,101,114,32,105,115,32,100,101,112,
+- 114,101,99,97,116,101,100,46,32,73,102,32,100,101,98,117,
+- 103,95,111,118,101,114,114,105,100,101,32,105,115,32,110,111,
+- 116,32,78,111,110,101,44,10,32,32,32,32,97,32,84,114,
+- 117,101,32,118,97,108,117,101,32,105,115,32,116,104,101,32,
+- 115,97,109,101,32,97,115,32,115,101,116,116,105,110,103,32,
+- 39,111,112,116,105,109,105,122,97,116,105,111,110,39,32,116,
+- 111,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,
+- 110,103,10,32,32,32,32,119,104,105,108,101,32,97,32,70,
+- 97,108,115,101,32,118,97,108,117,101,32,105,115,32,101,113,
+- 117,105,118,97,108,101,110,116,32,116,111,32,115,101,116,116,
+- 105,110,103,32,39,111,112,116,105,109,105,122,97,116,105,111,
+- 110,39,32,116,111,32,39,49,39,46,10,10,32,32,32,32,
+- 73,102,32,115,121,115,46,105,109,112,108,101,109,101,110,116,
+- 97,116,105,111,110,46,99,97,99,104,101,95,116,97,103,32,
+- 105,115,32,78,111,110,101,32,116,104,101,110,32,78,111,116,
+- 73,109,112,108,101,109,101,110,116,101,100,69,114,114,111,114,
+- 32,105,115,32,114,97,105,115,101,100,46,10,10,32,32,32,
+- 32,78,122,70,116,104,101,32,100,101,98,117,103,95,111,118,
+- 101,114,114,105,100,101,32,112,97,114,97,109,101,116,101,114,
+- 32,105,115,32,100,101,112,114,101,99,97,116,101,100,59,32,
+- 117,115,101,32,39,111,112,116,105,109,105,122,97,116,105,111,
+- 110,39,32,105,110,115,116,101,97,100,122,50,100,101,98,117,
+- 103,95,111,118,101,114,114,105,100,101,32,111,114,32,111,112,
+- 116,105,109,105,122,97,116,105,111,110,32,109,117,115,116,32,
+- 98,101,32,115,101,116,32,116,111,32,78,111,110,101,114,10,
+- 0,0,0,114,3,0,0,0,218,1,46,250,36,115,121,115,
+- 46,105,109,112,108,101,109,101,110,116,97,116,105,111,110,46,
+- 99,97,99,104,101,95,116,97,103,32,105,115,32,78,111,110,
+- 101,114,0,0,0,0,122,24,123,33,114,125,32,105,115,32,
+- 110,111,116,32,97,108,112,104,97,110,117,109,101,114,105,99,
+- 122,7,123,125,46,123,125,123,125,114,11,0,0,0,114,44,
+- 0,0,0,41,28,218,9,95,119,97,114,110,105,110,103,115,
+- 218,4,119,97,114,110,218,18,68,101,112,114,101,99,97,116,
+- 105,111,110,87,97,114,110,105,110,103,218,9,84,121,112,101,
+- 69,114,114,111,114,114,18,0,0,0,218,6,102,115,112,97,
+- 116,104,114,74,0,0,0,218,10,114,112,97,114,116,105,116,
+- 105,111,110,114,15,0,0,0,218,14,105,109,112,108,101,109,
+- 101,110,116,97,116,105,111,110,218,9,99,97,99,104,101,95,
+- 116,97,103,218,19,78,111,116,73,109,112,108,101,109,101,110,
+- 116,101,100,69,114,114,111,114,114,62,0,0,0,114,16,0,
+- 0,0,218,8,111,112,116,105,109,105,122,101,218,3,115,116,
+- 114,218,7,105,115,97,108,110,117,109,218,10,86,97,108,117,
+- 101,69,114,114,111,114,114,89,0,0,0,218,4,95,79,80,
+- 84,218,17,66,89,84,69,67,79,68,69,95,83,85,70,70,
+- 73,88,69,83,218,14,112,121,99,97,99,104,101,95,112,114,
+- 101,102,105,120,114,86,0,0,0,114,67,0,0,0,114,82,
+- 0,0,0,114,50,0,0,0,218,6,108,115,116,114,105,112,
+- 218,8,95,80,89,67,65,67,72,69,41,12,114,65,0,0,
+- 0,90,14,100,101,98,117,103,95,111,118,101,114,114,105,100,
+- 101,114,96,0,0,0,218,7,109,101,115,115,97,103,101,218,
+- 4,104,101,97,100,114,66,0,0,0,90,4,98,97,115,101,
+- 114,6,0,0,0,218,4,114,101,115,116,90,3,116,97,103,
+- 90,15,97,108,109,111,115,116,95,102,105,108,101,110,97,109,
+- 101,218,8,102,105,108,101,110,97,109,101,114,7,0,0,0,
+- 114,7,0,0,0,114,8,0,0,0,218,17,99,97,99,104,
+- 101,95,102,114,111,109,95,115,111,117,114,99,101,124,1,0,
+- 0,115,72,0,0,0,8,18,6,1,2,1,4,255,8,2,
+- 4,1,8,1,12,1,10,1,12,1,16,1,8,1,8,1,
+- 8,1,24,1,8,1,12,1,6,1,8,2,8,1,8,1,
+- 8,1,14,1,14,1,12,1,10,1,8,9,14,1,24,5,
+- 12,1,2,4,4,1,8,1,2,1,4,253,12,5,114,121,
+- 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,
+- 10,0,0,0,5,0,0,0,67,0,0,0,115,40,1,0,
+- 0,116,0,106,1,106,2,100,1,117,0,114,10,116,3,100,
+- 2,131,1,130,1,116,4,160,5,124,0,161,1,125,0,116,
+- 6,124,0,131,1,92,2,125,1,125,2,100,3,125,3,116,
+- 0,106,7,100,1,117,1,114,51,116,0,106,7,160,8,116,
+- 9,161,1,125,4,124,1,160,10,124,4,116,11,23,0,161,
+- 1,114,51,124,1,116,12,124,4,131,1,100,1,133,2,25,
+- 0,125,1,100,4,125,3,124,3,115,72,116,6,124,1,131,
+- 1,92,2,125,1,125,5,124,5,116,13,107,3,114,72,116,
+- 14,116,13,155,0,100,5,124,0,155,2,157,3,131,1,130,
+- 1,124,2,160,15,100,6,161,1,125,6,124,6,100,7,118,
+- 1,114,88,116,14,100,8,124,2,155,2,157,2,131,1,130,
+- 1,124,6,100,9,107,2,114,132,124,2,160,16,100,6,100,
+- 10,161,2,100,11,25,0,125,7,124,7,160,10,116,17,161,
+- 1,115,112,116,14,100,12,116,17,155,2,157,2,131,1,130,
+- 1,124,7,116,12,116,17,131,1,100,1,133,2,25,0,125,
+- 8,124,8,160,18,161,0,115,132,116,14,100,13,124,7,155,
+- 2,100,14,157,3,131,1,130,1,124,2,160,19,100,6,161,
+- 1,100,15,25,0,125,9,116,20,124,1,124,9,116,21,100,
+- 15,25,0,23,0,131,2,83,0,41,16,97,110,1,0,0,
+- 71,105,118,101,110,32,116,104,101,32,112,97,116,104,32,116,
+- 111,32,97,32,46,112,121,99,46,32,102,105,108,101,44,32,
+- 114,101,116,117,114,110,32,116,104,101,32,112,97,116,104,32,
+- 116,111,32,105,116,115,32,46,112,121,32,102,105,108,101,46,
+- 10,10,32,32,32,32,84,104,101,32,46,112,121,99,32,102,
+- 105,108,101,32,100,111,101,115,32,110,111,116,32,110,101,101,
+- 100,32,116,111,32,101,120,105,115,116,59,32,116,104,105,115,
+- 32,115,105,109,112,108,121,32,114,101,116,117,114,110,115,32,
+- 116,104,101,32,112,97,116,104,32,116,111,10,32,32,32,32,
+- 116,104,101,32,46,112,121,32,102,105,108,101,32,99,97,108,
+- 99,117,108,97,116,101,100,32,116,111,32,99,111,114,114,101,
+- 115,112,111,110,100,32,116,111,32,116,104,101,32,46,112,121,
+- 99,32,102,105,108,101,46,32,32,73,102,32,112,97,116,104,
+- 32,100,111,101,115,10,32,32,32,32,110,111,116,32,99,111,
+- 110,102,111,114,109,32,116,111,32,80,69,80,32,51,49,52,
+- 55,47,52,56,56,32,102,111,114,109,97,116,44,32,86,97,
+- 108,117,101,69,114,114,111,114,32,119,105,108,108,32,98,101,
+- 32,114,97,105,115,101,100,46,32,73,102,10,32,32,32,32,
+- 115,121,115,46,105,109,112,108,101,109,101,110,116,97,116,105,
+- 111,110,46,99,97,99,104,101,95,116,97,103,32,105,115,32,
+- 78,111,110,101,32,116,104,101,110,32,78,111,116,73,109,112,
+- 108,101,109,101,110,116,101,100,69,114,114,111,114,32,105,115,
+- 32,114,97,105,115,101,100,46,10,10,32,32,32,32,78,114,
+- 98,0,0,0,70,84,122,31,32,110,111,116,32,98,111,116,
+- 116,111,109,45,108,101,118,101,108,32,100,105,114,101,99,116,
+- 111,114,121,32,105,110,32,114,97,0,0,0,62,2,0,0,
+- 0,114,44,0,0,0,233,3,0,0,0,122,29,101,120,112,
+- 101,99,116,101,100,32,111,110,108,121,32,50,32,111,114,32,
+- 51,32,100,111,116,115,32,105,110,32,114,122,0,0,0,114,
+- 44,0,0,0,233,254,255,255,255,122,53,111,112,116,105,109,
+- 105,122,97,116,105,111,110,32,112,111,114,116,105,111,110,32,
+- 111,102,32,102,105,108,101,110,97,109,101,32,100,111,101,115,
+- 32,110,111,116,32,115,116,97,114,116,32,119,105,116,104,32,
+- 122,19,111,112,116,105,109,105,122,97,116,105,111,110,32,108,
+- 101,118,101,108,32,122,29,32,105,115,32,110,111,116,32,97,
+- 110,32,97,108,112,104,97,110,117,109,101,114,105,99,32,118,
+- 97,108,117,101,114,0,0,0,0,41,22,114,15,0,0,0,
+- 114,105,0,0,0,114,106,0,0,0,114,107,0,0,0,114,
+- 18,0,0,0,114,103,0,0,0,114,74,0,0,0,114,114,
+- 0,0,0,114,49,0,0,0,114,50,0,0,0,114,26,0,
+- 0,0,114,59,0,0,0,114,4,0,0,0,114,116,0,0,
+- 0,114,111,0,0,0,218,5,99,111,117,110,116,218,6,114,
+- 115,112,108,105,116,114,112,0,0,0,114,110,0,0,0,218,
+- 9,112,97,114,116,105,116,105,111,110,114,67,0,0,0,218,
+- 15,83,79,85,82,67,69,95,83,85,70,70,73,88,69,83,
+- 41,10,114,65,0,0,0,114,118,0,0,0,90,16,112,121,
+- 99,97,99,104,101,95,102,105,108,101,110,97,109,101,90,23,
+- 102,111,117,110,100,95,105,110,95,112,121,99,97,99,104,101,
+- 95,112,114,101,102,105,120,90,13,115,116,114,105,112,112,101,
+- 100,95,112,97,116,104,90,7,112,121,99,97,99,104,101,90,
+- 9,100,111,116,95,99,111,117,110,116,114,96,0,0,0,90,
+- 9,111,112,116,95,108,101,118,101,108,90,13,98,97,115,101,
+- 95,102,105,108,101,110,97,109,101,114,7,0,0,0,114,7,
+- 0,0,0,114,8,0,0,0,218,17,115,111,117,114,99,101,
+- 95,102,114,111,109,95,99,97,99,104,101,195,1,0,0,115,
+- 60,0,0,0,12,9,8,1,10,1,12,1,4,1,10,1,
+- 12,1,14,1,16,1,4,1,4,1,12,1,8,1,8,1,
+- 2,1,8,255,10,2,8,1,14,1,8,1,16,1,10,1,
+- 4,1,2,1,8,255,16,2,8,1,16,1,14,2,18,1,
+- 114,128,0,0,0,99,1,0,0,0,0,0,0,0,0,0,
+- 0,0,5,0,0,0,9,0,0,0,67,0,0,0,115,124,
+- 0,0,0,116,0,124,0,131,1,100,1,107,2,114,8,100,
+- 2,83,0,124,0,160,1,100,3,161,1,92,3,125,1,125,
+- 2,125,3,124,1,114,28,124,3,160,2,161,0,100,4,100,
+- 5,133,2,25,0,100,6,107,3,114,30,124,0,83,0,122,
+- 6,116,3,124,0,131,1,125,4,87,0,110,17,4,0,116,
+- 4,116,5,102,2,121,53,1,0,1,0,1,0,124,0,100,
+- 2,100,5,133,2,25,0,125,4,89,0,110,1,119,0,116,
+- 6,124,4,131,1,114,60,124,4,83,0,124,0,83,0,41,
+- 7,122,188,67,111,110,118,101,114,116,32,97,32,98,121,116,
+- 101,99,111,100,101,32,102,105,108,101,32,112,97,116,104,32,
+- 116,111,32,97,32,115,111,117,114,99,101,32,112,97,116,104,
+- 32,40,105,102,32,112,111,115,115,105,98,108,101,41,46,10,
+- 10,32,32,32,32,84,104,105,115,32,102,117,110,99,116,105,
+- 111,110,32,101,120,105,115,116,115,32,112,117,114,101,108,121,
+- 32,102,111,114,32,98,97,99,107,119,97,114,100,115,45,99,
+- 111,109,112,97,116,105,98,105,108,105,116,121,32,102,111,114,
+- 10,32,32,32,32,80,121,73,109,112,111,114,116,95,69,120,
+- 101,99,67,111,100,101,77,111,100,117,108,101,87,105,116,104,
+- 70,105,108,101,110,97,109,101,115,40,41,32,105,110,32,116,
+- 104,101,32,67,32,65,80,73,46,10,10,32,32,32,32,114,
+- 0,0,0,0,78,114,97,0,0,0,233,253,255,255,255,233,
+- 255,255,255,255,90,2,112,121,41,7,114,4,0,0,0,114,
+- 104,0,0,0,218,5,108,111,119,101,114,114,128,0,0,0,
+- 114,107,0,0,0,114,111,0,0,0,114,80,0,0,0,41,
+- 5,218,13,98,121,116,101,99,111,100,101,95,112,97,116,104,
+- 114,119,0,0,0,218,1,95,90,9,101,120,116,101,110,115,
+- 105,111,110,218,11,115,111,117,114,99,101,95,112,97,116,104,
++ 116,104,46,106,111,105,110,40,41,46,114,10,0,0,0,114,
++ 3,0,0,0,114,0,0,0,0,114,11,0,0,0,99,1,
++ 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,5,
++ 0,0,0,83,0,0,0,243,26,0,0,0,103,0,124,0,
++ 93,9,125,1,124,1,114,2,124,1,160,0,116,1,161,1,
++ 145,2,113,2,83,0,114,7,0,0,0,169,2,218,6,114,
++ 115,116,114,105,112,218,15,112,97,116,104,95,115,101,112,97,
++ 114,97,116,111,114,115,169,2,114,5,0,0,0,218,1,112,
+ 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,
+- 15,95,103,101,116,95,115,111,117,114,99,101,102,105,108,101,
+- 235,1,0,0,115,22,0,0,0,12,7,4,1,16,1,24,
+- 1,4,1,2,1,12,1,16,1,16,1,2,255,16,2,114,
+- 135,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,
+- 0,1,0,0,0,8,0,0,0,67,0,0,0,115,68,0,
+- 0,0,124,0,160,0,116,1,116,2,131,1,161,1,114,23,
+- 122,5,116,3,124,0,131,1,87,0,83,0,4,0,116,4,
+- 121,22,1,0,1,0,1,0,89,0,100,0,83,0,119,0,
+- 124,0,160,0,116,1,116,5,131,1,161,1,114,32,124,0,
+- 83,0,100,0,83,0,114,69,0,0,0,41,6,114,58,0,
+- 0,0,218,5,116,117,112,108,101,114,127,0,0,0,114,121,
+- 0,0,0,114,107,0,0,0,114,113,0,0,0,41,1,114,
+- 120,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
+- 0,0,0,218,11,95,103,101,116,95,99,97,99,104,101,100,
+- 254,1,0,0,115,18,0,0,0,14,1,2,1,10,1,12,
+- 1,6,1,2,255,14,2,4,1,4,2,114,137,0,0,0,
++ 10,60,108,105,115,116,99,111,109,112,62,119,0,0,0,115,
++ 2,0,0,0,26,0,250,30,95,112,97,116,104,95,106,111,
++ 105,110,46,60,108,111,99,97,108,115,62,46,60,108,105,115,
++ 116,99,111,109,112,62,41,13,114,4,0,0,0,218,3,109,
++ 97,112,114,21,0,0,0,218,15,95,112,97,116,104,95,115,
++ 112,108,105,116,114,111,111,116,114,29,0,0,0,218,14,112,
++ 97,116,104,95,115,101,112,95,116,117,112,108,101,218,8,101,
++ 110,100,115,119,105,116,104,114,52,0,0,0,114,53,0,0,
++ 0,218,8,112,97,116,104,95,115,101,112,218,8,99,97,115,
++ 101,102,111,108,100,218,6,97,112,112,101,110,100,218,4,106,
++ 111,105,110,41,5,218,10,112,97,116,104,95,112,97,114,116,
++ 115,218,4,114,111,111,116,218,4,112,97,116,104,90,8,110,
++ 101,119,95,114,111,111,116,218,4,116,97,105,108,114,7,0,
++ 0,0,114,7,0,0,0,114,8,0,0,0,218,10,95,112,
++ 97,116,104,95,106,111,105,110,96,0,0,0,115,42,0,0,
++ 0,4,2,4,1,12,1,8,1,4,1,4,1,20,1,20,
++ 1,14,1,12,1,10,1,16,1,4,3,8,1,12,2,8,
++ 2,12,1,14,1,20,1,8,2,14,1,114,70,0,0,0,
++ 99,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
++ 0,4,0,0,0,71,0,0,0,115,20,0,0,0,116,0,
++ 160,1,100,1,100,2,132,0,124,0,68,0,131,1,161,1,
++ 83,0,41,3,114,49,0,0,0,99,1,0,0,0,0,0,
++ 0,0,0,0,0,0,2,0,0,0,5,0,0,0,83,0,
++ 0,0,114,50,0,0,0,114,7,0,0,0,114,51,0,0,
++ 0,41,2,114,5,0,0,0,218,4,112,97,114,116,114,7,
++ 0,0,0,114,7,0,0,0,114,8,0,0,0,114,56,0,
++ 0,0,128,0,0,0,115,6,0,0,0,6,0,4,1,16,
++ 255,114,57,0,0,0,41,2,114,62,0,0,0,114,65,0,
++ 0,0,41,1,114,66,0,0,0,114,7,0,0,0,114,7,
++ 0,0,0,114,8,0,0,0,114,70,0,0,0,126,0,0,
++ 0,115,6,0,0,0,10,2,2,1,8,255,99,1,0,0,
++ 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,
++ 0,3,0,0,0,115,66,0,0,0,116,0,135,0,102,1,
++ 100,1,100,2,132,8,116,1,68,0,131,1,131,1,125,1,
++ 124,1,100,3,107,0,114,19,100,4,136,0,102,2,83,0,
++ 136,0,100,5,124,1,133,2,25,0,136,0,124,1,100,6,
++ 23,0,100,5,133,2,25,0,102,2,83,0,41,7,122,32,
++ 82,101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,
++ 111,115,46,112,97,116,104,46,115,112,108,105,116,40,41,46,
+ 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
+- 0,8,0,0,0,67,0,0,0,115,50,0,0,0,122,7,
+- 116,0,124,0,131,1,106,1,125,1,87,0,110,11,4,0,
+- 116,2,121,18,1,0,1,0,1,0,100,1,125,1,89,0,
+- 110,1,119,0,124,1,100,2,79,0,125,1,124,1,83,0,
+- 41,3,122,51,67,97,108,99,117,108,97,116,101,32,116,104,
+- 101,32,109,111,100,101,32,112,101,114,109,105,115,115,105,111,
+- 110,115,32,102,111,114,32,97,32,98,121,116,101,99,111,100,
+- 101,32,102,105,108,101,46,114,87,0,0,0,233,128,0,0,
+- 0,41,3,114,75,0,0,0,114,77,0,0,0,114,76,0,
+- 0,0,41,2,114,65,0,0,0,114,78,0,0,0,114,7,
+- 0,0,0,114,7,0,0,0,114,8,0,0,0,218,10,95,
+- 99,97,108,99,95,109,111,100,101,10,2,0,0,115,14,0,
+- 0,0,2,2,14,1,12,1,8,1,2,255,8,4,4,1,
+- 114,139,0,0,0,99,1,0,0,0,0,0,0,0,0,0,
+- 0,0,3,0,0,0,4,0,0,0,3,0,0,0,115,52,
+- 0,0,0,100,6,135,0,102,1,100,2,100,3,132,9,125,
+- 1,116,0,100,1,117,1,114,15,116,0,106,1,125,2,110,
+- 4,100,4,100,5,132,0,125,2,124,2,124,1,136,0,131,
+- 2,1,0,124,1,83,0,41,7,122,252,68,101,99,111,114,
+- 97,116,111,114,32,116,111,32,118,101,114,105,102,121,32,116,
+- 104,97,116,32,116,104,101,32,109,111,100,117,108,101,32,98,
+- 101,105,110,103,32,114,101,113,117,101,115,116,101,100,32,109,
+- 97,116,99,104,101,115,32,116,104,101,32,111,110,101,32,116,
+- 104,101,10,32,32,32,32,108,111,97,100,101,114,32,99,97,
+- 110,32,104,97,110,100,108,101,46,10,10,32,32,32,32,84,
+- 104,101,32,102,105,114,115,116,32,97,114,103,117,109,101,110,
+- 116,32,40,115,101,108,102,41,32,109,117,115,116,32,100,101,
+- 102,105,110,101,32,95,110,97,109,101,32,119,104,105,99,104,
+- 32,116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,
+- 109,101,110,116,32,105,115,10,32,32,32,32,99,111,109,112,
+- 97,114,101,100,32,97,103,97,105,110,115,116,46,32,73,102,
+- 32,116,104,101,32,99,111,109,112,97,114,105,115,111,110,32,
+- 102,97,105,108,115,32,116,104,101,110,32,73,109,112,111,114,
+- 116,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100,
+- 46,10,10,32,32,32,32,78,99,2,0,0,0,0,0,0,
+- 0,0,0,0,0,4,0,0,0,4,0,0,0,31,0,0,
+- 0,115,72,0,0,0,124,1,100,0,117,0,114,8,124,0,
+- 106,0,125,1,110,16,124,0,106,0,124,1,107,3,114,24,
+- 116,1,100,1,124,0,106,0,124,1,102,2,22,0,124,1,
+- 100,2,141,2,130,1,136,0,124,0,124,1,103,2,124,2,
+- 162,1,82,0,105,0,124,3,164,1,142,1,83,0,41,3,
+- 78,122,30,108,111,97,100,101,114,32,102,111,114,32,37,115,
+- 32,99,97,110,110,111,116,32,104,97,110,100,108,101,32,37,
+- 115,169,1,218,4,110,97,109,101,41,2,114,141,0,0,0,
+- 218,11,73,109,112,111,114,116,69,114,114,111,114,41,4,218,
+- 4,115,101,108,102,114,141,0,0,0,218,4,97,114,103,115,
+- 218,6,107,119,97,114,103,115,169,1,218,6,109,101,116,104,
+- 111,100,114,7,0,0,0,114,8,0,0,0,218,19,95,99,
+- 104,101,99,107,95,110,97,109,101,95,119,114,97,112,112,101,
+- 114,30,2,0,0,115,18,0,0,0,8,1,8,1,10,1,
+- 4,1,8,1,2,255,2,1,6,255,24,2,122,40,95,99,
+- 104,101,99,107,95,110,97,109,101,46,60,108,111,99,97,108,
+- 115,62,46,95,99,104,101,99,107,95,110,97,109,101,95,119,
+- 114,97,112,112,101,114,99,2,0,0,0,0,0,0,0,0,
+- 0,0,0,3,0,0,0,7,0,0,0,83,0,0,0,115,
+- 56,0,0,0,100,1,68,0,93,16,125,2,116,0,124,1,
+- 124,2,131,2,114,18,116,1,124,0,124,2,116,2,124,1,
+- 124,2,131,2,131,3,1,0,113,2,124,0,106,3,160,4,
+- 124,1,106,3,161,1,1,0,100,0,83,0,41,2,78,41,
+- 4,218,10,95,95,109,111,100,117,108,101,95,95,218,8,95,
+- 95,110,97,109,101,95,95,218,12,95,95,113,117,97,108,110,
+- 97,109,101,95,95,218,7,95,95,100,111,99,95,95,41,5,
+- 218,7,104,97,115,97,116,116,114,218,7,115,101,116,97,116,
+- 116,114,218,7,103,101,116,97,116,116,114,218,8,95,95,100,
+- 105,99,116,95,95,218,6,117,112,100,97,116,101,41,3,90,
+- 3,110,101,119,90,3,111,108,100,114,85,0,0,0,114,7,
+- 0,0,0,114,7,0,0,0,114,8,0,0,0,218,5,95,
+- 119,114,97,112,43,2,0,0,115,10,0,0,0,8,1,10,
+- 1,18,1,2,128,18,1,122,26,95,99,104,101,99,107,95,
+- 110,97,109,101,46,60,108,111,99,97,108,115,62,46,95,119,
+- 114,97,112,114,69,0,0,0,41,2,218,10,95,98,111,111,
+- 116,115,116,114,97,112,114,158,0,0,0,41,3,114,147,0,
+- 0,0,114,148,0,0,0,114,158,0,0,0,114,7,0,0,
+- 0,114,146,0,0,0,114,8,0,0,0,218,11,95,99,104,
+- 101,99,107,95,110,97,109,101,22,2,0,0,115,12,0,0,
+- 0,14,8,8,10,8,1,8,2,10,6,4,1,114,160,0,
+- 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,5,
+- 0,0,0,6,0,0,0,67,0,0,0,115,72,0,0,0,
+- 116,0,160,1,100,1,116,2,161,2,1,0,124,0,160,3,
+- 124,1,161,1,92,2,125,2,125,3,124,2,100,2,117,0,
+- 114,34,116,4,124,3,131,1,114,34,100,3,125,4,116,0,
+- 160,1,124,4,160,5,124,3,100,4,25,0,161,1,116,6,
+- 161,2,1,0,124,2,83,0,41,5,122,155,84,114,121,32,
+- 116,111,32,102,105,110,100,32,97,32,108,111,97,100,101,114,
+- 32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,
+- 101,100,32,109,111,100,117,108,101,32,98,121,32,100,101,108,
+- 101,103,97,116,105,110,103,32,116,111,10,32,32,32,32,115,
+- 101,108,102,46,102,105,110,100,95,108,111,97,100,101,114,40,
+- 41,46,10,10,32,32,32,32,84,104,105,115,32,109,101,116,
+- 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,
+- 100,32,105,110,32,102,97,118,111,114,32,111,102,32,102,105,
+- 110,100,101,114,46,102,105,110,100,95,115,112,101,99,40,41,
+- 46,10,10,32,32,32,32,122,90,102,105,110,100,95,109,111,
+- 100,117,108,101,40,41,32,105,115,32,100,101,112,114,101,99,
+- 97,116,101,100,32,97,110,100,32,115,108,97,116,101,100,32,
+- 102,111,114,32,114,101,109,111,118,97,108,32,105,110,32,80,
+- 121,116,104,111,110,32,51,46,49,50,59,32,117,115,101,32,
+- 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,
+- 101,97,100,78,122,44,78,111,116,32,105,109,112,111,114,116,
+- 105,110,103,32,100,105,114,101,99,116,111,114,121,32,123,125,
+- 58,32,109,105,115,115,105,110,103,32,95,95,105,110,105,116,
+- 95,95,114,0,0,0,0,41,7,114,99,0,0,0,114,100,
+- 0,0,0,114,101,0,0,0,218,11,102,105,110,100,95,108,
+- 111,97,100,101,114,114,4,0,0,0,114,89,0,0,0,218,
+- 13,73,109,112,111,114,116,87,97,114,110,105,110,103,41,5,
+- 114,143,0,0,0,218,8,102,117,108,108,110,97,109,101,218,
+- 6,108,111,97,100,101,114,218,8,112,111,114,116,105,111,110,
+- 115,218,3,109,115,103,114,7,0,0,0,114,7,0,0,0,
+- 114,8,0,0,0,218,17,95,102,105,110,100,95,109,111,100,
+- 117,108,101,95,115,104,105,109,53,2,0,0,115,16,0,0,
+- 0,6,7,2,2,4,254,14,6,16,1,4,1,22,1,4,
+- 1,114,167,0,0,0,99,3,0,0,0,0,0,0,0,0,
+- 0,0,0,6,0,0,0,4,0,0,0,67,0,0,0,115,
+- 166,0,0,0,124,0,100,1,100,2,133,2,25,0,125,3,
+- 124,3,116,0,107,3,114,32,100,3,124,1,155,2,100,4,
+- 124,3,155,2,157,4,125,4,116,1,160,2,100,5,124,4,
+- 161,2,1,0,116,3,124,4,102,1,105,0,124,2,164,1,
+- 142,1,130,1,116,4,124,0,131,1,100,6,107,0,114,53,
+- 100,7,124,1,155,2,157,2,125,4,116,1,160,2,100,5,
+- 124,4,161,2,1,0,116,5,124,4,131,1,130,1,116,6,
+- 124,0,100,2,100,8,133,2,25,0,131,1,125,5,124,5,
+- 100,9,64,0,114,81,100,10,124,5,155,2,100,11,124,1,
+- 155,2,157,4,125,4,116,3,124,4,102,1,105,0,124,2,
+- 164,1,142,1,130,1,124,5,83,0,41,12,97,84,2,0,
+- 0,80,101,114,102,111,114,109,32,98,97,115,105,99,32,118,
+- 97,108,105,100,105,116,121,32,99,104,101,99,107,105,110,103,
+- 32,111,102,32,97,32,112,121,99,32,104,101,97,100,101,114,
+- 32,97,110,100,32,114,101,116,117,114,110,32,116,104,101,32,
+- 102,108,97,103,115,32,102,105,101,108,100,44,10,32,32,32,
+- 32,119,104,105,99,104,32,100,101,116,101,114,109,105,110,101,
+- 115,32,104,111,119,32,116,104,101,32,112,121,99,32,115,104,
+- 111,117,108,100,32,98,101,32,102,117,114,116,104,101,114,32,
+- 118,97,108,105,100,97,116,101,100,32,97,103,97,105,110,115,
+- 116,32,116,104,101,32,115,111,117,114,99,101,46,10,10,32,
+- 32,32,32,42,100,97,116,97,42,32,105,115,32,116,104,101,
+- 32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,
+- 32,112,121,99,32,102,105,108,101,46,32,40,79,110,108,121,
+- 32,116,104,101,32,102,105,114,115,116,32,49,54,32,98,121,
+- 116,101,115,32,97,114,101,10,32,32,32,32,114,101,113,117,
+- 105,114,101,100,44,32,116,104,111,117,103,104,46,41,10,10,
+- 32,32,32,32,42,110,97,109,101,42,32,105,115,32,116,104,
+- 101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111,
+- 100,117,108,101,32,98,101,105,110,103,32,105,109,112,111,114,
+- 116,101,100,46,32,73,116,32,105,115,32,117,115,101,100,32,
+- 102,111,114,32,108,111,103,103,105,110,103,46,10,10,32,32,
+- 32,32,42,101,120,99,95,100,101,116,97,105,108,115,42,32,
+- 105,115,32,97,32,100,105,99,116,105,111,110,97,114,121,32,
+- 112,97,115,115,101,100,32,116,111,32,73,109,112,111,114,116,
+- 69,114,114,111,114,32,105,102,32,105,116,32,114,97,105,115,
+- 101,100,32,102,111,114,10,32,32,32,32,105,109,112,114,111,
+- 118,101,100,32,100,101,98,117,103,103,105,110,103,46,10,10,
+- 32,32,32,32,73,109,112,111,114,116,69,114,114,111,114,32,
+- 105,115,32,114,97,105,115,101,100,32,119,104,101,110,32,116,
+- 104,101,32,109,97,103,105,99,32,110,117,109,98,101,114,32,
+- 105,115,32,105,110,99,111,114,114,101,99,116,32,111,114,32,
+- 119,104,101,110,32,116,104,101,32,102,108,97,103,115,10,32,
+- 32,32,32,102,105,101,108,100,32,105,115,32,105,110,118,97,
+- 108,105,100,46,32,69,79,70,69,114,114,111,114,32,105,115,
+- 32,114,97,105,115,101,100,32,119,104,101,110,32,116,104,101,
+- 32,100,97,116,97,32,105,115,32,102,111,117,110,100,32,116,
+- 111,32,98,101,32,116,114,117,110,99,97,116,101,100,46,10,
+- 10,32,32,32,32,78,114,31,0,0,0,122,20,98,97,100,
+- 32,109,97,103,105,99,32,110,117,109,98,101,114,32,105,110,
+- 32,122,2,58,32,250,2,123,125,233,16,0,0,0,122,40,
+- 114,101,97,99,104,101,100,32,69,79,70,32,119,104,105,108,
+- 101,32,114,101,97,100,105,110,103,32,112,121,99,32,104,101,
+- 97,100,101,114,32,111,102,32,233,8,0,0,0,233,252,255,
+- 255,255,122,14,105,110,118,97,108,105,100,32,102,108,97,103,
+- 115,32,122,4,32,105,110,32,41,7,218,12,77,65,71,73,
+- 67,95,78,85,77,66,69,82,114,159,0,0,0,218,16,95,
+- 118,101,114,98,111,115,101,95,109,101,115,115,97,103,101,114,
+- 142,0,0,0,114,4,0,0,0,218,8,69,79,70,69,114,
+- 114,111,114,114,42,0,0,0,41,6,114,41,0,0,0,114,
+- 141,0,0,0,218,11,101,120,99,95,100,101,116,97,105,108,
+- 115,90,5,109,97,103,105,99,114,117,0,0,0,114,16,0,
++ 0,4,0,0,0,51,0,0,0,115,26,0,0,0,129,0,
++ 124,0,93,8,125,1,136,0,160,0,124,1,161,1,86,0,
++ 1,0,113,2,100,0,83,0,169,1,78,41,1,218,5,114,
++ 102,105,110,100,114,54,0,0,0,169,1,114,68,0,0,0,
++ 114,7,0,0,0,114,8,0,0,0,114,9,0,0,0,134,
++ 0,0,0,115,4,0,0,0,2,128,24,0,122,30,95,112,
++ 97,116,104,95,115,112,108,105,116,46,60,108,111,99,97,108,
++ 115,62,46,60,103,101,110,101,120,112,114,62,114,0,0,0,
++ 0,114,10,0,0,0,78,114,3,0,0,0,41,2,218,3,
++ 109,97,120,114,53,0,0,0,41,2,114,68,0,0,0,218,
++ 1,105,114,7,0,0,0,114,74,0,0,0,114,8,0,0,
++ 0,218,11,95,112,97,116,104,95,115,112,108,105,116,132,0,
++ 0,0,115,8,0,0,0,22,2,8,1,8,1,28,1,114,
++ 77,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,
++ 0,1,0,0,0,3,0,0,0,67,0,0,0,115,10,0,
++ 0,0,116,0,160,1,124,0,161,1,83,0,41,1,122,126,
++ 83,116,97,116,32,116,104,101,32,112,97,116,104,46,10,10,
++ 32,32,32,32,77,97,100,101,32,97,32,115,101,112,97,114,
++ 97,116,101,32,102,117,110,99,116,105,111,110,32,116,111,32,
++ 109,97,107,101,32,105,116,32,101,97,115,105,101,114,32,116,
++ 111,32,111,118,101,114,114,105,100,101,32,105,110,32,101,120,
++ 112,101,114,105,109,101,110,116,115,10,32,32,32,32,40,101,
++ 46,103,46,32,99,97,99,104,101,32,115,116,97,116,32,114,
++ 101,115,117,108,116,115,41,46,10,10,32,32,32,32,41,2,
++ 114,21,0,0,0,90,4,115,116,97,116,114,74,0,0,0,
++ 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,
++ 10,95,112,97,116,104,95,115,116,97,116,140,0,0,0,115,
++ 2,0,0,0,10,7,114,78,0,0,0,99,2,0,0,0,
++ 0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,
++ 67,0,0,0,115,48,0,0,0,122,6,116,0,124,0,131,
++ 1,125,2,87,0,110,10,4,0,116,1,121,16,1,0,1,
++ 0,1,0,89,0,100,1,83,0,119,0,124,2,106,2,100,
++ 2,64,0,124,1,107,2,83,0,41,3,122,49,84,101,115,
++ 116,32,119,104,101,116,104,101,114,32,116,104,101,32,112,97,
++ 116,104,32,105,115,32,116,104,101,32,115,112,101,99,105,102,
++ 105,101,100,32,109,111,100,101,32,116,121,112,101,46,70,105,
++ 0,240,0,0,41,3,114,78,0,0,0,218,7,79,83,69,
++ 114,114,111,114,218,7,115,116,95,109,111,100,101,41,3,114,
++ 68,0,0,0,218,4,109,111,100,101,90,9,115,116,97,116,
++ 95,105,110,102,111,114,7,0,0,0,114,7,0,0,0,114,
++ 8,0,0,0,218,18,95,112,97,116,104,95,105,115,95,109,
++ 111,100,101,95,116,121,112,101,150,0,0,0,115,12,0,0,
++ 0,2,2,12,1,12,1,6,1,2,255,14,2,114,82,0,
++ 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,
++ 0,0,0,3,0,0,0,67,0,0,0,115,10,0,0,0,
++ 116,0,124,0,100,1,131,2,83,0,41,2,122,31,82,101,
++ 112,108,97,99,101,109,101,110,116,32,102,111,114,32,111,115,
++ 46,112,97,116,104,46,105,115,102,105,108,101,46,105,0,128,
++ 0,0,41,1,114,82,0,0,0,114,74,0,0,0,114,7,
++ 0,0,0,114,7,0,0,0,114,8,0,0,0,218,12,95,
++ 112,97,116,104,95,105,115,102,105,108,101,159,0,0,0,243,
++ 2,0,0,0,10,2,114,83,0,0,0,99,1,0,0,0,
++ 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,
++ 67,0,0,0,115,22,0,0,0,124,0,115,6,116,0,160,
++ 1,161,0,125,0,116,2,124,0,100,1,131,2,83,0,41,
++ 2,122,30,82,101,112,108,97,99,101,109,101,110,116,32,102,
++ 111,114,32,111,115,46,112,97,116,104,46,105,115,100,105,114,
++ 46,105,0,64,0,0,41,3,114,21,0,0,0,218,6,103,
++ 101,116,99,119,100,114,82,0,0,0,114,74,0,0,0,114,
++ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,
++ 95,112,97,116,104,95,105,115,100,105,114,164,0,0,0,115,
++ 6,0,0,0,4,2,8,1,10,1,114,86,0,0,0,99,
++ 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,
++ 4,0,0,0,67,0,0,0,115,62,0,0,0,124,0,115,
++ 4,100,1,83,0,116,0,160,1,124,0,161,1,100,2,25,
++ 0,160,2,100,3,100,4,161,2,125,1,116,3,124,1,131,
++ 1,100,5,107,4,111,30,124,1,160,4,100,6,161,1,112,
++ 30,124,1,160,5,100,4,161,1,83,0,41,7,250,30,82,
++ 101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,111,
++ 115,46,112,97,116,104,46,105,115,97,98,115,46,70,114,0,
++ 0,0,0,114,2,0,0,0,114,1,0,0,0,114,3,0,
++ 0,0,122,2,92,92,41,6,114,21,0,0,0,114,59,0,
++ 0,0,218,7,114,101,112,108,97,99,101,114,4,0,0,0,
++ 114,29,0,0,0,114,61,0,0,0,41,2,114,68,0,0,
++ 0,114,67,0,0,0,114,7,0,0,0,114,7,0,0,0,
++ 114,8,0,0,0,218,11,95,112,97,116,104,95,105,115,97,
++ 98,115,172,0,0,0,115,8,0,0,0,4,2,4,1,22,
++ 1,32,1,114,89,0,0,0,99,1,0,0,0,0,0,0,
++ 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,
++ 0,115,10,0,0,0,124,0,160,0,116,1,161,1,83,0,
++ 41,1,114,87,0,0,0,41,2,114,29,0,0,0,114,53,
++ 0,0,0,114,74,0,0,0,114,7,0,0,0,114,7,0,
++ 0,0,114,8,0,0,0,114,89,0,0,0,180,0,0,0,
++ 114,84,0,0,0,233,182,1,0,0,99,3,0,0,0,0,
++ 0,0,0,0,0,0,0,6,0,0,0,11,0,0,0,67,
++ 0,0,0,115,170,0,0,0,100,1,160,0,124,0,116,1,
++ 124,0,131,1,161,2,125,3,116,2,160,3,124,3,116,2,
++ 106,4,116,2,106,5,66,0,116,2,106,6,66,0,124,2,
++ 100,2,64,0,161,3,125,4,122,36,116,7,160,8,124,4,
++ 100,3,161,2,143,13,125,5,124,5,160,9,124,1,161,1,
++ 1,0,87,0,100,4,4,0,4,0,131,3,1,0,110,8,
++ 49,0,115,47,119,1,1,0,1,0,1,0,89,0,1,0,
++ 116,2,160,10,124,3,124,0,161,2,1,0,87,0,100,4,
++ 83,0,4,0,116,11,121,84,1,0,1,0,1,0,122,7,
++ 116,2,160,12,124,3,161,1,1,0,87,0,130,0,4,0,
++ 116,11,121,83,1,0,1,0,1,0,89,0,130,0,119,0,
++ 119,0,41,5,122,162,66,101,115,116,45,101,102,102,111,114,
++ 116,32,102,117,110,99,116,105,111,110,32,116,111,32,119,114,
++ 105,116,101,32,100,97,116,97,32,116,111,32,97,32,112,97,
++ 116,104,32,97,116,111,109,105,99,97,108,108,121,46,10,32,
++ 32,32,32,66,101,32,112,114,101,112,97,114,101,100,32,116,
++ 111,32,104,97,110,100,108,101,32,97,32,70,105,108,101,69,
++ 120,105,115,116,115,69,114,114,111,114,32,105,102,32,99,111,
++ 110,99,117,114,114,101,110,116,32,119,114,105,116,105,110,103,
++ 32,111,102,32,116,104,101,10,32,32,32,32,116,101,109,112,
++ 111,114,97,114,121,32,102,105,108,101,32,105,115,32,97,116,
++ 116,101,109,112,116,101,100,46,250,5,123,125,46,123,125,114,
++ 90,0,0,0,90,2,119,98,78,41,13,218,6,102,111,114,
++ 109,97,116,218,2,105,100,114,21,0,0,0,90,4,111,112,
++ 101,110,90,6,79,95,69,88,67,76,90,7,79,95,67,82,
++ 69,65,84,90,8,79,95,87,82,79,78,76,89,218,3,95,
++ 105,111,218,6,70,105,108,101,73,79,218,5,119,114,105,116,
++ 101,114,88,0,0,0,114,79,0,0,0,90,6,117,110,108,
++ 105,110,107,41,6,114,68,0,0,0,114,44,0,0,0,114,
++ 81,0,0,0,90,8,112,97,116,104,95,116,109,112,90,2,
++ 102,100,218,4,102,105,108,101,114,7,0,0,0,114,7,0,
++ 0,0,114,8,0,0,0,218,13,95,119,114,105,116,101,95,
++ 97,116,111,109,105,99,185,0,0,0,115,36,0,0,0,16,
++ 5,6,1,22,1,4,255,2,2,14,3,12,1,28,255,18,
++ 2,12,1,2,1,12,1,2,3,12,254,2,1,2,1,2,
++ 254,2,253,114,98,0,0,0,105,111,13,0,0,114,47,0,
++ 0,0,114,35,0,0,0,115,2,0,0,0,13,10,90,11,
++ 95,95,112,121,99,97,99,104,101,95,95,122,4,111,112,116,
++ 45,122,3,46,112,121,122,4,46,112,121,119,122,4,46,112,
++ 121,99,41,1,218,12,111,112,116,105,109,105,122,97,116,105,
++ 111,110,99,2,0,0,0,0,0,0,0,1,0,0,0,12,
++ 0,0,0,5,0,0,0,67,0,0,0,115,80,1,0,0,
++ 124,1,100,1,117,1,114,26,116,0,160,1,100,2,116,2,
++ 161,2,1,0,124,2,100,1,117,1,114,20,100,3,125,3,
++ 116,3,124,3,131,1,130,1,124,1,114,24,100,4,110,1,
++ 100,5,125,2,116,4,160,5,124,0,161,1,125,0,116,6,
++ 124,0,131,1,92,2,125,4,125,5,124,5,160,7,100,6,
++ 161,1,92,3,125,6,125,7,125,8,116,8,106,9,106,10,
++ 125,9,124,9,100,1,117,0,114,57,116,11,100,7,131,1,
++ 130,1,100,4,160,12,124,6,114,63,124,6,110,1,124,8,
++ 124,7,124,9,103,3,161,1,125,10,124,2,100,1,117,0,
++ 114,86,116,8,106,13,106,14,100,8,107,2,114,82,100,4,
++ 125,2,110,4,116,8,106,13,106,14,125,2,116,15,124,2,
++ 131,1,125,2,124,2,100,4,107,3,114,112,124,2,160,16,
++ 161,0,115,105,116,17,100,9,160,18,124,2,161,1,131,1,
++ 130,1,100,10,160,18,124,10,116,19,124,2,161,3,125,10,
++ 124,10,116,20,100,8,25,0,23,0,125,11,116,8,106,21,
++ 100,1,117,1,114,162,116,22,124,4,131,1,115,134,116,23,
++ 116,4,160,24,161,0,124,4,131,2,125,4,124,4,100,5,
++ 25,0,100,11,107,2,114,152,124,4,100,8,25,0,116,25,
++ 118,1,114,152,124,4,100,12,100,1,133,2,25,0,125,4,
++ 116,23,116,8,106,21,124,4,160,26,116,25,161,1,124,11,
++ 131,3,83,0,116,23,124,4,116,27,124,11,131,3,83,0,
++ 41,13,97,254,2,0,0,71,105,118,101,110,32,116,104,101,
++ 32,112,97,116,104,32,116,111,32,97,32,46,112,121,32,102,
++ 105,108,101,44,32,114,101,116,117,114,110,32,116,104,101,32,
++ 112,97,116,104,32,116,111,32,105,116,115,32,46,112,121,99,
++ 32,102,105,108,101,46,10,10,32,32,32,32,84,104,101,32,
++ 46,112,121,32,102,105,108,101,32,100,111,101,115,32,110,111,
++ 116,32,110,101,101,100,32,116,111,32,101,120,105,115,116,59,
++ 32,116,104,105,115,32,115,105,109,112,108,121,32,114,101,116,
++ 117,114,110,115,32,116,104,101,32,112,97,116,104,32,116,111,
++ 32,116,104,101,10,32,32,32,32,46,112,121,99,32,102,105,
++ 108,101,32,99,97,108,99,117,108,97,116,101,100,32,97,115,
++ 32,105,102,32,116,104,101,32,46,112,121,32,102,105,108,101,
++ 32,119,101,114,101,32,105,109,112,111,114,116,101,100,46,10,
++ 10,32,32,32,32,84,104,101,32,39,111,112,116,105,109,105,
++ 122,97,116,105,111,110,39,32,112,97,114,97,109,101,116,101,
++ 114,32,99,111,110,116,114,111,108,115,32,116,104,101,32,112,
++ 114,101,115,117,109,101,100,32,111,112,116,105,109,105,122,97,
++ 116,105,111,110,32,108,101,118,101,108,32,111,102,10,32,32,
++ 32,32,116,104,101,32,98,121,116,101,99,111,100,101,32,102,
++ 105,108,101,46,32,73,102,32,39,111,112,116,105,109,105,122,
++ 97,116,105,111,110,39,32,105,115,32,110,111,116,32,78,111,
++ 110,101,44,32,116,104,101,32,115,116,114,105,110,103,32,114,
++ 101,112,114,101,115,101,110,116,97,116,105,111,110,10,32,32,
++ 32,32,111,102,32,116,104,101,32,97,114,103,117,109,101,110,
++ 116,32,105,115,32,116,97,107,101,110,32,97,110,100,32,118,
++ 101,114,105,102,105,101,100,32,116,111,32,98,101,32,97,108,
++ 112,104,97,110,117,109,101,114,105,99,32,40,101,108,115,101,
++ 32,86,97,108,117,101,69,114,114,111,114,10,32,32,32,32,
++ 105,115,32,114,97,105,115,101,100,41,46,10,10,32,32,32,
++ 32,84,104,101,32,100,101,98,117,103,95,111,118,101,114,114,
++ 105,100,101,32,112,97,114,97,109,101,116,101,114,32,105,115,
++ 32,100,101,112,114,101,99,97,116,101,100,46,32,73,102,32,
++ 100,101,98,117,103,95,111,118,101,114,114,105,100,101,32,105,
++ 115,32,110,111,116,32,78,111,110,101,44,10,32,32,32,32,
++ 97,32,84,114,117,101,32,118,97,108,117,101,32,105,115,32,
++ 116,104,101,32,115,97,109,101,32,97,115,32,115,101,116,116,
++ 105,110,103,32,39,111,112,116,105,109,105,122,97,116,105,111,
++ 110,39,32,116,111,32,116,104,101,32,101,109,112,116,121,32,
++ 115,116,114,105,110,103,10,32,32,32,32,119,104,105,108,101,
++ 32,97,32,70,97,108,115,101,32,118,97,108,117,101,32,105,
++ 115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,
++ 115,101,116,116,105,110,103,32,39,111,112,116,105,109,105,122,
++ 97,116,105,111,110,39,32,116,111,32,39,49,39,46,10,10,
++ 32,32,32,32,73,102,32,115,121,115,46,105,109,112,108,101,
++ 109,101,110,116,97,116,105,111,110,46,99,97,99,104,101,95,
++ 116,97,103,32,105,115,32,78,111,110,101,32,116,104,101,110,
++ 32,78,111,116,73,109,112,108,101,109,101,110,116,101,100,69,
++ 114,114,111,114,32,105,115,32,114,97,105,115,101,100,46,10,
++ 10,32,32,32,32,78,122,70,116,104,101,32,100,101,98,117,
++ 103,95,111,118,101,114,114,105,100,101,32,112,97,114,97,109,
++ 101,116,101,114,32,105,115,32,100,101,112,114,101,99,97,116,
++ 101,100,59,32,117,115,101,32,39,111,112,116,105,109,105,122,
++ 97,116,105,111,110,39,32,105,110,115,116,101,97,100,122,50,
++ 100,101,98,117,103,95,111,118,101,114,114,105,100,101,32,111,
++ 114,32,111,112,116,105,109,105,122,97,116,105,111,110,32,109,
++ 117,115,116,32,98,101,32,115,101,116,32,116,111,32,78,111,
++ 110,101,114,10,0,0,0,114,3,0,0,0,218,1,46,250,
++ 36,115,121,115,46,105,109,112,108,101,109,101,110,116,97,116,
++ 105,111,110,46,99,97,99,104,101,95,116,97,103,32,105,115,
++ 32,78,111,110,101,114,0,0,0,0,122,24,123,33,114,125,
++ 32,105,115,32,110,111,116,32,97,108,112,104,97,110,117,109,
++ 101,114,105,99,122,7,123,125,46,123,125,123,125,114,11,0,
++ 0,0,114,47,0,0,0,41,28,218,9,95,119,97,114,110,
++ 105,110,103,115,218,4,119,97,114,110,218,18,68,101,112,114,
++ 101,99,97,116,105,111,110,87,97,114,110,105,110,103,218,9,
++ 84,121,112,101,69,114,114,111,114,114,21,0,0,0,218,6,
++ 102,115,112,97,116,104,114,77,0,0,0,218,10,114,112,97,
++ 114,116,105,116,105,111,110,114,18,0,0,0,218,14,105,109,
++ 112,108,101,109,101,110,116,97,116,105,111,110,218,9,99,97,
++ 99,104,101,95,116,97,103,218,19,78,111,116,73,109,112,108,
++ 101,109,101,110,116,101,100,69,114,114,111,114,114,65,0,0,
++ 0,114,19,0,0,0,218,8,111,112,116,105,109,105,122,101,
++ 218,3,115,116,114,218,7,105,115,97,108,110,117,109,218,10,
++ 86,97,108,117,101,69,114,114,111,114,114,92,0,0,0,218,
++ 4,95,79,80,84,218,17,66,89,84,69,67,79,68,69,95,
++ 83,85,70,70,73,88,69,83,218,14,112,121,99,97,99,104,
++ 101,95,112,114,101,102,105,120,114,89,0,0,0,114,70,0,
++ 0,0,114,85,0,0,0,114,53,0,0,0,218,6,108,115,
++ 116,114,105,112,218,8,95,80,89,67,65,67,72,69,41,12,
++ 114,68,0,0,0,90,14,100,101,98,117,103,95,111,118,101,
++ 114,114,105,100,101,114,99,0,0,0,218,7,109,101,115,115,
++ 97,103,101,218,4,104,101,97,100,114,69,0,0,0,90,4,
++ 98,97,115,101,114,6,0,0,0,218,4,114,101,115,116,90,
++ 3,116,97,103,90,15,97,108,109,111,115,116,95,102,105,108,
++ 101,110,97,109,101,218,8,102,105,108,101,110,97,109,101,114,
++ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,17,
++ 99,97,99,104,101,95,102,114,111,109,95,115,111,117,114,99,
++ 101,124,1,0,0,115,72,0,0,0,8,18,6,1,2,1,
++ 4,255,8,2,4,1,8,1,12,1,10,1,12,1,16,1,
++ 8,1,8,1,8,1,24,1,8,1,12,1,6,1,8,2,
++ 8,1,8,1,8,1,14,1,14,1,12,1,10,1,8,9,
++ 14,1,24,5,12,1,2,4,4,1,8,1,2,1,4,253,
++ 12,5,114,124,0,0,0,99,1,0,0,0,0,0,0,0,
++ 0,0,0,0,10,0,0,0,5,0,0,0,67,0,0,0,
++ 115,40,1,0,0,116,0,106,1,106,2,100,1,117,0,114,
++ 10,116,3,100,2,131,1,130,1,116,4,160,5,124,0,161,
++ 1,125,0,116,6,124,0,131,1,92,2,125,1,125,2,100,
++ 3,125,3,116,0,106,7,100,1,117,1,114,51,116,0,106,
++ 7,160,8,116,9,161,1,125,4,124,1,160,10,124,4,116,
++ 11,23,0,161,1,114,51,124,1,116,12,124,4,131,1,100,
++ 1,133,2,25,0,125,1,100,4,125,3,124,3,115,72,116,
++ 6,124,1,131,1,92,2,125,1,125,5,124,5,116,13,107,
++ 3,114,72,116,14,116,13,155,0,100,5,124,0,155,2,157,
++ 3,131,1,130,1,124,2,160,15,100,6,161,1,125,6,124,
++ 6,100,7,118,1,114,88,116,14,100,8,124,2,155,2,157,
++ 2,131,1,130,1,124,6,100,9,107,2,114,132,124,2,160,
++ 16,100,6,100,10,161,2,100,11,25,0,125,7,124,7,160,
++ 10,116,17,161,1,115,112,116,14,100,12,116,17,155,2,157,
++ 2,131,1,130,1,124,7,116,12,116,17,131,1,100,1,133,
++ 2,25,0,125,8,124,8,160,18,161,0,115,132,116,14,100,
++ 13,124,7,155,2,100,14,157,3,131,1,130,1,124,2,160,
++ 19,100,6,161,1,100,15,25,0,125,9,116,20,124,1,124,
++ 9,116,21,100,15,25,0,23,0,131,2,83,0,41,16,97,
++ 110,1,0,0,71,105,118,101,110,32,116,104,101,32,112,97,
++ 116,104,32,116,111,32,97,32,46,112,121,99,46,32,102,105,
++ 108,101,44,32,114,101,116,117,114,110,32,116,104,101,32,112,
++ 97,116,104,32,116,111,32,105,116,115,32,46,112,121,32,102,
++ 105,108,101,46,10,10,32,32,32,32,84,104,101,32,46,112,
++ 121,99,32,102,105,108,101,32,100,111,101,115,32,110,111,116,
++ 32,110,101,101,100,32,116,111,32,101,120,105,115,116,59,32,
++ 116,104,105,115,32,115,105,109,112,108,121,32,114,101,116,117,
++ 114,110,115,32,116,104,101,32,112,97,116,104,32,116,111,10,
++ 32,32,32,32,116,104,101,32,46,112,121,32,102,105,108,101,
++ 32,99,97,108,99,117,108,97,116,101,100,32,116,111,32,99,
++ 111,114,114,101,115,112,111,110,100,32,116,111,32,116,104,101,
++ 32,46,112,121,99,32,102,105,108,101,46,32,32,73,102,32,
++ 112,97,116,104,32,100,111,101,115,10,32,32,32,32,110,111,
++ 116,32,99,111,110,102,111,114,109,32,116,111,32,80,69,80,
++ 32,51,49,52,55,47,52,56,56,32,102,111,114,109,97,116,
++ 44,32,86,97,108,117,101,69,114,114,111,114,32,119,105,108,
++ 108,32,98,101,32,114,97,105,115,101,100,46,32,73,102,10,
++ 32,32,32,32,115,121,115,46,105,109,112,108,101,109,101,110,
++ 116,97,116,105,111,110,46,99,97,99,104,101,95,116,97,103,
++ 32,105,115,32,78,111,110,101,32,116,104,101,110,32,78,111,
++ 116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,111,
++ 114,32,105,115,32,114,97,105,115,101,100,46,10,10,32,32,
++ 32,32,78,114,101,0,0,0,70,84,122,31,32,110,111,116,
++ 32,98,111,116,116,111,109,45,108,101,118,101,108,32,100,105,
++ 114,101,99,116,111,114,121,32,105,110,32,114,100,0,0,0,
++ 62,2,0,0,0,114,47,0,0,0,233,3,0,0,0,122,
++ 29,101,120,112,101,99,116,101,100,32,111,110,108,121,32,50,
++ 32,111,114,32,51,32,100,111,116,115,32,105,110,32,114,125,
++ 0,0,0,114,47,0,0,0,233,254,255,255,255,122,53,111,
++ 112,116,105,109,105,122,97,116,105,111,110,32,112,111,114,116,
++ 105,111,110,32,111,102,32,102,105,108,101,110,97,109,101,32,
++ 100,111,101,115,32,110,111,116,32,115,116,97,114,116,32,119,
++ 105,116,104,32,122,19,111,112,116,105,109,105,122,97,116,105,
++ 111,110,32,108,101,118,101,108,32,122,29,32,105,115,32,110,
++ 111,116,32,97,110,32,97,108,112,104,97,110,117,109,101,114,
++ 105,99,32,118,97,108,117,101,114,0,0,0,0,41,22,114,
++ 18,0,0,0,114,108,0,0,0,114,109,0,0,0,114,110,
++ 0,0,0,114,21,0,0,0,114,106,0,0,0,114,77,0,
++ 0,0,114,117,0,0,0,114,52,0,0,0,114,53,0,0,
++ 0,114,29,0,0,0,114,62,0,0,0,114,4,0,0,0,
++ 114,119,0,0,0,114,114,0,0,0,218,5,99,111,117,110,
++ 116,218,6,114,115,112,108,105,116,114,115,0,0,0,114,113,
++ 0,0,0,218,9,112,97,114,116,105,116,105,111,110,114,70,
++ 0,0,0,218,15,83,79,85,82,67,69,95,83,85,70,70,
++ 73,88,69,83,41,10,114,68,0,0,0,114,121,0,0,0,
++ 90,16,112,121,99,97,99,104,101,95,102,105,108,101,110,97,
++ 109,101,90,23,102,111,117,110,100,95,105,110,95,112,121,99,
++ 97,99,104,101,95,112,114,101,102,105,120,90,13,115,116,114,
++ 105,112,112,101,100,95,112,97,116,104,90,7,112,121,99,97,
++ 99,104,101,90,9,100,111,116,95,99,111,117,110,116,114,99,
++ 0,0,0,90,9,111,112,116,95,108,101,118,101,108,90,13,
++ 98,97,115,101,95,102,105,108,101,110,97,109,101,114,7,0,
++ 0,0,114,7,0,0,0,114,8,0,0,0,218,17,115,111,
++ 117,114,99,101,95,102,114,111,109,95,99,97,99,104,101,195,
++ 1,0,0,115,60,0,0,0,12,9,8,1,10,1,12,1,
++ 4,1,10,1,12,1,14,1,16,1,4,1,4,1,12,1,
++ 8,1,8,1,2,1,8,255,10,2,8,1,14,1,8,1,
++ 16,1,10,1,4,1,2,1,8,255,16,2,8,1,16,1,
++ 14,2,18,1,114,131,0,0,0,99,1,0,0,0,0,0,
++ 0,0,0,0,0,0,5,0,0,0,9,0,0,0,67,0,
++ 0,0,115,124,0,0,0,116,0,124,0,131,1,100,1,107,
++ 2,114,8,100,2,83,0,124,0,160,1,100,3,161,1,92,
++ 3,125,1,125,2,125,3,124,1,114,28,124,3,160,2,161,
++ 0,100,4,100,5,133,2,25,0,100,6,107,3,114,30,124,
++ 0,83,0,122,6,116,3,124,0,131,1,125,4,87,0,110,
++ 17,4,0,116,4,116,5,102,2,121,53,1,0,1,0,1,
++ 0,124,0,100,2,100,5,133,2,25,0,125,4,89,0,110,
++ 1,119,0,116,6,124,4,131,1,114,60,124,4,83,0,124,
++ 0,83,0,41,7,122,188,67,111,110,118,101,114,116,32,97,
++ 32,98,121,116,101,99,111,100,101,32,102,105,108,101,32,112,
++ 97,116,104,32,116,111,32,97,32,115,111,117,114,99,101,32,
++ 112,97,116,104,32,40,105,102,32,112,111,115,115,105,98,108,
++ 101,41,46,10,10,32,32,32,32,84,104,105,115,32,102,117,
++ 110,99,116,105,111,110,32,101,120,105,115,116,115,32,112,117,
++ 114,101,108,121,32,102,111,114,32,98,97,99,107,119,97,114,
++ 100,115,45,99,111,109,112,97,116,105,98,105,108,105,116,121,
++ 32,102,111,114,10,32,32,32,32,80,121,73,109,112,111,114,
++ 116,95,69,120,101,99,67,111,100,101,77,111,100,117,108,101,
++ 87,105,116,104,70,105,108,101,110,97,109,101,115,40,41,32,
++ 105,110,32,116,104,101,32,67,32,65,80,73,46,10,10,32,
++ 32,32,32,114,0,0,0,0,78,114,100,0,0,0,233,253,
++ 255,255,255,233,255,255,255,255,90,2,112,121,41,7,114,4,
++ 0,0,0,114,107,0,0,0,218,5,108,111,119,101,114,114,
++ 131,0,0,0,114,110,0,0,0,114,114,0,0,0,114,83,
++ 0,0,0,41,5,218,13,98,121,116,101,99,111,100,101,95,
++ 112,97,116,104,114,122,0,0,0,218,1,95,90,9,101,120,
++ 116,101,110,115,105,111,110,218,11,115,111,117,114,99,101,95,
++ 112,97,116,104,114,7,0,0,0,114,7,0,0,0,114,8,
++ 0,0,0,218,15,95,103,101,116,95,115,111,117,114,99,101,
++ 102,105,108,101,235,1,0,0,115,22,0,0,0,12,7,4,
++ 1,16,1,24,1,4,1,2,1,12,1,16,1,16,1,2,
++ 255,16,2,114,138,0,0,0,99,1,0,0,0,0,0,0,
++ 0,0,0,0,0,1,0,0,0,8,0,0,0,67,0,0,
++ 0,115,68,0,0,0,124,0,160,0,116,1,116,2,131,1,
++ 161,1,114,23,122,5,116,3,124,0,131,1,87,0,83,0,
++ 4,0,116,4,121,22,1,0,1,0,1,0,89,0,100,0,
++ 83,0,119,0,124,0,160,0,116,1,116,5,131,1,161,1,
++ 114,32,124,0,83,0,100,0,83,0,114,72,0,0,0,41,
++ 6,114,61,0,0,0,218,5,116,117,112,108,101,114,130,0,
++ 0,0,114,124,0,0,0,114,110,0,0,0,114,116,0,0,
++ 0,41,1,114,123,0,0,0,114,7,0,0,0,114,7,0,
++ 0,0,114,8,0,0,0,218,11,95,103,101,116,95,99,97,
++ 99,104,101,100,254,1,0,0,115,18,0,0,0,14,1,2,
++ 1,10,1,12,1,6,1,2,255,14,2,4,1,4,2,114,
++ 140,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,
++ 0,2,0,0,0,8,0,0,0,67,0,0,0,115,50,0,
++ 0,0,122,7,116,0,124,0,131,1,106,1,125,1,87,0,
++ 110,11,4,0,116,2,121,18,1,0,1,0,1,0,100,1,
++ 125,1,89,0,110,1,119,0,124,1,100,2,79,0,125,1,
++ 124,1,83,0,41,3,122,51,67,97,108,99,117,108,97,116,
++ 101,32,116,104,101,32,109,111,100,101,32,112,101,114,109,105,
++ 115,115,105,111,110,115,32,102,111,114,32,97,32,98,121,116,
++ 101,99,111,100,101,32,102,105,108,101,46,114,90,0,0,0,
++ 233,128,0,0,0,41,3,114,78,0,0,0,114,80,0,0,
++ 0,114,79,0,0,0,41,2,114,68,0,0,0,114,81,0,
++ 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
++ 0,218,10,95,99,97,108,99,95,109,111,100,101,10,2,0,
++ 0,115,14,0,0,0,2,2,14,1,12,1,8,1,2,255,
++ 8,4,4,1,114,142,0,0,0,99,1,0,0,0,0,0,
++ 0,0,0,0,0,0,3,0,0,0,4,0,0,0,3,0,
++ 0,0,115,52,0,0,0,100,6,135,0,102,1,100,2,100,
++ 3,132,9,125,1,116,0,100,1,117,1,114,15,116,0,106,
++ 1,125,2,110,4,100,4,100,5,132,0,125,2,124,2,124,
++ 1,136,0,131,2,1,0,124,1,83,0,41,7,122,252,68,
++ 101,99,111,114,97,116,111,114,32,116,111,32,118,101,114,105,
++ 102,121,32,116,104,97,116,32,116,104,101,32,109,111,100,117,
++ 108,101,32,98,101,105,110,103,32,114,101,113,117,101,115,116,
++ 101,100,32,109,97,116,99,104,101,115,32,116,104,101,32,111,
++ 110,101,32,116,104,101,10,32,32,32,32,108,111,97,100,101,
++ 114,32,99,97,110,32,104,97,110,100,108,101,46,10,10,32,
++ 32,32,32,84,104,101,32,102,105,114,115,116,32,97,114,103,
++ 117,109,101,110,116,32,40,115,101,108,102,41,32,109,117,115,
++ 116,32,100,101,102,105,110,101,32,95,110,97,109,101,32,119,
++ 104,105,99,104,32,116,104,101,32,115,101,99,111,110,100,32,
++ 97,114,103,117,109,101,110,116,32,105,115,10,32,32,32,32,
++ 99,111,109,112,97,114,101,100,32,97,103,97,105,110,115,116,
++ 46,32,73,102,32,116,104,101,32,99,111,109,112,97,114,105,
++ 115,111,110,32,102,97,105,108,115,32,116,104,101,110,32,73,
++ 109,112,111,114,116,69,114,114,111,114,32,105,115,32,114,97,
++ 105,115,101,100,46,10,10,32,32,32,32,78,99,2,0,0,
++ 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,
++ 0,31,0,0,0,115,72,0,0,0,124,1,100,0,117,0,
++ 114,8,124,0,106,0,125,1,110,16,124,0,106,0,124,1,
++ 107,3,114,24,116,1,100,1,124,0,106,0,124,1,102,2,
++ 22,0,124,1,100,2,141,2,130,1,136,0,124,0,124,1,
++ 103,2,124,2,162,1,82,0,105,0,124,3,164,1,142,1,
++ 83,0,41,3,78,122,30,108,111,97,100,101,114,32,102,111,
++ 114,32,37,115,32,99,97,110,110,111,116,32,104,97,110,100,
++ 108,101,32,37,115,169,1,218,4,110,97,109,101,41,2,114,
++ 144,0,0,0,218,11,73,109,112,111,114,116,69,114,114,111,
++ 114,41,4,218,4,115,101,108,102,114,144,0,0,0,218,4,
++ 97,114,103,115,218,6,107,119,97,114,103,115,169,1,218,6,
++ 109,101,116,104,111,100,114,7,0,0,0,114,8,0,0,0,
++ 218,19,95,99,104,101,99,107,95,110,97,109,101,95,119,114,
++ 97,112,112,101,114,30,2,0,0,115,18,0,0,0,8,1,
++ 8,1,10,1,4,1,8,1,2,255,2,1,6,255,24,2,
++ 122,40,95,99,104,101,99,107,95,110,97,109,101,46,60,108,
++ 111,99,97,108,115,62,46,95,99,104,101,99,107,95,110,97,
++ 109,101,95,119,114,97,112,112,101,114,99,2,0,0,0,0,
++ 0,0,0,0,0,0,0,3,0,0,0,7,0,0,0,83,
++ 0,0,0,115,56,0,0,0,100,1,68,0,93,16,125,2,
++ 116,0,124,1,124,2,131,2,114,18,116,1,124,0,124,2,
++ 116,2,124,1,124,2,131,2,131,3,1,0,113,2,124,0,
++ 106,3,160,4,124,1,106,3,161,1,1,0,100,0,83,0,
++ 41,2,78,41,4,218,10,95,95,109,111,100,117,108,101,95,
++ 95,218,8,95,95,110,97,109,101,95,95,218,12,95,95,113,
++ 117,97,108,110,97,109,101,95,95,218,7,95,95,100,111,99,
++ 95,95,41,5,218,7,104,97,115,97,116,116,114,218,7,115,
++ 101,116,97,116,116,114,218,7,103,101,116,97,116,116,114,218,
++ 8,95,95,100,105,99,116,95,95,218,6,117,112,100,97,116,
++ 101,41,3,90,3,110,101,119,90,3,111,108,100,114,88,0,
+ 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
+- 0,218,13,95,99,108,97,115,115,105,102,121,95,112,121,99,
+- 73,2,0,0,115,28,0,0,0,12,16,8,1,16,1,12,
+- 1,16,1,12,1,10,1,12,1,8,1,16,1,8,2,16,
+- 1,16,1,4,1,114,176,0,0,0,99,5,0,0,0,0,
++ 0,218,5,95,119,114,97,112,43,2,0,0,115,10,0,0,
++ 0,8,1,10,1,18,1,2,128,18,1,122,26,95,99,104,
++ 101,99,107,95,110,97,109,101,46,60,108,111,99,97,108,115,
++ 62,46,95,119,114,97,112,114,72,0,0,0,41,2,218,10,
++ 95,98,111,111,116,115,116,114,97,112,114,161,0,0,0,41,
++ 3,114,150,0,0,0,114,151,0,0,0,114,161,0,0,0,
++ 114,7,0,0,0,114,149,0,0,0,114,8,0,0,0,218,
++ 11,95,99,104,101,99,107,95,110,97,109,101,22,2,0,0,
++ 115,12,0,0,0,14,8,8,10,8,1,8,2,10,6,4,
++ 1,114,163,0,0,0,99,2,0,0,0,0,0,0,0,0,
++ 0,0,0,5,0,0,0,6,0,0,0,67,0,0,0,115,
++ 72,0,0,0,116,0,160,1,100,1,116,2,161,2,1,0,
++ 124,0,160,3,124,1,161,1,92,2,125,2,125,3,124,2,
++ 100,2,117,0,114,34,116,4,124,3,131,1,114,34,100,3,
++ 125,4,116,0,160,1,124,4,160,5,124,3,100,4,25,0,
++ 161,1,116,6,161,2,1,0,124,2,83,0,41,5,122,155,
++ 84,114,121,32,116,111,32,102,105,110,100,32,97,32,108,111,
++ 97,100,101,114,32,102,111,114,32,116,104,101,32,115,112,101,
++ 99,105,102,105,101,100,32,109,111,100,117,108,101,32,98,121,
++ 32,100,101,108,101,103,97,116,105,110,103,32,116,111,10,32,
++ 32,32,32,115,101,108,102,46,102,105,110,100,95,108,111,97,
++ 100,101,114,40,41,46,10,10,32,32,32,32,84,104,105,115,
++ 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,
++ 99,97,116,101,100,32,105,110,32,102,97,118,111,114,32,111,
++ 102,32,102,105,110,100,101,114,46,102,105,110,100,95,115,112,
++ 101,99,40,41,46,10,10,32,32,32,32,122,90,102,105,110,
++ 100,95,109,111,100,117,108,101,40,41,32,105,115,32,100,101,
++ 112,114,101,99,97,116,101,100,32,97,110,100,32,115,108,97,
++ 116,101,100,32,102,111,114,32,114,101,109,111,118,97,108,32,
++ 105,110,32,80,121,116,104,111,110,32,51,46,49,50,59,32,
++ 117,115,101,32,102,105,110,100,95,115,112,101,99,40,41,32,
++ 105,110,115,116,101,97,100,78,122,44,78,111,116,32,105,109,
++ 112,111,114,116,105,110,103,32,100,105,114,101,99,116,111,114,
++ 121,32,123,125,58,32,109,105,115,115,105,110,103,32,95,95,
++ 105,110,105,116,95,95,114,0,0,0,0,41,7,114,102,0,
++ 0,0,114,103,0,0,0,114,104,0,0,0,218,11,102,105,
++ 110,100,95,108,111,97,100,101,114,114,4,0,0,0,114,92,
++ 0,0,0,218,13,73,109,112,111,114,116,87,97,114,110,105,
++ 110,103,41,5,114,146,0,0,0,218,8,102,117,108,108,110,
++ 97,109,101,218,6,108,111,97,100,101,114,218,8,112,111,114,
++ 116,105,111,110,115,218,3,109,115,103,114,7,0,0,0,114,
++ 7,0,0,0,114,8,0,0,0,218,17,95,102,105,110,100,
++ 95,109,111,100,117,108,101,95,115,104,105,109,53,2,0,0,
++ 115,16,0,0,0,6,7,2,2,4,254,14,6,16,1,4,
++ 1,22,1,4,1,114,170,0,0,0,99,3,0,0,0,0,
+ 0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,67,
+- 0,0,0,115,124,0,0,0,116,0,124,0,100,1,100,2,
+- 133,2,25,0,131,1,124,1,100,3,64,0,107,3,114,31,
+- 100,4,124,3,155,2,157,2,125,5,116,1,160,2,100,5,
+- 124,5,161,2,1,0,116,3,124,5,102,1,105,0,124,4,
+- 164,1,142,1,130,1,124,2,100,6,117,1,114,58,116,0,
+- 124,0,100,2,100,7,133,2,25,0,131,1,124,2,100,3,
+- 64,0,107,3,114,60,116,3,100,4,124,3,155,2,157,2,
+- 102,1,105,0,124,4,164,1,142,1,130,1,100,6,83,0,
+- 100,6,83,0,41,8,97,7,2,0,0,86,97,108,105,100,
+- 97,116,101,32,97,32,112,121,99,32,97,103,97,105,110,115,
+- 116,32,116,104,101,32,115,111,117,114,99,101,32,108,97,115,
+- 116,45,109,111,100,105,102,105,101,100,32,116,105,109,101,46,
+- 10,10,32,32,32,32,42,100,97,116,97,42,32,105,115,32,
+- 116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,
+- 116,104,101,32,112,121,99,32,102,105,108,101,46,32,40,79,
+- 110,108,121,32,116,104,101,32,102,105,114,115,116,32,49,54,
+- 32,98,121,116,101,115,32,97,114,101,10,32,32,32,32,114,
+- 101,113,117,105,114,101,100,46,41,10,10,32,32,32,32,42,
+- 115,111,117,114,99,101,95,109,116,105,109,101,42,32,105,115,
+- 32,116,104,101,32,108,97,115,116,32,109,111,100,105,102,105,
+- 101,100,32,116,105,109,101,115,116,97,109,112,32,111,102,32,
+- 116,104,101,32,115,111,117,114,99,101,32,102,105,108,101,46,
+- 10,10,32,32,32,32,42,115,111,117,114,99,101,95,115,105,
+- 122,101,42,32,105,115,32,78,111,110,101,32,111,114,32,116,
+- 104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,115,
+- 111,117,114,99,101,32,102,105,108,101,32,105,110,32,98,121,
+- 116,101,115,46,10,10,32,32,32,32,42,110,97,109,101,42,
+- 32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,
+- 116,104,101,32,109,111,100,117,108,101,32,98,101,105,110,103,
+- 32,105,109,112,111,114,116,101,100,46,32,73,116,32,105,115,
+- 32,117,115,101,100,32,102,111,114,32,108,111,103,103,105,110,
+- 103,46,10,10,32,32,32,32,42,101,120,99,95,100,101,116,
+- 97,105,108,115,42,32,105,115,32,97,32,100,105,99,116,105,
+- 111,110,97,114,121,32,112,97,115,115,101,100,32,116,111,32,
+- 73,109,112,111,114,116,69,114,114,111,114,32,105,102,32,105,
+- 116,32,114,97,105,115,101,100,32,102,111,114,10,32,32,32,
+- 32,105,109,112,114,111,118,101,100,32,100,101,98,117,103,103,
+- 105,110,103,46,10,10,32,32,32,32,65,110,32,73,109,112,
+- 111,114,116,69,114,114,111,114,32,105,115,32,114,97,105,115,
+- 101,100,32,105,102,32,116,104,101,32,98,121,116,101,99,111,
+- 100,101,32,105,115,32,115,116,97,108,101,46,10,10,32,32,
+- 32,32,114,170,0,0,0,233,12,0,0,0,114,30,0,0,
+- 0,122,22,98,121,116,101,99,111,100,101,32,105,115,32,115,
+- 116,97,108,101,32,102,111,114,32,114,168,0,0,0,78,114,
+- 169,0,0,0,41,4,114,42,0,0,0,114,159,0,0,0,
+- 114,173,0,0,0,114,142,0,0,0,41,6,114,41,0,0,
+- 0,218,12,115,111,117,114,99,101,95,109,116,105,109,101,218,
+- 11,115,111,117,114,99,101,95,115,105,122,101,114,141,0,0,
+- 0,114,175,0,0,0,114,117,0,0,0,114,7,0,0,0,
+- 114,7,0,0,0,114,8,0,0,0,218,23,95,118,97,108,
+- 105,100,97,116,101,95,116,105,109,101,115,116,97,109,112,95,
+- 112,121,99,106,2,0,0,115,18,0,0,0,24,19,10,1,
+- 12,1,16,1,8,1,24,1,22,1,4,254,4,1,114,180,
+- 0,0,0,99,4,0,0,0,0,0,0,0,0,0,0,0,
+- 4,0,0,0,4,0,0,0,67,0,0,0,115,42,0,0,
+- 0,124,0,100,1,100,2,133,2,25,0,124,1,107,3,114,
+- 19,116,0,100,3,124,2,155,2,157,2,102,1,105,0,124,
+- 3,164,1,142,1,130,1,100,4,83,0,41,5,97,243,1,
+- 0,0,86,97,108,105,100,97,116,101,32,97,32,104,97,115,
+- 104,45,98,97,115,101,100,32,112,121,99,32,98,121,32,99,
+- 104,101,99,107,105,110,103,32,116,104,101,32,114,101,97,108,
+- 32,115,111,117,114,99,101,32,104,97,115,104,32,97,103,97,
+- 105,110,115,116,32,116,104,101,32,111,110,101,32,105,110,10,
+- 32,32,32,32,116,104,101,32,112,121,99,32,104,101,97,100,
+- 101,114,46,10,10,32,32,32,32,42,100,97,116,97,42,32,
+- 105,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32,
+- 111,102,32,116,104,101,32,112,121,99,32,102,105,108,101,46,
+- 32,40,79,110,108,121,32,116,104,101,32,102,105,114,115,116,
+- 32,49,54,32,98,121,116,101,115,32,97,114,101,10,32,32,
+- 32,32,114,101,113,117,105,114,101,100,46,41,10,10,32,32,
+- 32,32,42,115,111,117,114,99,101,95,104,97,115,104,42,32,
+- 105,115,32,116,104,101,32,105,109,112,111,114,116,108,105,98,
+- 46,117,116,105,108,46,115,111,117,114,99,101,95,104,97,115,
+- 104,40,41,32,111,102,32,116,104,101,32,115,111,117,114,99,
+- 101,32,102,105,108,101,46,10,10,32,32,32,32,42,110,97,
+- 109,101,42,32,105,115,32,116,104,101,32,110,97,109,101,32,
+- 111,102,32,116,104,101,32,109,111,100,117,108,101,32,98,101,
+- 105,110,103,32,105,109,112,111,114,116,101,100,46,32,73,116,
+- 32,105,115,32,117,115,101,100,32,102,111,114,32,108,111,103,
+- 103,105,110,103,46,10,10,32,32,32,32,42,101,120,99,95,
+- 100,101,116,97,105,108,115,42,32,105,115,32,97,32,100,105,
+- 99,116,105,111,110,97,114,121,32,112,97,115,115,101,100,32,
+- 116,111,32,73,109,112,111,114,116,69,114,114,111,114,32,105,
+- 102,32,105,116,32,114,97,105,115,101,100,32,102,111,114,10,
+- 32,32,32,32,105,109,112,114,111,118,101,100,32,100,101,98,
+- 117,103,103,105,110,103,46,10,10,32,32,32,32,65,110,32,
+- 73,109,112,111,114,116,69,114,114,111,114,32,105,115,32,114,
+- 97,105,115,101,100,32,105,102,32,116,104,101,32,98,121,116,
+- 101,99,111,100,101,32,105,115,32,115,116,97,108,101,46,10,
+- 10,32,32,32,32,114,170,0,0,0,114,169,0,0,0,122,
+- 46,104,97,115,104,32,105,110,32,98,121,116,101,99,111,100,
+- 101,32,100,111,101,115,110,39,116,32,109,97,116,99,104,32,
+- 104,97,115,104,32,111,102,32,115,111,117,114,99,101,32,78,
+- 41,1,114,142,0,0,0,41,4,114,41,0,0,0,218,11,
+- 115,111,117,114,99,101,95,104,97,115,104,114,141,0,0,0,
+- 114,175,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
+- 8,0,0,0,218,18,95,118,97,108,105,100,97,116,101,95,
+- 104,97,115,104,95,112,121,99,134,2,0,0,115,14,0,0,
+- 0,16,17,2,1,8,1,4,255,2,2,6,254,4,255,114,
+- 182,0,0,0,99,4,0,0,0,0,0,0,0,0,0,0,
+- 0,5,0,0,0,5,0,0,0,67,0,0,0,115,76,0,
+- 0,0,116,0,160,1,124,0,161,1,125,4,116,2,124,4,
+- 116,3,131,2,114,28,116,4,160,5,100,1,124,2,161,2,
+- 1,0,124,3,100,2,117,1,114,26,116,6,160,7,124,4,
+- 124,3,161,2,1,0,124,4,83,0,116,8,100,3,160,9,
+- 124,2,161,1,124,1,124,2,100,4,141,3,130,1,41,5,
+- 122,35,67,111,109,112,105,108,101,32,98,121,116,101,99,111,
+- 100,101,32,97,115,32,102,111,117,110,100,32,105,110,32,97,
+- 32,112,121,99,46,122,21,99,111,100,101,32,111,98,106,101,
+- 99,116,32,102,114,111,109,32,123,33,114,125,78,122,23,78,
+- 111,110,45,99,111,100,101,32,111,98,106,101,99,116,32,105,
+- 110,32,123,33,114,125,169,2,114,141,0,0,0,114,65,0,
+- 0,0,41,10,218,7,109,97,114,115,104,97,108,90,5,108,
+- 111,97,100,115,218,10,105,115,105,110,115,116,97,110,99,101,
+- 218,10,95,99,111,100,101,95,116,121,112,101,114,159,0,0,
+- 0,114,173,0,0,0,218,4,95,105,109,112,90,16,95,102,
+- 105,120,95,99,111,95,102,105,108,101,110,97,109,101,114,142,
+- 0,0,0,114,89,0,0,0,41,5,114,41,0,0,0,114,
+- 141,0,0,0,114,132,0,0,0,114,134,0,0,0,218,4,
+- 99,111,100,101,114,7,0,0,0,114,7,0,0,0,114,8,
+- 0,0,0,218,17,95,99,111,109,112,105,108,101,95,98,121,
+- 116,101,99,111,100,101,158,2,0,0,115,18,0,0,0,10,
+- 2,10,1,12,1,8,1,12,1,4,1,10,2,4,1,6,
+- 255,114,189,0,0,0,99,3,0,0,0,0,0,0,0,0,
+- 0,0,0,4,0,0,0,5,0,0,0,67,0,0,0,115,
+- 70,0,0,0,116,0,116,1,131,1,125,3,124,3,160,2,
+- 116,3,100,1,131,1,161,1,1,0,124,3,160,2,116,3,
+- 124,1,131,1,161,1,1,0,124,3,160,2,116,3,124,2,
+- 131,1,161,1,1,0,124,3,160,2,116,4,160,5,124,0,
+- 161,1,161,1,1,0,124,3,83,0,41,2,122,43,80,114,
+- 111,100,117,99,101,32,116,104,101,32,100,97,116,97,32,102,
+- 111,114,32,97,32,116,105,109,101,115,116,97,109,112,45,98,
+- 97,115,101,100,32,112,121,99,46,114,0,0,0,0,41,6,
+- 218,9,98,121,116,101,97,114,114,97,121,114,172,0,0,0,
+- 218,6,101,120,116,101,110,100,114,36,0,0,0,114,184,0,
+- 0,0,218,5,100,117,109,112,115,41,4,114,188,0,0,0,
+- 218,5,109,116,105,109,101,114,179,0,0,0,114,41,0,0,
++ 0,0,0,115,166,0,0,0,124,0,100,1,100,2,133,2,
++ 25,0,125,3,124,3,116,0,107,3,114,32,100,3,124,1,
++ 155,2,100,4,124,3,155,2,157,4,125,4,116,1,160,2,
++ 100,5,124,4,161,2,1,0,116,3,124,4,102,1,105,0,
++ 124,2,164,1,142,1,130,1,116,4,124,0,131,1,100,6,
++ 107,0,114,53,100,7,124,1,155,2,157,2,125,4,116,1,
++ 160,2,100,5,124,4,161,2,1,0,116,5,124,4,131,1,
++ 130,1,116,6,124,0,100,2,100,8,133,2,25,0,131,1,
++ 125,5,124,5,100,9,64,0,114,81,100,10,124,5,155,2,
++ 100,11,124,1,155,2,157,4,125,4,116,3,124,4,102,1,
++ 105,0,124,2,164,1,142,1,130,1,124,5,83,0,41,12,
++ 97,84,2,0,0,80,101,114,102,111,114,109,32,98,97,115,
++ 105,99,32,118,97,108,105,100,105,116,121,32,99,104,101,99,
++ 107,105,110,103,32,111,102,32,97,32,112,121,99,32,104,101,
++ 97,100,101,114,32,97,110,100,32,114,101,116,117,114,110,32,
++ 116,104,101,32,102,108,97,103,115,32,102,105,101,108,100,44,
++ 10,32,32,32,32,119,104,105,99,104,32,100,101,116,101,114,
++ 109,105,110,101,115,32,104,111,119,32,116,104,101,32,112,121,
++ 99,32,115,104,111,117,108,100,32,98,101,32,102,117,114,116,
++ 104,101,114,32,118,97,108,105,100,97,116,101,100,32,97,103,
++ 97,105,110,115,116,32,116,104,101,32,115,111,117,114,99,101,
++ 46,10,10,32,32,32,32,42,100,97,116,97,42,32,105,115,
++ 32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,
++ 32,116,104,101,32,112,121,99,32,102,105,108,101,46,32,40,
++ 79,110,108,121,32,116,104,101,32,102,105,114,115,116,32,49,
++ 54,32,98,121,116,101,115,32,97,114,101,10,32,32,32,32,
++ 114,101,113,117,105,114,101,100,44,32,116,104,111,117,103,104,
++ 46,41,10,10,32,32,32,32,42,110,97,109,101,42,32,105,
++ 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,
++ 101,32,109,111,100,117,108,101,32,98,101,105,110,103,32,105,
++ 109,112,111,114,116,101,100,46,32,73,116,32,105,115,32,117,
++ 115,101,100,32,102,111,114,32,108,111,103,103,105,110,103,46,
++ 10,10,32,32,32,32,42,101,120,99,95,100,101,116,97,105,
++ 108,115,42,32,105,115,32,97,32,100,105,99,116,105,111,110,
++ 97,114,121,32,112,97,115,115,101,100,32,116,111,32,73,109,
++ 112,111,114,116,69,114,114,111,114,32,105,102,32,105,116,32,
++ 114,97,105,115,101,100,32,102,111,114,10,32,32,32,32,105,
++ 109,112,114,111,118,101,100,32,100,101,98,117,103,103,105,110,
++ 103,46,10,10,32,32,32,32,73,109,112,111,114,116,69,114,
++ 114,111,114,32,105,115,32,114,97,105,115,101,100,32,119,104,
++ 101,110,32,116,104,101,32,109,97,103,105,99,32,110,117,109,
++ 98,101,114,32,105,115,32,105,110,99,111,114,114,101,99,116,
++ 32,111,114,32,119,104,101,110,32,116,104,101,32,102,108,97,
++ 103,115,10,32,32,32,32,102,105,101,108,100,32,105,115,32,
++ 105,110,118,97,108,105,100,46,32,69,79,70,69,114,114,111,
++ 114,32,105,115,32,114,97,105,115,101,100,32,119,104,101,110,
++ 32,116,104,101,32,100,97,116,97,32,105,115,32,102,111,117,
++ 110,100,32,116,111,32,98,101,32,116,114,117,110,99,97,116,
++ 101,100,46,10,10,32,32,32,32,78,114,34,0,0,0,122,
++ 20,98,97,100,32,109,97,103,105,99,32,110,117,109,98,101,
++ 114,32,105,110,32,122,2,58,32,250,2,123,125,233,16,0,
++ 0,0,122,40,114,101,97,99,104,101,100,32,69,79,70,32,
++ 119,104,105,108,101,32,114,101,97,100,105,110,103,32,112,121,
++ 99,32,104,101,97,100,101,114,32,111,102,32,233,8,0,0,
++ 0,233,252,255,255,255,122,14,105,110,118,97,108,105,100,32,
++ 102,108,97,103,115,32,122,4,32,105,110,32,41,7,218,12,
++ 77,65,71,73,67,95,78,85,77,66,69,82,114,162,0,0,
++ 0,218,16,95,118,101,114,98,111,115,101,95,109,101,115,115,
++ 97,103,101,114,145,0,0,0,114,4,0,0,0,218,8,69,
++ 79,70,69,114,114,111,114,114,45,0,0,0,41,6,114,44,
++ 0,0,0,114,144,0,0,0,218,11,101,120,99,95,100,101,
++ 116,97,105,108,115,90,5,109,97,103,105,99,114,120,0,0,
++ 0,114,19,0,0,0,114,7,0,0,0,114,7,0,0,0,
++ 114,8,0,0,0,218,13,95,99,108,97,115,115,105,102,121,
++ 95,112,121,99,73,2,0,0,115,28,0,0,0,12,16,8,
++ 1,16,1,12,1,16,1,12,1,10,1,12,1,8,1,16,
++ 1,8,2,16,1,16,1,4,1,114,179,0,0,0,99,5,
++ 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,4,
++ 0,0,0,67,0,0,0,115,124,0,0,0,116,0,124,0,
++ 100,1,100,2,133,2,25,0,131,1,124,1,100,3,64,0,
++ 107,3,114,31,100,4,124,3,155,2,157,2,125,5,116,1,
++ 160,2,100,5,124,5,161,2,1,0,116,3,124,5,102,1,
++ 105,0,124,4,164,1,142,1,130,1,124,2,100,6,117,1,
++ 114,58,116,0,124,0,100,2,100,7,133,2,25,0,131,1,
++ 124,2,100,3,64,0,107,3,114,60,116,3,100,4,124,3,
++ 155,2,157,2,102,1,105,0,124,4,164,1,142,1,130,1,
++ 100,6,83,0,100,6,83,0,41,8,97,7,2,0,0,86,
++ 97,108,105,100,97,116,101,32,97,32,112,121,99,32,97,103,
++ 97,105,110,115,116,32,116,104,101,32,115,111,117,114,99,101,
++ 32,108,97,115,116,45,109,111,100,105,102,105,101,100,32,116,
++ 105,109,101,46,10,10,32,32,32,32,42,100,97,116,97,42,
++ 32,105,115,32,116,104,101,32,99,111,110,116,101,110,116,115,
++ 32,111,102,32,116,104,101,32,112,121,99,32,102,105,108,101,
++ 46,32,40,79,110,108,121,32,116,104,101,32,102,105,114,115,
++ 116,32,49,54,32,98,121,116,101,115,32,97,114,101,10,32,
++ 32,32,32,114,101,113,117,105,114,101,100,46,41,10,10,32,
++ 32,32,32,42,115,111,117,114,99,101,95,109,116,105,109,101,
++ 42,32,105,115,32,116,104,101,32,108,97,115,116,32,109,111,
++ 100,105,102,105,101,100,32,116,105,109,101,115,116,97,109,112,
++ 32,111,102,32,116,104,101,32,115,111,117,114,99,101,32,102,
++ 105,108,101,46,10,10,32,32,32,32,42,115,111,117,114,99,
++ 101,95,115,105,122,101,42,32,105,115,32,78,111,110,101,32,
++ 111,114,32,116,104,101,32,115,105,122,101,32,111,102,32,116,
++ 104,101,32,115,111,117,114,99,101,32,102,105,108,101,32,105,
++ 110,32,98,121,116,101,115,46,10,10,32,32,32,32,42,110,
++ 97,109,101,42,32,105,115,32,116,104,101,32,110,97,109,101,
++ 32,111,102,32,116,104,101,32,109,111,100,117,108,101,32,98,
++ 101,105,110,103,32,105,109,112,111,114,116,101,100,46,32,73,
++ 116,32,105,115,32,117,115,101,100,32,102,111,114,32,108,111,
++ 103,103,105,110,103,46,10,10,32,32,32,32,42,101,120,99,
++ 95,100,101,116,97,105,108,115,42,32,105,115,32,97,32,100,
++ 105,99,116,105,111,110,97,114,121,32,112,97,115,115,101,100,
++ 32,116,111,32,73,109,112,111,114,116,69,114,114,111,114,32,
++ 105,102,32,105,116,32,114,97,105,115,101,100,32,102,111,114,
++ 10,32,32,32,32,105,109,112,114,111,118,101,100,32,100,101,
++ 98,117,103,103,105,110,103,46,10,10,32,32,32,32,65,110,
++ 32,73,109,112,111,114,116,69,114,114,111,114,32,105,115,32,
++ 114,97,105,115,101,100,32,105,102,32,116,104,101,32,98,121,
++ 116,101,99,111,100,101,32,105,115,32,115,116,97,108,101,46,
++ 10,10,32,32,32,32,114,173,0,0,0,233,12,0,0,0,
++ 114,33,0,0,0,122,22,98,121,116,101,99,111,100,101,32,
++ 105,115,32,115,116,97,108,101,32,102,111,114,32,114,171,0,
++ 0,0,78,114,172,0,0,0,41,4,114,45,0,0,0,114,
++ 162,0,0,0,114,176,0,0,0,114,145,0,0,0,41,6,
++ 114,44,0,0,0,218,12,115,111,117,114,99,101,95,109,116,
++ 105,109,101,218,11,115,111,117,114,99,101,95,115,105,122,101,
++ 114,144,0,0,0,114,178,0,0,0,114,120,0,0,0,114,
++ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,23,
++ 95,118,97,108,105,100,97,116,101,95,116,105,109,101,115,116,
++ 97,109,112,95,112,121,99,106,2,0,0,115,18,0,0,0,
++ 24,19,10,1,12,1,16,1,8,1,24,1,22,1,4,254,
++ 4,1,114,183,0,0,0,99,4,0,0,0,0,0,0,0,
++ 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,
++ 115,42,0,0,0,124,0,100,1,100,2,133,2,25,0,124,
++ 1,107,3,114,19,116,0,100,3,124,2,155,2,157,2,102,
++ 1,105,0,124,3,164,1,142,1,130,1,100,4,83,0,41,
++ 5,97,243,1,0,0,86,97,108,105,100,97,116,101,32,97,
++ 32,104,97,115,104,45,98,97,115,101,100,32,112,121,99,32,
++ 98,121,32,99,104,101,99,107,105,110,103,32,116,104,101,32,
++ 114,101,97,108,32,115,111,117,114,99,101,32,104,97,115,104,
++ 32,97,103,97,105,110,115,116,32,116,104,101,32,111,110,101,
++ 32,105,110,10,32,32,32,32,116,104,101,32,112,121,99,32,
++ 104,101,97,100,101,114,46,10,10,32,32,32,32,42,100,97,
++ 116,97,42,32,105,115,32,116,104,101,32,99,111,110,116,101,
++ 110,116,115,32,111,102,32,116,104,101,32,112,121,99,32,102,
++ 105,108,101,46,32,40,79,110,108,121,32,116,104,101,32,102,
++ 105,114,115,116,32,49,54,32,98,121,116,101,115,32,97,114,
++ 101,10,32,32,32,32,114,101,113,117,105,114,101,100,46,41,
++ 10,10,32,32,32,32,42,115,111,117,114,99,101,95,104,97,
++ 115,104,42,32,105,115,32,116,104,101,32,105,109,112,111,114,
++ 116,108,105,98,46,117,116,105,108,46,115,111,117,114,99,101,
++ 95,104,97,115,104,40,41,32,111,102,32,116,104,101,32,115,
++ 111,117,114,99,101,32,102,105,108,101,46,10,10,32,32,32,
++ 32,42,110,97,109,101,42,32,105,115,32,116,104,101,32,110,
++ 97,109,101,32,111,102,32,116,104,101,32,109,111,100,117,108,
++ 101,32,98,101,105,110,103,32,105,109,112,111,114,116,101,100,
++ 46,32,73,116,32,105,115,32,117,115,101,100,32,102,111,114,
++ 32,108,111,103,103,105,110,103,46,10,10,32,32,32,32,42,
++ 101,120,99,95,100,101,116,97,105,108,115,42,32,105,115,32,
++ 97,32,100,105,99,116,105,111,110,97,114,121,32,112,97,115,
++ 115,101,100,32,116,111,32,73,109,112,111,114,116,69,114,114,
++ 111,114,32,105,102,32,105,116,32,114,97,105,115,101,100,32,
++ 102,111,114,10,32,32,32,32,105,109,112,114,111,118,101,100,
++ 32,100,101,98,117,103,103,105,110,103,46,10,10,32,32,32,
++ 32,65,110,32,73,109,112,111,114,116,69,114,114,111,114,32,
++ 105,115,32,114,97,105,115,101,100,32,105,102,32,116,104,101,
++ 32,98,121,116,101,99,111,100,101,32,105,115,32,115,116,97,
++ 108,101,46,10,10,32,32,32,32,114,173,0,0,0,114,172,
++ 0,0,0,122,46,104,97,115,104,32,105,110,32,98,121,116,
++ 101,99,111,100,101,32,100,111,101,115,110,39,116,32,109,97,
++ 116,99,104,32,104,97,115,104,32,111,102,32,115,111,117,114,
++ 99,101,32,78,41,1,114,145,0,0,0,41,4,114,44,0,
++ 0,0,218,11,115,111,117,114,99,101,95,104,97,115,104,114,
++ 144,0,0,0,114,178,0,0,0,114,7,0,0,0,114,7,
++ 0,0,0,114,8,0,0,0,218,18,95,118,97,108,105,100,
++ 97,116,101,95,104,97,115,104,95,112,121,99,134,2,0,0,
++ 115,14,0,0,0,16,17,2,1,8,1,4,255,2,2,6,
++ 254,4,255,114,185,0,0,0,99,4,0,0,0,0,0,0,
++ 0,0,0,0,0,5,0,0,0,5,0,0,0,67,0,0,
++ 0,115,76,0,0,0,116,0,160,1,124,0,161,1,125,4,
++ 116,2,124,4,116,3,131,2,114,28,116,4,160,5,100,1,
++ 124,2,161,2,1,0,124,3,100,2,117,1,114,26,116,6,
++ 160,7,124,4,124,3,161,2,1,0,124,4,83,0,116,8,
++ 100,3,160,9,124,2,161,1,124,1,124,2,100,4,141,3,
++ 130,1,41,5,122,35,67,111,109,112,105,108,101,32,98,121,
++ 116,101,99,111,100,101,32,97,115,32,102,111,117,110,100,32,
++ 105,110,32,97,32,112,121,99,46,122,21,99,111,100,101,32,
++ 111,98,106,101,99,116,32,102,114,111,109,32,123,33,114,125,
++ 78,122,23,78,111,110,45,99,111,100,101,32,111,98,106,101,
++ 99,116,32,105,110,32,123,33,114,125,169,2,114,144,0,0,
++ 0,114,68,0,0,0,41,10,218,7,109,97,114,115,104,97,
++ 108,90,5,108,111,97,100,115,218,10,105,115,105,110,115,116,
++ 97,110,99,101,218,10,95,99,111,100,101,95,116,121,112,101,
++ 114,162,0,0,0,114,176,0,0,0,218,4,95,105,109,112,
++ 90,16,95,102,105,120,95,99,111,95,102,105,108,101,110,97,
++ 109,101,114,145,0,0,0,114,92,0,0,0,41,5,114,44,
++ 0,0,0,114,144,0,0,0,114,135,0,0,0,114,137,0,
++ 0,0,218,4,99,111,100,101,114,7,0,0,0,114,7,0,
++ 0,0,114,8,0,0,0,218,17,95,99,111,109,112,105,108,
++ 101,95,98,121,116,101,99,111,100,101,158,2,0,0,115,18,
++ 0,0,0,10,2,10,1,12,1,8,1,12,1,4,1,10,
++ 2,4,1,6,255,114,192,0,0,0,99,3,0,0,0,0,
++ 0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,67,
++ 0,0,0,115,70,0,0,0,116,0,116,1,131,1,125,3,
++ 124,3,160,2,116,3,100,1,131,1,161,1,1,0,124,3,
++ 160,2,116,3,124,1,131,1,161,1,1,0,124,3,160,2,
++ 116,3,124,2,131,1,161,1,1,0,124,3,160,2,116,4,
++ 160,5,124,0,161,1,161,1,1,0,124,3,83,0,41,2,
++ 122,43,80,114,111,100,117,99,101,32,116,104,101,32,100,97,
++ 116,97,32,102,111,114,32,97,32,116,105,109,101,115,116,97,
++ 109,112,45,98,97,115,101,100,32,112,121,99,46,114,0,0,
++ 0,0,41,6,218,9,98,121,116,101,97,114,114,97,121,114,
++ 175,0,0,0,218,6,101,120,116,101,110,100,114,39,0,0,
++ 0,114,187,0,0,0,218,5,100,117,109,112,115,41,4,114,
++ 191,0,0,0,218,5,109,116,105,109,101,114,182,0,0,0,
++ 114,44,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
++ 8,0,0,0,218,22,95,99,111,100,101,95,116,111,95,116,
++ 105,109,101,115,116,97,109,112,95,112,121,99,171,2,0,0,
++ 115,12,0,0,0,8,2,14,1,14,1,14,1,16,1,4,
++ 1,114,197,0,0,0,84,99,3,0,0,0,0,0,0,0,
++ 0,0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,
++ 115,80,0,0,0,116,0,116,1,131,1,125,3,100,1,124,
++ 2,100,1,62,0,66,0,125,4,124,3,160,2,116,3,124,
++ 4,131,1,161,1,1,0,116,4,124,1,131,1,100,2,107,
++ 2,115,25,74,0,130,1,124,3,160,2,124,1,161,1,1,
++ 0,124,3,160,2,116,5,160,6,124,0,161,1,161,1,1,
++ 0,124,3,83,0,41,3,122,38,80,114,111,100,117,99,101,
++ 32,116,104,101,32,100,97,116,97,32,102,111,114,32,97,32,
++ 104,97,115,104,45,98,97,115,101,100,32,112,121,99,46,114,
++ 3,0,0,0,114,173,0,0,0,41,7,114,193,0,0,0,
++ 114,175,0,0,0,114,194,0,0,0,114,39,0,0,0,114,
++ 4,0,0,0,114,187,0,0,0,114,195,0,0,0,41,5,
++ 114,191,0,0,0,114,184,0,0,0,90,7,99,104,101,99,
++ 107,101,100,114,44,0,0,0,114,19,0,0,0,114,7,0,
++ 0,0,114,7,0,0,0,114,8,0,0,0,218,17,95,99,
++ 111,100,101,95,116,111,95,104,97,115,104,95,112,121,99,181,
++ 2,0,0,115,14,0,0,0,8,2,12,1,14,1,16,1,
++ 10,1,16,1,4,1,114,198,0,0,0,99,1,0,0,0,
++ 0,0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,
++ 67,0,0,0,115,62,0,0,0,100,1,100,2,108,0,125,
++ 1,116,1,160,2,124,0,161,1,106,3,125,2,124,1,160,
++ 4,124,2,161,1,125,3,116,1,160,5,100,2,100,3,161,
++ 2,125,4,124,4,160,6,124,0,160,6,124,3,100,1,25,
++ 0,161,1,161,1,83,0,41,4,122,121,68,101,99,111,100,
++ 101,32,98,121,116,101,115,32,114,101,112,114,101,115,101,110,
++ 116,105,110,103,32,115,111,117,114,99,101,32,99,111,100,101,
++ 32,97,110,100,32,114,101,116,117,114,110,32,116,104,101,32,
++ 115,116,114,105,110,103,46,10,10,32,32,32,32,85,110,105,
++ 118,101,114,115,97,108,32,110,101,119,108,105,110,101,32,115,
++ 117,112,112,111,114,116,32,105,115,32,117,115,101,100,32,105,
++ 110,32,116,104,101,32,100,101,99,111,100,105,110,103,46,10,
++ 32,32,32,32,114,0,0,0,0,78,84,41,7,218,8,116,
++ 111,107,101,110,105,122,101,114,94,0,0,0,90,7,66,121,
++ 116,101,115,73,79,90,8,114,101,97,100,108,105,110,101,90,
++ 15,100,101,116,101,99,116,95,101,110,99,111,100,105,110,103,
++ 90,25,73,110,99,114,101,109,101,110,116,97,108,78,101,119,
++ 108,105,110,101,68,101,99,111,100,101,114,218,6,100,101,99,
++ 111,100,101,41,5,218,12,115,111,117,114,99,101,95,98,121,
++ 116,101,115,114,199,0,0,0,90,21,115,111,117,114,99,101,
++ 95,98,121,116,101,115,95,114,101,97,100,108,105,110,101,218,
++ 8,101,110,99,111,100,105,110,103,90,15,110,101,119,108,105,
++ 110,101,95,100,101,99,111,100,101,114,114,7,0,0,0,114,
++ 7,0,0,0,114,8,0,0,0,218,13,100,101,99,111,100,
++ 101,95,115,111,117,114,99,101,192,2,0,0,115,10,0,0,
++ 0,8,5,12,1,10,1,12,1,20,1,114,203,0,0,0,
++ 169,2,114,167,0,0,0,218,26,115,117,98,109,111,100,117,
++ 108,101,95,115,101,97,114,99,104,95,108,111,99,97,116,105,
++ 111,110,115,99,2,0,0,0,0,0,0,0,2,0,0,0,
++ 9,0,0,0,8,0,0,0,67,0,0,0,115,54,1,0,
++ 0,124,1,100,1,117,0,114,29,100,2,125,1,116,0,124,
++ 2,100,3,131,2,114,28,122,7,124,2,160,1,124,0,161,
++ 1,125,1,87,0,110,38,4,0,116,2,121,27,1,0,1,
++ 0,1,0,89,0,110,30,119,0,110,28,116,3,160,4,124,
++ 1,161,1,125,1,116,5,124,1,131,1,115,57,122,9,116,
++ 6,116,3,160,7,161,0,124,1,131,2,125,1,87,0,110,
++ 9,4,0,116,8,121,56,1,0,1,0,1,0,89,0,110,
++ 1,119,0,116,9,106,10,124,0,124,2,124,1,100,4,141,
++ 3,125,4,100,5,124,4,95,11,124,2,100,1,117,0,114,
++ 99,116,12,131,0,68,0,93,21,92,2,125,5,125,6,124,
++ 1,160,13,116,14,124,6,131,1,161,1,114,96,124,5,124,
++ 0,124,1,131,2,125,2,124,2,124,4,95,15,1,0,110,
++ 3,113,75,100,1,83,0,124,3,116,16,117,0,114,131,116,
++ 0,124,2,100,6,131,2,114,130,122,7,124,2,160,17,124,
++ 0,161,1,125,7,87,0,110,9,4,0,116,2,121,124,1,
++ 0,1,0,1,0,89,0,110,10,119,0,124,7,114,130,103,
++ 0,124,4,95,18,110,3,124,3,124,4,95,18,124,4,106,
++ 18,103,0,107,2,114,153,124,1,114,153,116,19,124,1,131,
++ 1,100,7,25,0,125,8,124,4,106,18,160,20,124,8,161,
++ 1,1,0,124,4,83,0,41,8,97,61,1,0,0,82,101,
++ 116,117,114,110,32,97,32,109,111,100,117,108,101,32,115,112,
++ 101,99,32,98,97,115,101,100,32,111,110,32,97,32,102,105,
++ 108,101,32,108,111,99,97,116,105,111,110,46,10,10,32,32,
++ 32,32,84,111,32,105,110,100,105,99,97,116,101,32,116,104,
++ 97,116,32,116,104,101,32,109,111,100,117,108,101,32,105,115,
++ 32,97,32,112,97,99,107,97,103,101,44,32,115,101,116,10,
++ 32,32,32,32,115,117,98,109,111,100,117,108,101,95,115,101,
++ 97,114,99,104,95,108,111,99,97,116,105,111,110,115,32,116,
++ 111,32,97,32,108,105,115,116,32,111,102,32,100,105,114,101,
++ 99,116,111,114,121,32,112,97,116,104,115,46,32,32,65,110,
++ 10,32,32,32,32,101,109,112,116,121,32,108,105,115,116,32,
++ 105,115,32,115,117,102,102,105,99,105,101,110,116,44,32,116,
++ 104,111,117,103,104,32,105,116,115,32,110,111,116,32,111,116,
++ 104,101,114,119,105,115,101,32,117,115,101,102,117,108,32,116,
++ 111,32,116,104,101,10,32,32,32,32,105,109,112,111,114,116,
++ 32,115,121,115,116,101,109,46,10,10,32,32,32,32,84,104,
++ 101,32,108,111,97,100,101,114,32,109,117,115,116,32,116,97,
++ 107,101,32,97,32,115,112,101,99,32,97,115,32,105,116,115,
++ 32,111,110,108,121,32,95,95,105,110,105,116,95,95,40,41,
++ 32,97,114,103,46,10,10,32,32,32,32,78,122,9,60,117,
++ 110,107,110,111,119,110,62,218,12,103,101,116,95,102,105,108,
++ 101,110,97,109,101,169,1,218,6,111,114,105,103,105,110,84,
++ 218,10,105,115,95,112,97,99,107,97,103,101,114,0,0,0,
++ 0,41,21,114,156,0,0,0,114,206,0,0,0,114,145,0,
++ 0,0,114,21,0,0,0,114,106,0,0,0,114,89,0,0,
++ 0,114,70,0,0,0,114,85,0,0,0,114,79,0,0,0,
++ 114,162,0,0,0,218,10,77,111,100,117,108,101,83,112,101,
++ 99,90,13,95,115,101,116,95,102,105,108,101,97,116,116,114,
++ 218,27,95,103,101,116,95,115,117,112,112,111,114,116,101,100,
++ 95,102,105,108,101,95,108,111,97,100,101,114,115,114,61,0,
++ 0,0,114,139,0,0,0,114,167,0,0,0,218,9,95,80,
++ 79,80,85,76,65,84,69,114,209,0,0,0,114,205,0,0,
++ 0,114,77,0,0,0,114,64,0,0,0,41,9,114,144,0,
++ 0,0,90,8,108,111,99,97,116,105,111,110,114,167,0,0,
++ 0,114,205,0,0,0,218,4,115,112,101,99,218,12,108,111,
++ 97,100,101,114,95,99,108,97,115,115,218,8,115,117,102,102,
++ 105,120,101,115,114,209,0,0,0,90,7,100,105,114,110,97,
++ 109,101,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
++ 0,218,23,115,112,101,99,95,102,114,111,109,95,102,105,108,
++ 101,95,108,111,99,97,116,105,111,110,209,2,0,0,115,84,
++ 0,0,0,8,12,4,4,10,1,2,2,14,1,12,1,4,
++ 1,2,255,2,252,10,7,8,1,2,1,18,1,12,1,4,
++ 1,2,255,16,9,6,1,8,3,14,1,14,1,10,1,6,
++ 1,4,1,2,253,4,5,8,3,10,2,2,1,14,1,12,
++ 1,4,1,2,255,4,3,6,1,2,128,6,2,10,1,4,
++ 1,12,1,12,1,4,2,114,216,0,0,0,99,0,0,0,
++ 0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
++ 0,64,0,0,0,115,88,0,0,0,101,0,90,1,100,0,
++ 90,2,100,1,90,3,100,2,90,4,100,3,90,5,101,6,
++ 111,15,100,4,101,7,118,0,90,8,101,9,100,5,100,6,
++ 132,0,131,1,90,10,101,11,100,7,100,8,132,0,131,1,
++ 90,12,101,11,100,14,100,10,100,11,132,1,131,1,90,13,
++ 101,11,100,15,100,12,100,13,132,1,131,1,90,14,100,9,
++ 83,0,41,16,218,21,87,105,110,100,111,119,115,82,101,103,
++ 105,115,116,114,121,70,105,110,100,101,114,122,62,77,101,116,
++ 97,32,112,97,116,104,32,102,105,110,100,101,114,32,102,111,
++ 114,32,109,111,100,117,108,101,115,32,100,101,99,108,97,114,
++ 101,100,32,105,110,32,116,104,101,32,87,105,110,100,111,119,
++ 115,32,114,101,103,105,115,116,114,121,46,122,59,83,111,102,
++ 116,119,97,114,101,92,80,121,116,104,111,110,92,80,121,116,
++ 104,111,110,67,111,114,101,92,123,115,121,115,95,118,101,114,
++ 115,105,111,110,125,92,77,111,100,117,108,101,115,92,123,102,
++ 117,108,108,110,97,109,101,125,122,65,83,111,102,116,119,97,
++ 114,101,92,80,121,116,104,111,110,92,80,121,116,104,111,110,
++ 67,111,114,101,92,123,115,121,115,95,118,101,114,115,105,111,
++ 110,125,92,77,111,100,117,108,101,115,92,123,102,117,108,108,
++ 110,97,109,101,125,92,68,101,98,117,103,122,6,95,100,46,
++ 112,121,100,99,1,0,0,0,0,0,0,0,0,0,0,0,
++ 1,0,0,0,8,0,0,0,67,0,0,0,115,50,0,0,
++ 0,122,8,116,0,160,1,116,0,106,2,124,0,161,2,87,
++ 0,83,0,4,0,116,3,121,24,1,0,1,0,1,0,116,
++ 0,160,1,116,0,106,4,124,0,161,2,6,0,89,0,83,
++ 0,119,0,114,72,0,0,0,41,5,218,6,119,105,110,114,
++ 101,103,90,7,79,112,101,110,75,101,121,90,17,72,75,69,
++ 89,95,67,85,82,82,69,78,84,95,85,83,69,82,114,79,
++ 0,0,0,90,18,72,75,69,89,95,76,79,67,65,76,95,
++ 77,65,67,72,73,78,69,114,22,0,0,0,114,7,0,0,
++ 0,114,7,0,0,0,114,8,0,0,0,218,14,95,111,112,
++ 101,110,95,114,101,103,105,115,116,114,121,38,3,0,0,115,
++ 10,0,0,0,2,2,16,1,12,1,18,1,2,255,122,36,
++ 87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,
++ 105,110,100,101,114,46,95,111,112,101,110,95,114,101,103,105,
++ 115,116,114,121,99,2,0,0,0,0,0,0,0,0,0,0,
++ 0,6,0,0,0,8,0,0,0,67,0,0,0,115,134,0,
++ 0,0,124,0,106,0,114,7,124,0,106,1,125,2,110,3,
++ 124,0,106,2,125,2,124,2,106,3,124,1,100,1,116,4,
++ 106,5,100,0,100,2,133,2,25,0,22,0,100,3,141,2,
++ 125,3,122,32,124,0,160,6,124,3,161,1,143,16,125,4,
++ 116,7,160,8,124,4,100,4,161,2,125,5,87,0,100,0,
++ 4,0,4,0,131,3,1,0,87,0,124,5,83,0,49,0,
++ 115,49,119,1,1,0,1,0,1,0,89,0,1,0,87,0,
++ 124,5,83,0,4,0,116,9,121,66,1,0,1,0,1,0,
++ 89,0,100,0,83,0,119,0,41,5,78,122,5,37,100,46,
++ 37,100,114,47,0,0,0,41,2,114,166,0,0,0,90,11,
++ 115,121,115,95,118,101,114,115,105,111,110,114,10,0,0,0,
++ 41,10,218,11,68,69,66,85,71,95,66,85,73,76,68,218,
++ 18,82,69,71,73,83,84,82,89,95,75,69,89,95,68,69,
++ 66,85,71,218,12,82,69,71,73,83,84,82,89,95,75,69,
++ 89,114,92,0,0,0,114,18,0,0,0,218,12,118,101,114,
++ 115,105,111,110,95,105,110,102,111,114,219,0,0,0,114,218,
++ 0,0,0,90,10,81,117,101,114,121,86,97,108,117,101,114,
++ 79,0,0,0,41,6,218,3,99,108,115,114,166,0,0,0,
++ 90,12,114,101,103,105,115,116,114,121,95,107,101,121,114,23,
++ 0,0,0,90,4,104,107,101,121,218,8,102,105,108,101,112,
++ 97,116,104,114,7,0,0,0,114,7,0,0,0,114,8,0,
++ 0,0,218,16,95,115,101,97,114,99,104,95,114,101,103,105,
++ 115,116,114,121,45,3,0,0,115,32,0,0,0,6,2,8,
++ 1,6,2,6,1,16,1,6,255,2,2,12,1,14,1,12,
++ 255,4,4,18,252,4,4,12,254,6,1,2,255,122,38,87,
++ 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,
++ 110,100,101,114,46,95,115,101,97,114,99,104,95,114,101,103,
++ 105,115,116,114,121,78,99,4,0,0,0,0,0,0,0,0,
++ 0,0,0,8,0,0,0,8,0,0,0,67,0,0,0,115,
++ 120,0,0,0,124,0,160,0,124,1,161,1,125,4,124,4,
++ 100,0,117,0,114,11,100,0,83,0,122,6,116,1,124,4,
++ 131,1,1,0,87,0,110,10,4,0,116,2,121,27,1,0,
++ 1,0,1,0,89,0,100,0,83,0,119,0,116,3,131,0,
++ 68,0,93,26,92,2,125,5,125,6,124,4,160,4,116,5,
++ 124,6,131,1,161,1,114,57,116,6,106,7,124,1,124,5,
++ 124,1,124,4,131,2,124,4,100,1,141,3,125,7,124,7,
++ 2,0,1,0,83,0,113,31,100,0,83,0,41,2,78,114,
++ 207,0,0,0,41,8,114,226,0,0,0,114,78,0,0,0,
++ 114,79,0,0,0,114,211,0,0,0,114,61,0,0,0,114,
++ 139,0,0,0,114,162,0,0,0,218,16,115,112,101,99,95,
++ 102,114,111,109,95,108,111,97,100,101,114,41,8,114,224,0,
++ 0,0,114,166,0,0,0,114,68,0,0,0,218,6,116,97,
++ 114,103,101,116,114,225,0,0,0,114,167,0,0,0,114,215,
++ 0,0,0,114,213,0,0,0,114,7,0,0,0,114,7,0,
++ 0,0,114,8,0,0,0,218,9,102,105,110,100,95,115,112,
++ 101,99,60,3,0,0,115,34,0,0,0,10,2,8,1,4,
++ 1,2,1,12,1,12,1,6,1,2,255,14,2,14,1,6,
++ 1,8,1,2,1,6,254,8,3,2,252,4,255,122,31,87,
++ 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,
++ 110,100,101,114,46,102,105,110,100,95,115,112,101,99,99,3,
++ 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,
++ 0,0,0,67,0,0,0,115,42,0,0,0,116,0,160,1,
++ 100,1,116,2,161,2,1,0,124,0,160,3,124,1,124,2,
++ 161,2,125,3,124,3,100,2,117,1,114,19,124,3,106,4,
++ 83,0,100,2,83,0,41,3,122,106,70,105,110,100,32,109,
++ 111,100,117,108,101,32,110,97,109,101,100,32,105,110,32,116,
++ 104,101,32,114,101,103,105,115,116,114,121,46,10,10,32,32,
++ 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,
++ 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,
++ 32,32,85,115,101,32,102,105,110,100,95,115,112,101,99,40,
++ 41,32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,
++ 32,32,32,32,122,112,87,105,110,100,111,119,115,82,101,103,
++ 105,115,116,114,121,70,105,110,100,101,114,46,102,105,110,100,
++ 95,109,111,100,117,108,101,40,41,32,105,115,32,100,101,112,
++ 114,101,99,97,116,101,100,32,97,110,100,32,115,108,97,116,
++ 101,100,32,102,111,114,32,114,101,109,111,118,97,108,32,105,
++ 110,32,80,121,116,104,111,110,32,51,46,49,50,59,32,117,
++ 115,101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,
++ 110,115,116,101,97,100,78,169,5,114,102,0,0,0,114,103,
++ 0,0,0,114,104,0,0,0,114,229,0,0,0,114,167,0,
++ 0,0,169,4,114,224,0,0,0,114,166,0,0,0,114,68,
++ 0,0,0,114,213,0,0,0,114,7,0,0,0,114,7,0,
++ 0,0,114,8,0,0,0,218,11,102,105,110,100,95,109,111,
++ 100,117,108,101,76,3,0,0,115,14,0,0,0,6,7,2,
++ 2,4,254,12,3,8,1,6,1,4,2,122,33,87,105,110,
++ 100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,
++ 101,114,46,102,105,110,100,95,109,111,100,117,108,101,169,2,
++ 78,78,114,72,0,0,0,41,15,114,153,0,0,0,114,152,
++ 0,0,0,114,154,0,0,0,114,155,0,0,0,114,222,0,
++ 0,0,114,221,0,0,0,218,11,95,77,83,95,87,73,78,
++ 68,79,87,83,218,18,69,88,84,69,78,83,73,79,78,95,
++ 83,85,70,70,73,88,69,83,114,220,0,0,0,218,12,115,
++ 116,97,116,105,99,109,101,116,104,111,100,114,219,0,0,0,
++ 218,11,99,108,97,115,115,109,101,116,104,111,100,114,226,0,
++ 0,0,114,229,0,0,0,114,232,0,0,0,114,7,0,0,
+ 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
+- 218,22,95,99,111,100,101,95,116,111,95,116,105,109,101,115,
+- 116,97,109,112,95,112,121,99,171,2,0,0,115,12,0,0,
+- 0,8,2,14,1,14,1,14,1,16,1,4,1,114,194,0,
+- 0,0,84,99,3,0,0,0,0,0,0,0,0,0,0,0,
+- 5,0,0,0,5,0,0,0,67,0,0,0,115,80,0,0,
+- 0,116,0,116,1,131,1,125,3,100,1,124,2,100,1,62,
+- 0,66,0,125,4,124,3,160,2,116,3,124,4,131,1,161,
+- 1,1,0,116,4,124,1,131,1,100,2,107,2,115,25,74,
+- 0,130,1,124,3,160,2,124,1,161,1,1,0,124,3,160,
+- 2,116,5,160,6,124,0,161,1,161,1,1,0,124,3,83,
+- 0,41,3,122,38,80,114,111,100,117,99,101,32,116,104,101,
+- 32,100,97,116,97,32,102,111,114,32,97,32,104,97,115,104,
+- 45,98,97,115,101,100,32,112,121,99,46,114,3,0,0,0,
+- 114,170,0,0,0,41,7,114,190,0,0,0,114,172,0,0,
+- 0,114,191,0,0,0,114,36,0,0,0,114,4,0,0,0,
+- 114,184,0,0,0,114,192,0,0,0,41,5,114,188,0,0,
+- 0,114,181,0,0,0,90,7,99,104,101,99,107,101,100,114,
+- 41,0,0,0,114,16,0,0,0,114,7,0,0,0,114,7,
+- 0,0,0,114,8,0,0,0,218,17,95,99,111,100,101,95,
+- 116,111,95,104,97,115,104,95,112,121,99,181,2,0,0,115,
+- 14,0,0,0,8,2,12,1,14,1,16,1,10,1,16,1,
+- 4,1,114,195,0,0,0,99,1,0,0,0,0,0,0,0,
+- 0,0,0,0,5,0,0,0,6,0,0,0,67,0,0,0,
+- 115,62,0,0,0,100,1,100,2,108,0,125,1,116,1,160,
+- 2,124,0,161,1,106,3,125,2,124,1,160,4,124,2,161,
+- 1,125,3,116,1,160,5,100,2,100,3,161,2,125,4,124,
+- 4,160,6,124,0,160,6,124,3,100,1,25,0,161,1,161,
+- 1,83,0,41,4,122,121,68,101,99,111,100,101,32,98,121,
+- 116,101,115,32,114,101,112,114,101,115,101,110,116,105,110,103,
+- 32,115,111,117,114,99,101,32,99,111,100,101,32,97,110,100,
+- 32,114,101,116,117,114,110,32,116,104,101,32,115,116,114,105,
+- 110,103,46,10,10,32,32,32,32,85,110,105,118,101,114,115,
+- 97,108,32,110,101,119,108,105,110,101,32,115,117,112,112,111,
+- 114,116,32,105,115,32,117,115,101,100,32,105,110,32,116,104,
+- 101,32,100,101,99,111,100,105,110,103,46,10,32,32,32,32,
+- 114,0,0,0,0,78,84,41,7,218,8,116,111,107,101,110,
+- 105,122,101,114,91,0,0,0,90,7,66,121,116,101,115,73,
+- 79,90,8,114,101,97,100,108,105,110,101,90,15,100,101,116,
+- 101,99,116,95,101,110,99,111,100,105,110,103,90,25,73,110,
+- 99,114,101,109,101,110,116,97,108,78,101,119,108,105,110,101,
+- 68,101,99,111,100,101,114,218,6,100,101,99,111,100,101,41,
+- 5,218,12,115,111,117,114,99,101,95,98,121,116,101,115,114,
+- 196,0,0,0,90,21,115,111,117,114,99,101,95,98,121,116,
+- 101,115,95,114,101,97,100,108,105,110,101,218,8,101,110,99,
+- 111,100,105,110,103,90,15,110,101,119,108,105,110,101,95,100,
+- 101,99,111,100,101,114,114,7,0,0,0,114,7,0,0,0,
+- 114,8,0,0,0,218,13,100,101,99,111,100,101,95,115,111,
+- 117,114,99,101,192,2,0,0,115,10,0,0,0,8,5,12,
+- 1,10,1,12,1,20,1,114,200,0,0,0,169,2,114,164,
+- 0,0,0,218,26,115,117,98,109,111,100,117,108,101,95,115,
+- 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,99,
+- 2,0,0,0,0,0,0,0,2,0,0,0,9,0,0,0,
+- 8,0,0,0,67,0,0,0,115,54,1,0,0,124,1,100,
+- 1,117,0,114,29,100,2,125,1,116,0,124,2,100,3,131,
+- 2,114,28,122,7,124,2,160,1,124,0,161,1,125,1,87,
+- 0,110,38,4,0,116,2,121,27,1,0,1,0,1,0,89,
+- 0,110,30,119,0,110,28,116,3,160,4,124,1,161,1,125,
+- 1,116,5,124,1,131,1,115,57,122,9,116,6,116,3,160,
+- 7,161,0,124,1,131,2,125,1,87,0,110,9,4,0,116,
+- 8,121,56,1,0,1,0,1,0,89,0,110,1,119,0,116,
+- 9,106,10,124,0,124,2,124,1,100,4,141,3,125,4,100,
+- 5,124,4,95,11,124,2,100,1,117,0,114,99,116,12,131,
+- 0,68,0,93,21,92,2,125,5,125,6,124,1,160,13,116,
+- 14,124,6,131,1,161,1,114,96,124,5,124,0,124,1,131,
+- 2,125,2,124,2,124,4,95,15,1,0,110,3,113,75,100,
+- 1,83,0,124,3,116,16,117,0,114,131,116,0,124,2,100,
+- 6,131,2,114,130,122,7,124,2,160,17,124,0,161,1,125,
+- 7,87,0,110,9,4,0,116,2,121,124,1,0,1,0,1,
+- 0,89,0,110,10,119,0,124,7,114,130,103,0,124,4,95,
+- 18,110,3,124,3,124,4,95,18,124,4,106,18,103,0,107,
+- 2,114,153,124,1,114,153,116,19,124,1,131,1,100,7,25,
+- 0,125,8,124,4,106,18,160,20,124,8,161,1,1,0,124,
+- 4,83,0,41,8,97,61,1,0,0,82,101,116,117,114,110,
+- 32,97,32,109,111,100,117,108,101,32,115,112,101,99,32,98,
+- 97,115,101,100,32,111,110,32,97,32,102,105,108,101,32,108,
+- 111,99,97,116,105,111,110,46,10,10,32,32,32,32,84,111,
+- 32,105,110,100,105,99,97,116,101,32,116,104,97,116,32,116,
+- 104,101,32,109,111,100,117,108,101,32,105,115,32,97,32,112,
+- 97,99,107,97,103,101,44,32,115,101,116,10,32,32,32,32,
+- 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104,
+- 95,108,111,99,97,116,105,111,110,115,32,116,111,32,97,32,
+- 108,105,115,116,32,111,102,32,100,105,114,101,99,116,111,114,
+- 121,32,112,97,116,104,115,46,32,32,65,110,10,32,32,32,
+- 32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,115,
+- 117,102,102,105,99,105,101,110,116,44,32,116,104,111,117,103,
+- 104,32,105,116,115,32,110,111,116,32,111,116,104,101,114,119,
+- 105,115,101,32,117,115,101,102,117,108,32,116,111,32,116,104,
+- 101,10,32,32,32,32,105,109,112,111,114,116,32,115,121,115,
+- 116,101,109,46,10,10,32,32,32,32,84,104,101,32,108,111,
+- 97,100,101,114,32,109,117,115,116,32,116,97,107,101,32,97,
+- 32,115,112,101,99,32,97,115,32,105,116,115,32,111,110,108,
+- 121,32,95,95,105,110,105,116,95,95,40,41,32,97,114,103,
+- 46,10,10,32,32,32,32,78,122,9,60,117,110,107,110,111,
+- 119,110,62,218,12,103,101,116,95,102,105,108,101,110,97,109,
+- 101,169,1,218,6,111,114,105,103,105,110,84,218,10,105,115,
+- 95,112,97,99,107,97,103,101,114,0,0,0,0,41,21,114,
+- 153,0,0,0,114,203,0,0,0,114,142,0,0,0,114,18,
+- 0,0,0,114,103,0,0,0,114,86,0,0,0,114,67,0,
+- 0,0,114,82,0,0,0,114,76,0,0,0,114,159,0,0,
+- 0,218,10,77,111,100,117,108,101,83,112,101,99,90,13,95,
+- 115,101,116,95,102,105,108,101,97,116,116,114,218,27,95,103,
+- 101,116,95,115,117,112,112,111,114,116,101,100,95,102,105,108,
+- 101,95,108,111,97,100,101,114,115,114,58,0,0,0,114,136,
+- 0,0,0,114,164,0,0,0,218,9,95,80,79,80,85,76,
+- 65,84,69,114,206,0,0,0,114,202,0,0,0,114,74,0,
+- 0,0,114,61,0,0,0,41,9,114,141,0,0,0,90,8,
+- 108,111,99,97,116,105,111,110,114,164,0,0,0,114,202,0,
+- 0,0,218,4,115,112,101,99,218,12,108,111,97,100,101,114,
+- 95,99,108,97,115,115,218,8,115,117,102,102,105,120,101,115,
+- 114,206,0,0,0,90,7,100,105,114,110,97,109,101,114,7,
+- 0,0,0,114,7,0,0,0,114,8,0,0,0,218,23,115,
+- 112,101,99,95,102,114,111,109,95,102,105,108,101,95,108,111,
+- 99,97,116,105,111,110,209,2,0,0,115,84,0,0,0,8,
+- 12,4,4,10,1,2,2,14,1,12,1,4,1,2,255,2,
+- 252,10,7,8,1,2,1,18,1,12,1,4,1,2,255,16,
+- 9,6,1,8,3,14,1,14,1,10,1,6,1,4,1,2,
+- 253,4,5,8,3,10,2,2,1,14,1,12,1,4,1,2,
+- 255,4,3,6,1,2,128,6,2,10,1,4,1,12,1,12,
+- 1,4,2,114,213,0,0,0,99,0,0,0,0,0,0,0,
+- 0,0,0,0,0,0,0,0,0,4,0,0,0,64,0,0,
+- 0,115,88,0,0,0,101,0,90,1,100,0,90,2,100,1,
+- 90,3,100,2,90,4,100,3,90,5,101,6,111,15,100,4,
+- 101,7,118,0,90,8,101,9,100,5,100,6,132,0,131,1,
+- 90,10,101,11,100,7,100,8,132,0,131,1,90,12,101,11,
+- 100,14,100,10,100,11,132,1,131,1,90,13,101,11,100,15,
+- 100,12,100,13,132,1,131,1,90,14,100,9,83,0,41,16,
+- 218,21,87,105,110,100,111,119,115,82,101,103,105,115,116,114,
+- 121,70,105,110,100,101,114,122,62,77,101,116,97,32,112,97,
+- 116,104,32,102,105,110,100,101,114,32,102,111,114,32,109,111,
+- 100,117,108,101,115,32,100,101,99,108,97,114,101,100,32,105,
+- 110,32,116,104,101,32,87,105,110,100,111,119,115,32,114,101,
+- 103,105,115,116,114,121,46,122,59,83,111,102,116,119,97,114,
+- 101,92,80,121,116,104,111,110,92,80,121,116,104,111,110,67,
+- 111,114,101,92,123,115,121,115,95,118,101,114,115,105,111,110,
+- 125,92,77,111,100,117,108,101,115,92,123,102,117,108,108,110,
+- 97,109,101,125,122,65,83,111,102,116,119,97,114,101,92,80,
+- 121,116,104,111,110,92,80,121,116,104,111,110,67,111,114,101,
+- 92,123,115,121,115,95,118,101,114,115,105,111,110,125,92,77,
+- 111,100,117,108,101,115,92,123,102,117,108,108,110,97,109,101,
+- 125,92,68,101,98,117,103,122,6,95,100,46,112,121,100,99,
+- 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+- 8,0,0,0,67,0,0,0,115,50,0,0,0,122,8,116,
+- 0,160,1,116,0,106,2,124,0,161,2,87,0,83,0,4,
+- 0,116,3,121,24,1,0,1,0,1,0,116,0,160,1,116,
+- 0,106,4,124,0,161,2,6,0,89,0,83,0,119,0,114,
+- 69,0,0,0,41,5,218,6,119,105,110,114,101,103,90,7,
+- 79,112,101,110,75,101,121,90,17,72,75,69,89,95,67,85,
+- 82,82,69,78,84,95,85,83,69,82,114,76,0,0,0,90,
+- 18,72,75,69,89,95,76,79,67,65,76,95,77,65,67,72,
+- 73,78,69,114,19,0,0,0,114,7,0,0,0,114,7,0,
+- 0,0,114,8,0,0,0,218,14,95,111,112,101,110,95,114,
+- 101,103,105,115,116,114,121,38,3,0,0,115,10,0,0,0,
+- 2,2,16,1,12,1,18,1,2,255,122,36,87,105,110,100,
+- 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,
+- 114,46,95,111,112,101,110,95,114,101,103,105,115,116,114,121,
+- 99,2,0,0,0,0,0,0,0,0,0,0,0,6,0,0,
+- 0,8,0,0,0,67,0,0,0,115,134,0,0,0,124,0,
+- 106,0,114,7,124,0,106,1,125,2,110,3,124,0,106,2,
+- 125,2,124,2,106,3,124,1,100,1,116,4,106,5,100,0,
+- 100,2,133,2,25,0,22,0,100,3,141,2,125,3,122,32,
+- 124,0,160,6,124,3,161,1,143,16,125,4,116,7,160,8,
+- 124,4,100,4,161,2,125,5,87,0,100,0,4,0,4,0,
+- 131,3,1,0,87,0,124,5,83,0,49,0,115,49,119,1,
+- 1,0,1,0,1,0,89,0,1,0,87,0,124,5,83,0,
+- 4,0,116,9,121,66,1,0,1,0,1,0,89,0,100,0,
+- 83,0,119,0,41,5,78,122,5,37,100,46,37,100,114,44,
+- 0,0,0,41,2,114,163,0,0,0,90,11,115,121,115,95,
+- 118,101,114,115,105,111,110,114,10,0,0,0,41,10,218,11,
+- 68,69,66,85,71,95,66,85,73,76,68,218,18,82,69,71,
+- 73,83,84,82,89,95,75,69,89,95,68,69,66,85,71,218,
+- 12,82,69,71,73,83,84,82,89,95,75,69,89,114,89,0,
+- 0,0,114,15,0,0,0,218,12,118,101,114,115,105,111,110,
+- 95,105,110,102,111,114,216,0,0,0,114,215,0,0,0,90,
+- 10,81,117,101,114,121,86,97,108,117,101,114,76,0,0,0,
+- 41,6,218,3,99,108,115,114,163,0,0,0,90,12,114,101,
+- 103,105,115,116,114,121,95,107,101,121,114,20,0,0,0,90,
+- 4,104,107,101,121,218,8,102,105,108,101,112,97,116,104,114,
+- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,16,
+- 95,115,101,97,114,99,104,95,114,101,103,105,115,116,114,121,
+- 45,3,0,0,115,32,0,0,0,6,2,8,1,6,2,6,
+- 1,16,1,6,255,2,2,12,1,14,1,12,255,4,4,18,
+- 252,4,4,12,254,6,1,2,255,122,38,87,105,110,100,111,
+- 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,
+- 46,95,115,101,97,114,99,104,95,114,101,103,105,115,116,114,
+- 121,78,99,4,0,0,0,0,0,0,0,0,0,0,0,8,
+- 0,0,0,8,0,0,0,67,0,0,0,115,120,0,0,0,
+- 124,0,160,0,124,1,161,1,125,4,124,4,100,0,117,0,
+- 114,11,100,0,83,0,122,6,116,1,124,4,131,1,1,0,
+- 87,0,110,10,4,0,116,2,121,27,1,0,1,0,1,0,
+- 89,0,100,0,83,0,119,0,116,3,131,0,68,0,93,26,
+- 92,2,125,5,125,6,124,4,160,4,116,5,124,6,131,1,
+- 161,1,114,57,116,6,106,7,124,1,124,5,124,1,124,4,
+- 131,2,124,4,100,1,141,3,125,7,124,7,2,0,1,0,
+- 83,0,113,31,100,0,83,0,41,2,78,114,204,0,0,0,
+- 41,8,114,223,0,0,0,114,75,0,0,0,114,76,0,0,
+- 0,114,208,0,0,0,114,58,0,0,0,114,136,0,0,0,
+- 114,159,0,0,0,218,16,115,112,101,99,95,102,114,111,109,
+- 95,108,111,97,100,101,114,41,8,114,221,0,0,0,114,163,
+- 0,0,0,114,65,0,0,0,218,6,116,97,114,103,101,116,
+- 114,222,0,0,0,114,164,0,0,0,114,212,0,0,0,114,
+- 210,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
+- 0,0,0,218,9,102,105,110,100,95,115,112,101,99,60,3,
+- 0,0,115,34,0,0,0,10,2,8,1,4,1,2,1,12,
+- 1,12,1,6,1,2,255,14,2,14,1,6,1,8,1,2,
+- 1,6,254,8,3,2,252,4,255,122,31,87,105,110,100,111,
+- 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,
+- 46,102,105,110,100,95,115,112,101,99,99,3,0,0,0,0,
+- 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67,
+- 0,0,0,115,42,0,0,0,116,0,160,1,100,1,116,2,
+- 161,2,1,0,124,0,160,3,124,1,124,2,161,2,125,3,
+- 124,3,100,2,117,1,114,19,124,3,106,4,83,0,100,2,
+- 83,0,41,3,122,106,70,105,110,100,32,109,111,100,117,108,
+- 101,32,110,97,109,101,100,32,105,110,32,116,104,101,32,114,
+- 101,103,105,115,116,114,121,46,10,10,32,32,32,32,32,32,
+- 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,
+- 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,
+- 101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,
+- 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,
+- 122,112,87,105,110,100,111,119,115,82,101,103,105,115,116,114,
+- 121,70,105,110,100,101,114,46,102,105,110,100,95,109,111,100,
+- 117,108,101,40,41,32,105,115,32,100,101,112,114,101,99,97,
+- 116,101,100,32,97,110,100,32,115,108,97,116,101,100,32,102,
+- 111,114,32,114,101,109,111,118,97,108,32,105,110,32,80,121,
+- 116,104,111,110,32,51,46,49,50,59,32,117,115,101,32,102,
+- 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101,
+- 97,100,78,169,5,114,99,0,0,0,114,100,0,0,0,114,
+- 101,0,0,0,114,226,0,0,0,114,164,0,0,0,169,4,
+- 114,221,0,0,0,114,163,0,0,0,114,65,0,0,0,114,
+- 210,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
+- 0,0,0,218,11,102,105,110,100,95,109,111,100,117,108,101,
+- 76,3,0,0,115,14,0,0,0,6,7,2,2,4,254,12,
+- 3,8,1,6,1,4,2,122,33,87,105,110,100,111,119,115,
+- 82,101,103,105,115,116,114,121,70,105,110,100,101,114,46,102,
+- 105,110,100,95,109,111,100,117,108,101,169,2,78,78,114,69,
+- 0,0,0,41,15,114,150,0,0,0,114,149,0,0,0,114,
+- 151,0,0,0,114,152,0,0,0,114,219,0,0,0,114,218,
+- 0,0,0,218,11,95,77,83,95,87,73,78,68,79,87,83,
+- 218,18,69,88,84,69,78,83,73,79,78,95,83,85,70,70,
+- 73,88,69,83,114,217,0,0,0,218,12,115,116,97,116,105,
+- 99,109,101,116,104,111,100,114,216,0,0,0,218,11,99,108,
+- 97,115,115,109,101,116,104,111,100,114,223,0,0,0,114,226,
+- 0,0,0,114,229,0,0,0,114,7,0,0,0,114,7,0,
+- 0,0,114,7,0,0,0,114,8,0,0,0,114,214,0,0,
+- 0,26,3,0,0,115,30,0,0,0,8,0,4,2,2,3,
+- 2,255,2,4,2,255,12,3,2,2,10,1,2,6,10,1,
+- 2,14,12,1,2,15,16,1,114,214,0,0,0,99,0,0,
+- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
+- 0,0,64,0,0,0,115,48,0,0,0,101,0,90,1,100,
+- 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,
+- 4,100,5,132,0,90,5,100,6,100,7,132,0,90,6,100,
+- 8,100,9,132,0,90,7,100,10,83,0,41,11,218,13,95,
+- 76,111,97,100,101,114,66,97,115,105,99,115,122,83,66,97,
+- 115,101,32,99,108,97,115,115,32,111,102,32,99,111,109,109,
+- 111,110,32,99,111,100,101,32,110,101,101,100,101,100,32,98,
+- 121,32,98,111,116,104,32,83,111,117,114,99,101,76,111,97,
+- 100,101,114,32,97,110,100,10,32,32,32,32,83,111,117,114,
+- 99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114,
+- 46,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0,
+- 0,0,4,0,0,0,67,0,0,0,115,64,0,0,0,116,
+- 0,124,0,160,1,124,1,161,1,131,1,100,1,25,0,125,
+- 2,124,2,160,2,100,2,100,1,161,2,100,3,25,0,125,
+- 3,124,1,160,3,100,2,161,1,100,4,25,0,125,4,124,
+- 3,100,5,107,2,111,31,124,4,100,5,107,3,83,0,41,
+- 6,122,141,67,111,110,99,114,101,116,101,32,105,109,112,108,
+- 101,109,101,110,116,97,116,105,111,110,32,111,102,32,73,110,
+- 115,112,101,99,116,76,111,97,100,101,114,46,105,115,95,112,
+- 97,99,107,97,103,101,32,98,121,32,99,104,101,99,107,105,
+- 110,103,32,105,102,10,32,32,32,32,32,32,32,32,116,104,
+- 101,32,112,97,116,104,32,114,101,116,117,114,110,101,100,32,
+- 98,121,32,103,101,116,95,102,105,108,101,110,97,109,101,32,
+- 104,97,115,32,97,32,102,105,108,101,110,97,109,101,32,111,
+- 102,32,39,95,95,105,110,105,116,95,95,46,112,121,39,46,
+- 114,3,0,0,0,114,97,0,0,0,114,0,0,0,0,114,
+- 44,0,0,0,218,8,95,95,105,110,105,116,95,95,41,4,
+- 114,74,0,0,0,114,203,0,0,0,114,125,0,0,0,114,
+- 104,0,0,0,41,5,114,143,0,0,0,114,163,0,0,0,
+- 114,120,0,0,0,90,13,102,105,108,101,110,97,109,101,95,
+- 98,97,115,101,90,9,116,97,105,108,95,110,97,109,101,114,
+- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,206,
+- 0,0,0,98,3,0,0,115,8,0,0,0,18,3,16,1,
+- 14,1,16,1,122,24,95,76,111,97,100,101,114,66,97,115,
+- 105,99,115,46,105,115,95,112,97,99,107,97,103,101,99,2,
+- 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,
+- 0,0,0,67,0,0,0,114,23,0,0,0,169,2,122,42,
+- 85,115,101,32,100,101,102,97,117,108,116,32,115,101,109,97,
+- 110,116,105,99,115,32,102,111,114,32,109,111,100,117,108,101,
+- 32,99,114,101,97,116,105,111,110,46,78,114,7,0,0,0,
+- 169,2,114,143,0,0,0,114,210,0,0,0,114,7,0,0,
+- 0,114,7,0,0,0,114,8,0,0,0,218,13,99,114,101,
+- 97,116,101,95,109,111,100,117,108,101,106,3,0,0,243,2,
+- 0,0,0,4,0,122,27,95,76,111,97,100,101,114,66,97,
+- 115,105,99,115,46,99,114,101,97,116,101,95,109,111,100,117,
+- 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,3,
+- 0,0,0,5,0,0,0,67,0,0,0,115,56,0,0,0,
+- 124,0,160,0,124,1,106,1,161,1,125,2,124,2,100,1,
+- 117,0,114,18,116,2,100,2,160,3,124,1,106,1,161,1,
+- 131,1,130,1,116,4,160,5,116,6,124,2,124,1,106,7,
+- 161,3,1,0,100,1,83,0,41,3,122,19,69,120,101,99,
+- 117,116,101,32,116,104,101,32,109,111,100,117,108,101,46,78,
+- 122,52,99,97,110,110,111,116,32,108,111,97,100,32,109,111,
+- 100,117,108,101,32,123,33,114,125,32,119,104,101,110,32,103,
+- 101,116,95,99,111,100,101,40,41,32,114,101,116,117,114,110,
+- 115,32,78,111,110,101,41,8,218,8,103,101,116,95,99,111,
+- 100,101,114,150,0,0,0,114,142,0,0,0,114,89,0,0,
+- 0,114,159,0,0,0,218,25,95,99,97,108,108,95,119,105,
+- 116,104,95,102,114,97,109,101,115,95,114,101,109,111,118,101,
+- 100,218,4,101,120,101,99,114,156,0,0,0,41,3,114,143,
+- 0,0,0,218,6,109,111,100,117,108,101,114,188,0,0,0,
++ 114,217,0,0,0,26,3,0,0,115,30,0,0,0,8,0,
++ 4,2,2,3,2,255,2,4,2,255,12,3,2,2,10,1,
++ 2,6,10,1,2,14,12,1,2,15,16,1,114,217,0,0,
++ 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
++ 0,0,2,0,0,0,64,0,0,0,115,48,0,0,0,101,
++ 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,
++ 0,90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,
++ 0,90,6,100,8,100,9,132,0,90,7,100,10,83,0,41,
++ 11,218,13,95,76,111,97,100,101,114,66,97,115,105,99,115,
++ 122,83,66,97,115,101,32,99,108,97,115,115,32,111,102,32,
++ 99,111,109,109,111,110,32,99,111,100,101,32,110,101,101,100,
++ 101,100,32,98,121,32,98,111,116,104,32,83,111,117,114,99,
++ 101,76,111,97,100,101,114,32,97,110,100,10,32,32,32,32,
++ 83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,
++ 97,100,101,114,46,99,2,0,0,0,0,0,0,0,0,0,
++ 0,0,5,0,0,0,4,0,0,0,67,0,0,0,115,64,
++ 0,0,0,116,0,124,0,160,1,124,1,161,1,131,1,100,
++ 1,25,0,125,2,124,2,160,2,100,2,100,1,161,2,100,
++ 3,25,0,125,3,124,1,160,3,100,2,161,1,100,4,25,
++ 0,125,4,124,3,100,5,107,2,111,31,124,4,100,5,107,
++ 3,83,0,41,6,122,141,67,111,110,99,114,101,116,101,32,
++ 105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,
++ 102,32,73,110,115,112,101,99,116,76,111,97,100,101,114,46,
++ 105,115,95,112,97,99,107,97,103,101,32,98,121,32,99,104,
++ 101,99,107,105,110,103,32,105,102,10,32,32,32,32,32,32,
++ 32,32,116,104,101,32,112,97,116,104,32,114,101,116,117,114,
++ 110,101,100,32,98,121,32,103,101,116,95,102,105,108,101,110,
++ 97,109,101,32,104,97,115,32,97,32,102,105,108,101,110,97,
++ 109,101,32,111,102,32,39,95,95,105,110,105,116,95,95,46,
++ 112,121,39,46,114,3,0,0,0,114,100,0,0,0,114,0,
++ 0,0,0,114,47,0,0,0,218,8,95,95,105,110,105,116,
++ 95,95,41,4,114,77,0,0,0,114,206,0,0,0,114,128,
++ 0,0,0,114,107,0,0,0,41,5,114,146,0,0,0,114,
++ 166,0,0,0,114,123,0,0,0,90,13,102,105,108,101,110,
++ 97,109,101,95,98,97,115,101,90,9,116,97,105,108,95,110,
++ 97,109,101,114,7,0,0,0,114,7,0,0,0,114,8,0,
++ 0,0,114,209,0,0,0,98,3,0,0,115,8,0,0,0,
++ 18,3,16,1,14,1,16,1,122,24,95,76,111,97,100,101,
++ 114,66,97,115,105,99,115,46,105,115,95,112,97,99,107,97,
++ 103,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
++ 0,0,0,1,0,0,0,67,0,0,0,114,26,0,0,0,
++ 169,2,122,42,85,115,101,32,100,101,102,97,117,108,116,32,
++ 115,101,109,97,110,116,105,99,115,32,102,111,114,32,109,111,
++ 100,117,108,101,32,99,114,101,97,116,105,111,110,46,78,114,
++ 7,0,0,0,169,2,114,146,0,0,0,114,213,0,0,0,
+ 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,
+- 11,101,120,101,99,95,109,111,100,117,108,101,109,3,0,0,
+- 115,12,0,0,0,12,2,8,1,4,1,8,1,4,255,20,
+- 2,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115,
+- 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0,
+- 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,
+- 0,67,0,0,0,115,12,0,0,0,116,0,160,1,124,0,
+- 124,1,161,2,83,0,41,1,122,26,84,104,105,115,32,109,
+- 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,
+- 116,101,100,46,41,2,114,159,0,0,0,218,17,95,108,111,
+- 97,100,95,109,111,100,117,108,101,95,115,104,105,109,169,2,
+- 114,143,0,0,0,114,163,0,0,0,114,7,0,0,0,114,
+- 7,0,0,0,114,8,0,0,0,218,11,108,111,97,100,95,
+- 109,111,100,117,108,101,117,3,0,0,115,2,0,0,0,12,
+- 3,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115,
+- 46,108,111,97,100,95,109,111,100,117,108,101,78,41,8,114,
+- 150,0,0,0,114,149,0,0,0,114,151,0,0,0,114,152,
+- 0,0,0,114,206,0,0,0,114,239,0,0,0,114,245,0,
+- 0,0,114,248,0,0,0,114,7,0,0,0,114,7,0,0,
+- 0,114,7,0,0,0,114,8,0,0,0,114,235,0,0,0,
+- 93,3,0,0,115,12,0,0,0,8,0,4,2,8,3,8,
+- 8,8,3,12,8,114,235,0,0,0,99,0,0,0,0,0,
+- 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64,
+- 0,0,0,115,74,0,0,0,101,0,90,1,100,0,90,2,
+- 100,1,100,2,132,0,90,3,100,3,100,4,132,0,90,4,
+- 100,5,100,6,132,0,90,5,100,7,100,8,132,0,90,6,
+- 100,9,100,10,132,0,90,7,100,11,100,12,156,1,100,13,
+- 100,14,132,2,90,8,100,15,100,16,132,0,90,9,100,17,
+- 83,0,41,18,218,12,83,111,117,114,99,101,76,111,97,100,
+- 101,114,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
+- 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,
+- 116,0,130,1,41,1,122,165,79,112,116,105,111,110,97,108,
+- 32,109,101,116,104,111,100,32,116,104,97,116,32,114,101,116,
+- 117,114,110,115,32,116,104,101,32,109,111,100,105,102,105,99,
+- 97,116,105,111,110,32,116,105,109,101,32,40,97,110,32,105,
+- 110,116,41,32,102,111,114,32,116,104,101,10,32,32,32,32,
+- 32,32,32,32,115,112,101,99,105,102,105,101,100,32,112,97,
+- 116,104,32,40,97,32,115,116,114,41,46,10,10,32,32,32,
+- 32,32,32,32,32,82,97,105,115,101,115,32,79,83,69,114,
+- 114,111,114,32,119,104,101,110,32,116,104,101,32,112,97,116,
+- 104,32,99,97,110,110,111,116,32,98,101,32,104,97,110,100,
+- 108,101,100,46,10,32,32,32,32,32,32,32,32,41,1,114,
+- 76,0,0,0,169,2,114,143,0,0,0,114,65,0,0,0,
+- 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,
+- 10,112,97,116,104,95,109,116,105,109,101,125,3,0,0,115,
+- 2,0,0,0,4,6,122,23,83,111,117,114,99,101,76,111,
+- 97,100,101,114,46,112,97,116,104,95,109,116,105,109,101,99,
+- 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,
+- 4,0,0,0,67,0,0,0,115,14,0,0,0,100,1,124,
+- 0,160,0,124,1,161,1,105,1,83,0,41,2,97,158,1,
+- 0,0,79,112,116,105,111,110,97,108,32,109,101,116,104,111,
+- 100,32,114,101,116,117,114,110,105,110,103,32,97,32,109,101,
+- 116,97,100,97,116,97,32,100,105,99,116,32,102,111,114,32,
+- 116,104,101,32,115,112,101,99,105,102,105,101,100,10,32,32,
+- 32,32,32,32,32,32,112,97,116,104,32,40,97,32,115,116,
+- 114,41,46,10,10,32,32,32,32,32,32,32,32,80,111,115,
+- 115,105,98,108,101,32,107,101,121,115,58,10,32,32,32,32,
+- 32,32,32,32,45,32,39,109,116,105,109,101,39,32,40,109,
+- 97,110,100,97,116,111,114,121,41,32,105,115,32,116,104,101,
+- 32,110,117,109,101,114,105,99,32,116,105,109,101,115,116,97,
+- 109,112,32,111,102,32,108,97,115,116,32,115,111,117,114,99,
+- 101,10,32,32,32,32,32,32,32,32,32,32,99,111,100,101,
+- 32,109,111,100,105,102,105,99,97,116,105,111,110,59,10,32,
+- 32,32,32,32,32,32,32,45,32,39,115,105,122,101,39,32,
+- 40,111,112,116,105,111,110,97,108,41,32,105,115,32,116,104,
+- 101,32,115,105,122,101,32,105,110,32,98,121,116,101,115,32,
+- 111,102,32,116,104,101,32,115,111,117,114,99,101,32,99,111,
+- 100,101,46,10,10,32,32,32,32,32,32,32,32,73,109,112,
+- 108,101,109,101,110,116,105,110,103,32,116,104,105,115,32,109,
+- 101,116,104,111,100,32,97,108,108,111,119,115,32,116,104,101,
+- 32,108,111,97,100,101,114,32,116,111,32,114,101,97,100,32,
+- 98,121,116,101,99,111,100,101,32,102,105,108,101,115,46,10,
+- 32,32,32,32,32,32,32,32,82,97,105,115,101,115,32,79,
+- 83,69,114,114,111,114,32,119,104,101,110,32,116,104,101,32,
+- 112,97,116,104,32,99,97,110,110,111,116,32,98,101,32,104,
+- 97,110,100,108,101,100,46,10,32,32,32,32,32,32,32,32,
+- 114,193,0,0,0,41,1,114,251,0,0,0,114,250,0,0,
+- 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
+- 218,10,112,97,116,104,95,115,116,97,116,115,133,3,0,0,
+- 115,2,0,0,0,14,12,122,23,83,111,117,114,99,101,76,
+- 111,97,100,101,114,46,112,97,116,104,95,115,116,97,116,115,
+- 99,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
+- 0,4,0,0,0,67,0,0,0,115,12,0,0,0,124,0,
+- 160,0,124,2,124,3,161,2,83,0,41,1,122,228,79,112,
+- 116,105,111,110,97,108,32,109,101,116,104,111,100,32,119,104,
+- 105,99,104,32,119,114,105,116,101,115,32,100,97,116,97,32,
+- 40,98,121,116,101,115,41,32,116,111,32,97,32,102,105,108,
+- 101,32,112,97,116,104,32,40,97,32,115,116,114,41,46,10,
+- 10,32,32,32,32,32,32,32,32,73,109,112,108,101,109,101,
+- 110,116,105,110,103,32,116,104,105,115,32,109,101,116,104,111,
+- 100,32,97,108,108,111,119,115,32,102,111,114,32,116,104,101,
+- 32,119,114,105,116,105,110,103,32,111,102,32,98,121,116,101,
+- 99,111,100,101,32,102,105,108,101,115,46,10,10,32,32,32,
+- 32,32,32,32,32,84,104,101,32,115,111,117,114,99,101,32,
+- 112,97,116,104,32,105,115,32,110,101,101,100,101,100,32,105,
+- 110,32,111,114,100,101,114,32,116,111,32,99,111,114,114,101,
+- 99,116,108,121,32,116,114,97,110,115,102,101,114,32,112,101,
+- 114,109,105,115,115,105,111,110,115,10,32,32,32,32,32,32,
+- 32,32,41,1,218,8,115,101,116,95,100,97,116,97,41,4,
+- 114,143,0,0,0,114,134,0,0,0,90,10,99,97,99,104,
+- 101,95,112,97,116,104,114,41,0,0,0,114,7,0,0,0,
+- 114,7,0,0,0,114,8,0,0,0,218,15,95,99,97,99,
+- 104,101,95,98,121,116,101,99,111,100,101,147,3,0,0,115,
+- 2,0,0,0,12,8,122,28,83,111,117,114,99,101,76,111,
+- 97,100,101,114,46,95,99,97,99,104,101,95,98,121,116,101,
+- 99,111,100,101,99,3,0,0,0,0,0,0,0,0,0,0,
+- 0,3,0,0,0,1,0,0,0,67,0,0,0,114,23,0,
+- 0,0,41,2,122,150,79,112,116,105,111,110,97,108,32,109,
+- 101,116,104,111,100,32,119,104,105,99,104,32,119,114,105,116,
+- 101,115,32,100,97,116,97,32,40,98,121,116,101,115,41,32,
+- 116,111,32,97,32,102,105,108,101,32,112,97,116,104,32,40,
++ 13,99,114,101,97,116,101,95,109,111,100,117,108,101,106,3,
++ 0,0,243,2,0,0,0,4,0,122,27,95,76,111,97,100,
++ 101,114,66,97,115,105,99,115,46,99,114,101,97,116,101,95,
++ 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,
++ 0,0,0,3,0,0,0,5,0,0,0,67,0,0,0,115,
++ 56,0,0,0,124,0,160,0,124,1,106,1,161,1,125,2,
++ 124,2,100,1,117,0,114,18,116,2,100,2,160,3,124,1,
++ 106,1,161,1,131,1,130,1,116,4,160,5,116,6,124,2,
++ 124,1,106,7,161,3,1,0,100,1,83,0,41,3,122,19,
++ 69,120,101,99,117,116,101,32,116,104,101,32,109,111,100,117,
++ 108,101,46,78,122,52,99,97,110,110,111,116,32,108,111,97,
++ 100,32,109,111,100,117,108,101,32,123,33,114,125,32,119,104,
++ 101,110,32,103,101,116,95,99,111,100,101,40,41,32,114,101,
++ 116,117,114,110,115,32,78,111,110,101,41,8,218,8,103,101,
++ 116,95,99,111,100,101,114,153,0,0,0,114,145,0,0,0,
++ 114,92,0,0,0,114,162,0,0,0,218,25,95,99,97,108,
++ 108,95,119,105,116,104,95,102,114,97,109,101,115,95,114,101,
++ 109,111,118,101,100,218,4,101,120,101,99,114,159,0,0,0,
++ 41,3,114,146,0,0,0,218,6,109,111,100,117,108,101,114,
++ 191,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
++ 0,0,0,218,11,101,120,101,99,95,109,111,100,117,108,101,
++ 109,3,0,0,115,12,0,0,0,12,2,8,1,4,1,8,
++ 1,4,255,20,2,122,25,95,76,111,97,100,101,114,66,97,
++ 115,105,99,115,46,101,120,101,99,95,109,111,100,117,108,101,
++ 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
++ 0,4,0,0,0,67,0,0,0,115,12,0,0,0,116,0,
++ 160,1,124,0,124,1,161,2,83,0,41,1,122,26,84,104,
++ 105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,
++ 114,101,99,97,116,101,100,46,41,2,114,162,0,0,0,218,
++ 17,95,108,111,97,100,95,109,111,100,117,108,101,95,115,104,
++ 105,109,169,2,114,146,0,0,0,114,166,0,0,0,114,7,
++ 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,108,
++ 111,97,100,95,109,111,100,117,108,101,117,3,0,0,115,2,
++ 0,0,0,12,3,122,25,95,76,111,97,100,101,114,66,97,
++ 115,105,99,115,46,108,111,97,100,95,109,111,100,117,108,101,
++ 78,41,8,114,153,0,0,0,114,152,0,0,0,114,154,0,
++ 0,0,114,155,0,0,0,114,209,0,0,0,114,242,0,0,
++ 0,114,248,0,0,0,114,251,0,0,0,114,7,0,0,0,
++ 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
++ 238,0,0,0,93,3,0,0,115,12,0,0,0,8,0,4,
++ 2,8,3,8,8,8,3,12,8,114,238,0,0,0,99,0,
++ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,
++ 0,0,0,64,0,0,0,115,74,0,0,0,101,0,90,1,
++ 100,0,90,2,100,1,100,2,132,0,90,3,100,3,100,4,
++ 132,0,90,4,100,5,100,6,132,0,90,5,100,7,100,8,
++ 132,0,90,6,100,9,100,10,132,0,90,7,100,11,100,12,
++ 156,1,100,13,100,14,132,2,90,8,100,15,100,16,132,0,
++ 90,9,100,17,83,0,41,18,218,12,83,111,117,114,99,101,
++ 76,111,97,100,101,114,99,2,0,0,0,0,0,0,0,0,
++ 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,
++ 4,0,0,0,116,0,130,1,41,1,122,165,79,112,116,105,
++ 111,110,97,108,32,109,101,116,104,111,100,32,116,104,97,116,
++ 32,114,101,116,117,114,110,115,32,116,104,101,32,109,111,100,
++ 105,102,105,99,97,116,105,111,110,32,116,105,109,101,32,40,
++ 97,110,32,105,110,116,41,32,102,111,114,32,116,104,101,10,
++ 32,32,32,32,32,32,32,32,115,112,101,99,105,102,105,101,
++ 100,32,112,97,116,104,32,40,97,32,115,116,114,41,46,10,
++ 10,32,32,32,32,32,32,32,32,82,97,105,115,101,115,32,
++ 79,83,69,114,114,111,114,32,119,104,101,110,32,116,104,101,
++ 32,112,97,116,104,32,99,97,110,110,111,116,32,98,101,32,
++ 104,97,110,100,108,101,100,46,10,32,32,32,32,32,32,32,
++ 32,41,1,114,79,0,0,0,169,2,114,146,0,0,0,114,
++ 68,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
++ 0,0,0,218,10,112,97,116,104,95,109,116,105,109,101,125,
++ 3,0,0,115,2,0,0,0,4,6,122,23,83,111,117,114,
++ 99,101,76,111,97,100,101,114,46,112,97,116,104,95,109,116,
++ 105,109,101,99,2,0,0,0,0,0,0,0,0,0,0,0,
++ 2,0,0,0,4,0,0,0,67,0,0,0,115,14,0,0,
++ 0,100,1,124,0,160,0,124,1,161,1,105,1,83,0,41,
++ 2,97,158,1,0,0,79,112,116,105,111,110,97,108,32,109,
++ 101,116,104,111,100,32,114,101,116,117,114,110,105,110,103,32,
++ 97,32,109,101,116,97,100,97,116,97,32,100,105,99,116,32,
++ 102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,
++ 100,10,32,32,32,32,32,32,32,32,112,97,116,104,32,40,
+ 97,32,115,116,114,41,46,10,10,32,32,32,32,32,32,32,
++ 32,80,111,115,115,105,98,108,101,32,107,101,121,115,58,10,
++ 32,32,32,32,32,32,32,32,45,32,39,109,116,105,109,101,
++ 39,32,40,109,97,110,100,97,116,111,114,121,41,32,105,115,
++ 32,116,104,101,32,110,117,109,101,114,105,99,32,116,105,109,
++ 101,115,116,97,109,112,32,111,102,32,108,97,115,116,32,115,
++ 111,117,114,99,101,10,32,32,32,32,32,32,32,32,32,32,
++ 99,111,100,101,32,109,111,100,105,102,105,99,97,116,105,111,
++ 110,59,10,32,32,32,32,32,32,32,32,45,32,39,115,105,
++ 122,101,39,32,40,111,112,116,105,111,110,97,108,41,32,105,
++ 115,32,116,104,101,32,115,105,122,101,32,105,110,32,98,121,
++ 116,101,115,32,111,102,32,116,104,101,32,115,111,117,114,99,
++ 101,32,99,111,100,101,46,10,10,32,32,32,32,32,32,32,
+ 32,73,109,112,108,101,109,101,110,116,105,110,103,32,116,104,
+ 105,115,32,109,101,116,104,111,100,32,97,108,108,111,119,115,
+- 32,102,111,114,32,116,104,101,32,119,114,105,116,105,110,103,
+- 32,111,102,32,98,121,116,101,99,111,100,101,32,102,105,108,
+- 101,115,46,10,32,32,32,32,32,32,32,32,78,114,7,0,
+- 0,0,41,3,114,143,0,0,0,114,65,0,0,0,114,41,
+- 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
+- 0,0,114,253,0,0,0,157,3,0,0,114,240,0,0,0,
+- 122,21,83,111,117,114,99,101,76,111,97,100,101,114,46,115,
+- 101,116,95,100,97,116,97,99,2,0,0,0,0,0,0,0,
+- 0,0,0,0,5,0,0,0,10,0,0,0,67,0,0,0,
+- 115,70,0,0,0,124,0,160,0,124,1,161,1,125,2,122,
+- 10,124,0,160,1,124,2,161,1,125,3,87,0,116,4,124,
+- 3,131,1,83,0,4,0,116,2,121,34,1,0,125,4,1,
+- 0,122,7,116,3,100,1,124,1,100,2,141,2,124,4,130,
+- 2,100,3,125,4,126,4,119,1,119,0,41,4,122,52,67,
+- 111,110,99,114,101,116,101,32,105,109,112,108,101,109,101,110,
+- 116,97,116,105,111,110,32,111,102,32,73,110,115,112,101,99,
+- 116,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,
+- 99,101,46,122,39,115,111,117,114,99,101,32,110,111,116,32,
+- 97,118,97,105,108,97,98,108,101,32,116,104,114,111,117,103,
+- 104,32,103,101,116,95,100,97,116,97,40,41,114,140,0,0,
+- 0,78,41,5,114,203,0,0,0,218,8,103,101,116,95,100,
+- 97,116,97,114,76,0,0,0,114,142,0,0,0,114,200,0,
+- 0,0,41,5,114,143,0,0,0,114,163,0,0,0,114,65,
+- 0,0,0,114,198,0,0,0,218,3,101,120,99,114,7,0,
+- 0,0,114,7,0,0,0,114,8,0,0,0,218,10,103,101,
+- 116,95,115,111,117,114,99,101,164,3,0,0,115,24,0,0,
+- 0,10,2,2,1,12,1,8,4,14,253,4,1,2,1,4,
+- 255,2,1,2,255,8,128,2,255,122,23,83,111,117,114,99,
+- 101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,
+- 99,101,114,130,0,0,0,41,1,218,9,95,111,112,116,105,
+- 109,105,122,101,99,3,0,0,0,0,0,0,0,1,0,0,
+- 0,4,0,0,0,8,0,0,0,67,0,0,0,115,22,0,
+- 0,0,116,0,106,1,116,2,124,1,124,2,100,1,100,2,
+- 124,3,100,3,141,6,83,0,41,4,122,130,82,101,116,117,
+- 114,110,32,116,104,101,32,99,111,100,101,32,111,98,106,101,
+- 99,116,32,99,111,109,112,105,108,101,100,32,102,114,111,109,
+- 32,115,111,117,114,99,101,46,10,10,32,32,32,32,32,32,
+- 32,32,84,104,101,32,39,100,97,116,97,39,32,97,114,103,
+- 117,109,101,110,116,32,99,97,110,32,98,101,32,97,110,121,
+- 32,111,98,106,101,99,116,32,116,121,112,101,32,116,104,97,
+- 116,32,99,111,109,112,105,108,101,40,41,32,115,117,112,112,
+- 111,114,116,115,46,10,32,32,32,32,32,32,32,32,114,243,
+- 0,0,0,84,41,2,218,12,100,111,110,116,95,105,110,104,
+- 101,114,105,116,114,108,0,0,0,41,3,114,159,0,0,0,
+- 114,242,0,0,0,218,7,99,111,109,112,105,108,101,41,4,
+- 114,143,0,0,0,114,41,0,0,0,114,65,0,0,0,114,
+- 2,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
+- 0,0,0,218,14,115,111,117,114,99,101,95,116,111,95,99,
+- 111,100,101,174,3,0,0,115,6,0,0,0,12,5,4,1,
+- 6,255,122,27,83,111,117,114,99,101,76,111,97,100,101,114,
+- 46,115,111,117,114,99,101,95,116,111,95,99,111,100,101,99,
+- 2,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,
+- 9,0,0,0,67,0,0,0,115,2,2,0,0,124,0,160,
+- 0,124,1,161,1,125,2,100,1,125,3,100,1,125,4,100,
+- 1,125,5,100,2,125,6,100,3,125,7,122,6,116,1,124,
+- 2,131,1,125,8,87,0,110,11,4,0,116,2,121,32,1,
+- 0,1,0,1,0,100,1,125,8,89,0,110,144,119,0,122,
+- 7,124,0,160,3,124,2,161,1,125,9,87,0,110,9,4,
+- 0,116,4,121,49,1,0,1,0,1,0,89,0,110,127,119,
+- 0,116,5,124,9,100,4,25,0,131,1,125,3,122,7,124,
+- 0,160,6,124,8,161,1,125,10,87,0,110,9,4,0,116,
+- 4,121,72,1,0,1,0,1,0,89,0,110,104,119,0,124,
+- 1,124,8,100,5,156,2,125,11,122,71,116,7,124,10,124,
+- 1,124,11,131,3,125,12,116,8,124,10,131,1,100,6,100,
+- 1,133,2,25,0,125,13,124,12,100,7,64,0,100,8,107,
+- 3,125,6,124,6,114,138,124,12,100,9,64,0,100,8,107,
+- 3,125,7,116,9,106,10,100,10,107,3,114,137,124,7,115,
+- 119,116,9,106,10,100,11,107,2,114,137,124,0,160,6,124,
+- 2,161,1,125,4,116,9,160,11,116,12,124,4,161,2,125,
+- 5,116,13,124,10,124,5,124,1,124,11,131,4,1,0,110,
+- 10,116,14,124,10,124,3,124,9,100,12,25,0,124,1,124,
+- 11,131,5,1,0,87,0,110,11,4,0,116,15,116,16,102,
+- 2,121,160,1,0,1,0,1,0,89,0,110,16,119,0,116,
+- 17,160,18,100,13,124,8,124,2,161,3,1,0,116,19,124,
+- 13,124,1,124,8,124,2,100,14,141,4,83,0,124,4,100,
+- 1,117,0,114,185,124,0,160,6,124,2,161,1,125,4,124,
+- 0,160,20,124,4,124,2,161,2,125,14,116,17,160,18,100,
+- 15,124,2,161,2,1,0,116,21,106,22,115,255,124,8,100,
+- 1,117,1,114,255,124,3,100,1,117,1,114,255,124,6,114,
+- 226,124,5,100,1,117,0,114,219,116,9,160,11,124,4,161,
+- 1,125,5,116,23,124,14,124,5,124,7,131,3,125,10,110,
+- 8,116,24,124,14,124,3,116,25,124,4,131,1,131,3,125,
+- 10,122,10,124,0,160,26,124,2,124,8,124,10,161,3,1,
+- 0,87,0,124,14,83,0,4,0,116,2,121,254,1,0,1,
+- 0,1,0,89,0,124,14,83,0,119,0,124,14,83,0,41,
+- 16,122,190,67,111,110,99,114,101,116,101,32,105,109,112,108,
++ 32,116,104,101,32,108,111,97,100,101,114,32,116,111,32,114,
++ 101,97,100,32,98,121,116,101,99,111,100,101,32,102,105,108,
++ 101,115,46,10,32,32,32,32,32,32,32,32,82,97,105,115,
++ 101,115,32,79,83,69,114,114,111,114,32,119,104,101,110,32,
++ 116,104,101,32,112,97,116,104,32,99,97,110,110,111,116,32,
++ 98,101,32,104,97,110,100,108,101,100,46,10,32,32,32,32,
++ 32,32,32,32,114,196,0,0,0,41,1,114,254,0,0,0,
++ 114,253,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
++ 8,0,0,0,218,10,112,97,116,104,95,115,116,97,116,115,
++ 133,3,0,0,115,2,0,0,0,14,12,122,23,83,111,117,
++ 114,99,101,76,111,97,100,101,114,46,112,97,116,104,95,115,
++ 116,97,116,115,99,4,0,0,0,0,0,0,0,0,0,0,
++ 0,4,0,0,0,4,0,0,0,67,0,0,0,115,12,0,
++ 0,0,124,0,160,0,124,2,124,3,161,2,83,0,41,1,
++ 122,228,79,112,116,105,111,110,97,108,32,109,101,116,104,111,
++ 100,32,119,104,105,99,104,32,119,114,105,116,101,115,32,100,
++ 97,116,97,32,40,98,121,116,101,115,41,32,116,111,32,97,
++ 32,102,105,108,101,32,112,97,116,104,32,40,97,32,115,116,
++ 114,41,46,10,10,32,32,32,32,32,32,32,32,73,109,112,
++ 108,101,109,101,110,116,105,110,103,32,116,104,105,115,32,109,
++ 101,116,104,111,100,32,97,108,108,111,119,115,32,102,111,114,
++ 32,116,104,101,32,119,114,105,116,105,110,103,32,111,102,32,
++ 98,121,116,101,99,111,100,101,32,102,105,108,101,115,46,10,
++ 10,32,32,32,32,32,32,32,32,84,104,101,32,115,111,117,
++ 114,99,101,32,112,97,116,104,32,105,115,32,110,101,101,100,
++ 101,100,32,105,110,32,111,114,100,101,114,32,116,111,32,99,
++ 111,114,114,101,99,116,108,121,32,116,114,97,110,115,102,101,
++ 114,32,112,101,114,109,105,115,115,105,111,110,115,10,32,32,
++ 32,32,32,32,32,32,41,1,218,8,115,101,116,95,100,97,
++ 116,97,41,4,114,146,0,0,0,114,137,0,0,0,90,10,
++ 99,97,99,104,101,95,112,97,116,104,114,44,0,0,0,114,
++ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,15,
++ 95,99,97,99,104,101,95,98,121,116,101,99,111,100,101,147,
++ 3,0,0,115,2,0,0,0,12,8,122,28,83,111,117,114,
++ 99,101,76,111,97,100,101,114,46,95,99,97,99,104,101,95,
++ 98,121,116,101,99,111,100,101,99,3,0,0,0,0,0,0,
++ 0,0,0,0,0,3,0,0,0,1,0,0,0,67,0,0,
++ 0,114,26,0,0,0,41,2,122,150,79,112,116,105,111,110,
++ 97,108,32,109,101,116,104,111,100,32,119,104,105,99,104,32,
++ 119,114,105,116,101,115,32,100,97,116,97,32,40,98,121,116,
++ 101,115,41,32,116,111,32,97,32,102,105,108,101,32,112,97,
++ 116,104,32,40,97,32,115,116,114,41,46,10,10,32,32,32,
++ 32,32,32,32,32,73,109,112,108,101,109,101,110,116,105,110,
++ 103,32,116,104,105,115,32,109,101,116,104,111,100,32,97,108,
++ 108,111,119,115,32,102,111,114,32,116,104,101,32,119,114,105,
++ 116,105,110,103,32,111,102,32,98,121,116,101,99,111,100,101,
++ 32,102,105,108,101,115,46,10,32,32,32,32,32,32,32,32,
++ 78,114,7,0,0,0,41,3,114,146,0,0,0,114,68,0,
++ 0,0,114,44,0,0,0,114,7,0,0,0,114,7,0,0,
++ 0,114,8,0,0,0,114,0,1,0,0,157,3,0,0,114,
++ 243,0,0,0,122,21,83,111,117,114,99,101,76,111,97,100,
++ 101,114,46,115,101,116,95,100,97,116,97,99,2,0,0,0,
++ 0,0,0,0,0,0,0,0,5,0,0,0,10,0,0,0,
++ 67,0,0,0,115,70,0,0,0,124,0,160,0,124,1,161,
++ 1,125,2,122,10,124,0,160,1,124,2,161,1,125,3,87,
++ 0,116,4,124,3,131,1,83,0,4,0,116,2,121,34,1,
++ 0,125,4,1,0,122,7,116,3,100,1,124,1,100,2,141,
++ 2,124,4,130,2,100,3,125,4,126,4,119,1,119,0,41,
++ 4,122,52,67,111,110,99,114,101,116,101,32,105,109,112,108,
+ 101,109,101,110,116,97,116,105,111,110,32,111,102,32,73,110,
+ 115,112,101,99,116,76,111,97,100,101,114,46,103,101,116,95,
+- 99,111,100,101,46,10,10,32,32,32,32,32,32,32,32,82,
+- 101,97,100,105,110,103,32,111,102,32,98,121,116,101,99,111,
+- 100,101,32,114,101,113,117,105,114,101,115,32,112,97,116,104,
+- 95,115,116,97,116,115,32,116,111,32,98,101,32,105,109,112,
+- 108,101,109,101,110,116,101,100,46,32,84,111,32,119,114,105,
+- 116,101,10,32,32,32,32,32,32,32,32,98,121,116,101,99,
+- 111,100,101,44,32,115,101,116,95,100,97,116,97,32,109,117,
+- 115,116,32,97,108,115,111,32,98,101,32,105,109,112,108,101,
+- 109,101,110,116,101,100,46,10,10,32,32,32,32,32,32,32,
+- 32,78,70,84,114,193,0,0,0,114,183,0,0,0,114,169,
+- 0,0,0,114,3,0,0,0,114,0,0,0,0,114,44,0,
+- 0,0,90,5,110,101,118,101,114,90,6,97,108,119,97,121,
+- 115,218,4,115,105,122,101,122,13,123,125,32,109,97,116,99,
+- 104,101,115,32,123,125,41,3,114,141,0,0,0,114,132,0,
+- 0,0,114,134,0,0,0,122,19,99,111,100,101,32,111,98,
+- 106,101,99,116,32,102,114,111,109,32,123,125,41,27,114,203,
+- 0,0,0,114,121,0,0,0,114,107,0,0,0,114,252,0,
+- 0,0,114,76,0,0,0,114,33,0,0,0,114,255,0,0,
+- 0,114,176,0,0,0,218,10,109,101,109,111,114,121,118,105,
+- 101,119,114,187,0,0,0,90,21,99,104,101,99,107,95,104,
+- 97,115,104,95,98,97,115,101,100,95,112,121,99,115,114,181,
+- 0,0,0,218,17,95,82,65,87,95,77,65,71,73,67,95,
+- 78,85,77,66,69,82,114,182,0,0,0,114,180,0,0,0,
+- 114,142,0,0,0,114,174,0,0,0,114,159,0,0,0,114,
+- 173,0,0,0,114,189,0,0,0,114,5,1,0,0,114,15,
+- 0,0,0,218,19,100,111,110,116,95,119,114,105,116,101,95,
+- 98,121,116,101,99,111,100,101,114,195,0,0,0,114,194,0,
+- 0,0,114,4,0,0,0,114,254,0,0,0,41,15,114,143,
+- 0,0,0,114,163,0,0,0,114,134,0,0,0,114,178,0,
+- 0,0,114,198,0,0,0,114,181,0,0,0,90,10,104,97,
+- 115,104,95,98,97,115,101,100,90,12,99,104,101,99,107,95,
+- 115,111,117,114,99,101,114,132,0,0,0,218,2,115,116,114,
+- 41,0,0,0,114,175,0,0,0,114,16,0,0,0,90,10,
+- 98,121,116,101,115,95,100,97,116,97,90,11,99,111,100,101,
+- 95,111,98,106,101,99,116,114,7,0,0,0,114,7,0,0,
+- 0,114,8,0,0,0,114,241,0,0,0,182,3,0,0,115,
+- 166,0,0,0,10,7,4,1,4,1,4,1,4,1,4,1,
+- 2,1,12,1,12,1,8,1,2,255,2,3,14,1,12,1,
+- 4,1,2,255,12,3,2,1,14,1,12,1,4,1,2,255,
+- 2,4,2,1,6,254,2,4,12,1,16,1,12,1,4,1,
+- 12,1,10,1,2,1,2,255,10,2,10,1,4,1,2,1,
+- 2,1,4,254,8,4,2,1,4,255,2,128,2,3,2,1,
+- 2,1,6,1,2,1,2,1,4,251,4,128,16,7,4,1,
+- 2,255,8,3,2,1,4,255,6,2,2,1,2,1,6,254,
+- 8,3,10,1,12,1,12,1,14,1,8,1,4,1,8,1,
+- 10,1,14,1,6,2,6,1,4,255,2,2,16,1,4,3,
+- 12,254,2,1,4,1,2,254,4,2,122,21,83,111,117,114,
+- 99,101,76,111,97,100,101,114,46,103,101,116,95,99,111,100,
+- 101,78,41,10,114,150,0,0,0,114,149,0,0,0,114,151,
+- 0,0,0,114,251,0,0,0,114,252,0,0,0,114,254,0,
+- 0,0,114,253,0,0,0,114,1,1,0,0,114,5,1,0,
+- 0,114,241,0,0,0,114,7,0,0,0,114,7,0,0,0,
+- 114,7,0,0,0,114,8,0,0,0,114,249,0,0,0,123,
+- 3,0,0,115,16,0,0,0,8,0,8,2,8,8,8,14,
+- 8,10,8,7,14,10,12,8,114,249,0,0,0,99,0,0,
+- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,
+- 0,0,0,0,0,0,115,92,0,0,0,101,0,90,1,100,
+- 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,
+- 4,100,5,132,0,90,5,100,6,100,7,132,0,90,6,101,
+- 7,135,0,102,1,100,8,100,9,132,8,131,1,90,8,101,
+- 7,100,10,100,11,132,0,131,1,90,9,100,12,100,13,132,
+- 0,90,10,101,7,100,14,100,15,132,0,131,1,90,11,135,
+- 0,4,0,90,12,83,0,41,16,218,10,70,105,108,101,76,
+- 111,97,100,101,114,122,103,66,97,115,101,32,102,105,108,101,
+- 32,108,111,97,100,101,114,32,99,108,97,115,115,32,119,104,
+- 105,99,104,32,105,109,112,108,101,109,101,110,116,115,32,116,
+- 104,101,32,108,111,97,100,101,114,32,112,114,111,116,111,99,
+- 111,108,32,109,101,116,104,111,100,115,32,116,104,97,116,10,
+- 32,32,32,32,114,101,113,117,105,114,101,32,102,105,108,101,
+- 32,115,121,115,116,101,109,32,117,115,97,103,101,46,99,3,
+- 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,
+- 0,0,0,67,0,0,0,115,16,0,0,0,124,1,124,0,
+- 95,0,124,2,124,0,95,1,100,1,83,0,41,2,122,75,
+- 67,97,99,104,101,32,116,104,101,32,109,111,100,117,108,101,
+- 32,110,97,109,101,32,97,110,100,32,116,104,101,32,112,97,
+- 116,104,32,116,111,32,116,104,101,32,102,105,108,101,32,102,
+- 111,117,110,100,32,98,121,32,116,104,101,10,32,32,32,32,
+- 32,32,32,32,102,105,110,100,101,114,46,78,114,183,0,0,
+- 0,41,3,114,143,0,0,0,114,163,0,0,0,114,65,0,
+- 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
+- 0,114,236,0,0,0,16,4,0,0,115,4,0,0,0,6,
+- 3,10,1,122,19,70,105,108,101,76,111,97,100,101,114,46,
+- 95,95,105,110,105,116,95,95,99,2,0,0,0,0,0,0,
+- 0,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,
+- 0,243,24,0,0,0,124,0,106,0,124,1,106,0,107,2,
+- 111,11,124,0,106,1,124,1,106,1,107,2,83,0,114,69,
+- 0,0,0,169,2,218,9,95,95,99,108,97,115,115,95,95,
+- 114,156,0,0,0,169,2,114,143,0,0,0,90,5,111,116,
+- 104,101,114,114,7,0,0,0,114,7,0,0,0,114,8,0,
+- 0,0,218,6,95,95,101,113,95,95,22,4,0,0,243,6,
+- 0,0,0,12,1,10,1,2,255,122,17,70,105,108,101,76,
+- 111,97,100,101,114,46,95,95,101,113,95,95,99,1,0,0,
+- 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,
+- 0,67,0,0,0,243,20,0,0,0,116,0,124,0,106,1,
+- 131,1,116,0,124,0,106,2,131,1,65,0,83,0,114,69,
+- 0,0,0,169,3,218,4,104,97,115,104,114,141,0,0,0,
+- 114,65,0,0,0,169,1,114,143,0,0,0,114,7,0,0,
+- 0,114,7,0,0,0,114,8,0,0,0,218,8,95,95,104,
+- 97,115,104,95,95,26,4,0,0,243,2,0,0,0,20,1,
+- 122,19,70,105,108,101,76,111,97,100,101,114,46,95,95,104,
+- 97,115,104,95,95,99,2,0,0,0,0,0,0,0,0,0,
+- 0,0,2,0,0,0,3,0,0,0,3,0,0,0,115,16,
+- 0,0,0,116,0,116,1,124,0,131,2,160,2,124,1,161,
+- 1,83,0,41,1,122,100,76,111,97,100,32,97,32,109,111,
+- 100,117,108,101,32,102,114,111,109,32,97,32,102,105,108,101,
+- 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,
+- 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,
+- 97,116,101,100,46,32,32,85,115,101,32,101,120,101,99,95,
+- 109,111,100,117,108,101,40,41,32,105,110,115,116,101,97,100,
+- 46,10,10,32,32,32,32,32,32,32,32,41,3,218,5,115,
+- 117,112,101,114,114,11,1,0,0,114,248,0,0,0,114,247,
+- 0,0,0,169,1,114,14,1,0,0,114,7,0,0,0,114,
+- 8,0,0,0,114,248,0,0,0,29,4,0,0,115,2,0,
+- 0,0,16,10,122,22,70,105,108,101,76,111,97,100,101,114,
+- 46,108,111,97,100,95,109,111,100,117,108,101,99,2,0,0,
+- 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,
+- 0,67,0,0,0,243,6,0,0,0,124,0,106,0,83,0,
+- 169,1,122,58,82,101,116,117,114,110,32,116,104,101,32,112,
+- 97,116,104,32,116,111,32,116,104,101,32,115,111,117,114,99,
+- 101,32,102,105,108,101,32,97,115,32,102,111,117,110,100,32,
+- 98,121,32,116,104,101,32,102,105,110,100,101,114,46,114,71,
+- 0,0,0,114,247,0,0,0,114,7,0,0,0,114,7,0,
+- 0,0,114,8,0,0,0,114,203,0,0,0,41,4,0,0,
+- 243,2,0,0,0,6,3,122,23,70,105,108,101,76,111,97,
+- 100,101,114,46,103,101,116,95,102,105,108,101,110,97,109,101,
+- 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
+- 0,8,0,0,0,67,0,0,0,115,128,0,0,0,116,0,
+- 124,0,116,1,116,2,102,2,131,2,114,36,116,3,160,4,
+- 116,5,124,1,131,1,161,1,143,12,125,2,124,2,160,6,
+- 161,0,87,0,2,0,100,1,4,0,4,0,131,3,1,0,
+- 83,0,49,0,115,29,119,1,1,0,1,0,1,0,89,0,
+- 1,0,100,1,83,0,116,3,160,7,124,1,100,2,161,2,
+- 143,12,125,2,124,2,160,6,161,0,87,0,2,0,100,1,
+- 4,0,4,0,131,3,1,0,83,0,49,0,115,57,119,1,
+- 1,0,1,0,1,0,89,0,1,0,100,1,83,0,41,3,
+- 122,39,82,101,116,117,114,110,32,116,104,101,32,100,97,116,
+- 97,32,102,114,111,109,32,112,97,116,104,32,97,115,32,114,
+- 97,119,32,98,121,116,101,115,46,78,218,1,114,41,8,114,
+- 185,0,0,0,114,249,0,0,0,218,19,69,120,116,101,110,
+- 115,105,111,110,70,105,108,101,76,111,97,100,101,114,114,91,
+- 0,0,0,90,9,111,112,101,110,95,99,111,100,101,114,109,
+- 0,0,0,90,4,114,101,97,100,114,92,0,0,0,41,3,
+- 114,143,0,0,0,114,65,0,0,0,114,94,0,0,0,114,
+- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,255,
+- 0,0,0,46,4,0,0,115,14,0,0,0,14,2,16,1,
+- 6,1,36,255,14,3,6,1,36,255,122,19,70,105,108,101,
+- 76,111,97,100,101,114,46,103,101,116,95,100,97,116,97,99,
+- 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,
+- 2,0,0,0,67,0,0,0,115,20,0,0,0,100,1,100,
+- 2,108,0,109,1,125,2,1,0,124,2,124,0,131,1,83,
+- 0,41,3,78,114,0,0,0,0,41,1,218,10,70,105,108,
+- 101,82,101,97,100,101,114,41,2,218,17,105,109,112,111,114,
+- 116,108,105,98,46,114,101,97,100,101,114,115,114,31,1,0,
+- 0,41,3,114,143,0,0,0,114,244,0,0,0,114,31,1,
+- 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
+- 0,218,19,103,101,116,95,114,101,115,111,117,114,99,101,95,
+- 114,101,97,100,101,114,55,4,0,0,115,4,0,0,0,12,
+- 2,8,1,122,30,70,105,108,101,76,111,97,100,101,114,46,
+- 103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,
+- 100,101,114,41,13,114,150,0,0,0,114,149,0,0,0,114,
+- 151,0,0,0,114,152,0,0,0,114,236,0,0,0,114,16,
+- 1,0,0,114,22,1,0,0,114,160,0,0,0,114,248,0,
+- 0,0,114,203,0,0,0,114,255,0,0,0,114,33,1,0,
+- 0,90,13,95,95,99,108,97,115,115,99,101,108,108,95,95,
+- 114,7,0,0,0,114,7,0,0,0,114,25,1,0,0,114,
+- 8,0,0,0,114,11,1,0,0,11,4,0,0,115,24,0,
+- 0,0,8,0,4,2,8,3,8,6,8,4,2,3,14,1,
+- 2,11,10,1,8,4,2,9,18,1,114,11,1,0,0,99,
+- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+- 3,0,0,0,64,0,0,0,115,46,0,0,0,101,0,90,
+- 1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,
+- 4,100,4,100,5,132,0,90,5,100,6,100,7,156,1,100,
+- 8,100,9,132,2,90,6,100,10,83,0,41,11,218,16,83,
+- 111,117,114,99,101,70,105,108,101,76,111,97,100,101,114,122,
+- 62,67,111,110,99,114,101,116,101,32,105,109,112,108,101,109,
+- 101,110,116,97,116,105,111,110,32,111,102,32,83,111,117,114,
+- 99,101,76,111,97,100,101,114,32,117,115,105,110,103,32,116,
+- 104,101,32,102,105,108,101,32,115,121,115,116,101,109,46,99,
+- 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,
+- 3,0,0,0,67,0,0,0,115,22,0,0,0,116,0,124,
+- 1,131,1,125,2,124,2,106,1,124,2,106,2,100,1,156,
+- 2,83,0,41,2,122,33,82,101,116,117,114,110,32,116,104,
+- 101,32,109,101,116,97,100,97,116,97,32,102,111,114,32,116,
+- 104,101,32,112,97,116,104,46,41,2,114,193,0,0,0,114,
+- 6,1,0,0,41,3,114,75,0,0,0,218,8,115,116,95,
+- 109,116,105,109,101,90,7,115,116,95,115,105,122,101,41,3,
+- 114,143,0,0,0,114,65,0,0,0,114,10,1,0,0,114,
++ 115,111,117,114,99,101,46,122,39,115,111,117,114,99,101,32,
++ 110,111,116,32,97,118,97,105,108,97,98,108,101,32,116,104,
++ 114,111,117,103,104,32,103,101,116,95,100,97,116,97,40,41,
++ 114,143,0,0,0,78,41,5,114,206,0,0,0,218,8,103,
++ 101,116,95,100,97,116,97,114,79,0,0,0,114,145,0,0,
++ 0,114,203,0,0,0,41,5,114,146,0,0,0,114,166,0,
++ 0,0,114,68,0,0,0,114,201,0,0,0,218,3,101,120,
++ 99,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
++ 218,10,103,101,116,95,115,111,117,114,99,101,164,3,0,0,
++ 115,24,0,0,0,10,2,2,1,12,1,8,4,14,253,4,
++ 1,2,1,4,255,2,1,2,255,8,128,2,255,122,23,83,
++ 111,117,114,99,101,76,111,97,100,101,114,46,103,101,116,95,
++ 115,111,117,114,99,101,114,133,0,0,0,41,1,218,9,95,
++ 111,112,116,105,109,105,122,101,99,3,0,0,0,0,0,0,
++ 0,1,0,0,0,4,0,0,0,8,0,0,0,67,0,0,
++ 0,115,22,0,0,0,116,0,106,1,116,2,124,1,124,2,
++ 100,1,100,2,124,3,100,3,141,6,83,0,41,4,122,130,
++ 82,101,116,117,114,110,32,116,104,101,32,99,111,100,101,32,
++ 111,98,106,101,99,116,32,99,111,109,112,105,108,101,100,32,
++ 102,114,111,109,32,115,111,117,114,99,101,46,10,10,32,32,
++ 32,32,32,32,32,32,84,104,101,32,39,100,97,116,97,39,
++ 32,97,114,103,117,109,101,110,116,32,99,97,110,32,98,101,
++ 32,97,110,121,32,111,98,106,101,99,116,32,116,121,112,101,
++ 32,116,104,97,116,32,99,111,109,112,105,108,101,40,41,32,
++ 115,117,112,112,111,114,116,115,46,10,32,32,32,32,32,32,
++ 32,32,114,246,0,0,0,84,41,2,218,12,100,111,110,116,
++ 95,105,110,104,101,114,105,116,114,111,0,0,0,41,3,114,
++ 162,0,0,0,114,245,0,0,0,218,7,99,111,109,112,105,
++ 108,101,41,4,114,146,0,0,0,114,44,0,0,0,114,68,
++ 0,0,0,114,5,1,0,0,114,7,0,0,0,114,7,0,
++ 0,0,114,8,0,0,0,218,14,115,111,117,114,99,101,95,
++ 116,111,95,99,111,100,101,174,3,0,0,115,6,0,0,0,
++ 12,5,4,1,6,255,122,27,83,111,117,114,99,101,76,111,
++ 97,100,101,114,46,115,111,117,114,99,101,95,116,111,95,99,
++ 111,100,101,99,2,0,0,0,0,0,0,0,0,0,0,0,
++ 15,0,0,0,9,0,0,0,67,0,0,0,115,2,2,0,
++ 0,124,0,160,0,124,1,161,1,125,2,100,1,125,3,100,
++ 1,125,4,100,1,125,5,100,2,125,6,100,3,125,7,122,
++ 6,116,1,124,2,131,1,125,8,87,0,110,11,4,0,116,
++ 2,121,32,1,0,1,0,1,0,100,1,125,8,89,0,110,
++ 144,119,0,122,7,124,0,160,3,124,2,161,1,125,9,87,
++ 0,110,9,4,0,116,4,121,49,1,0,1,0,1,0,89,
++ 0,110,127,119,0,116,5,124,9,100,4,25,0,131,1,125,
++ 3,122,7,124,0,160,6,124,8,161,1,125,10,87,0,110,
++ 9,4,0,116,4,121,72,1,0,1,0,1,0,89,0,110,
++ 104,119,0,124,1,124,8,100,5,156,2,125,11,122,71,116,
++ 7,124,10,124,1,124,11,131,3,125,12,116,8,124,10,131,
++ 1,100,6,100,1,133,2,25,0,125,13,124,12,100,7,64,
++ 0,100,8,107,3,125,6,124,6,114,138,124,12,100,9,64,
++ 0,100,8,107,3,125,7,116,9,106,10,100,10,107,3,114,
++ 137,124,7,115,119,116,9,106,10,100,11,107,2,114,137,124,
++ 0,160,6,124,2,161,1,125,4,116,9,160,11,116,12,124,
++ 4,161,2,125,5,116,13,124,10,124,5,124,1,124,11,131,
++ 4,1,0,110,10,116,14,124,10,124,3,124,9,100,12,25,
++ 0,124,1,124,11,131,5,1,0,87,0,110,11,4,0,116,
++ 15,116,16,102,2,121,160,1,0,1,0,1,0,89,0,110,
++ 16,119,0,116,17,160,18,100,13,124,8,124,2,161,3,1,
++ 0,116,19,124,13,124,1,124,8,124,2,100,14,141,4,83,
++ 0,124,4,100,1,117,0,114,185,124,0,160,6,124,2,161,
++ 1,125,4,124,0,160,20,124,4,124,2,161,2,125,14,116,
++ 17,160,18,100,15,124,2,161,2,1,0,116,21,106,22,115,
++ 255,124,8,100,1,117,1,114,255,124,3,100,1,117,1,114,
++ 255,124,6,114,226,124,5,100,1,117,0,114,219,116,9,160,
++ 11,124,4,161,1,125,5,116,23,124,14,124,5,124,7,131,
++ 3,125,10,110,8,116,24,124,14,124,3,116,25,124,4,131,
++ 1,131,3,125,10,122,10,124,0,160,26,124,2,124,8,124,
++ 10,161,3,1,0,87,0,124,14,83,0,4,0,116,2,121,
++ 254,1,0,1,0,1,0,89,0,124,14,83,0,119,0,124,
++ 14,83,0,41,16,122,190,67,111,110,99,114,101,116,101,32,
++ 105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,
++ 102,32,73,110,115,112,101,99,116,76,111,97,100,101,114,46,
++ 103,101,116,95,99,111,100,101,46,10,10,32,32,32,32,32,
++ 32,32,32,82,101,97,100,105,110,103,32,111,102,32,98,121,
++ 116,101,99,111,100,101,32,114,101,113,117,105,114,101,115,32,
++ 112,97,116,104,95,115,116,97,116,115,32,116,111,32,98,101,
++ 32,105,109,112,108,101,109,101,110,116,101,100,46,32,84,111,
++ 32,119,114,105,116,101,10,32,32,32,32,32,32,32,32,98,
++ 121,116,101,99,111,100,101,44,32,115,101,116,95,100,97,116,
++ 97,32,109,117,115,116,32,97,108,115,111,32,98,101,32,105,
++ 109,112,108,101,109,101,110,116,101,100,46,10,10,32,32,32,
++ 32,32,32,32,32,78,70,84,114,196,0,0,0,114,186,0,
++ 0,0,114,172,0,0,0,114,3,0,0,0,114,0,0,0,
++ 0,114,47,0,0,0,90,5,110,101,118,101,114,90,6,97,
++ 108,119,97,121,115,218,4,115,105,122,101,122,13,123,125,32,
++ 109,97,116,99,104,101,115,32,123,125,41,3,114,144,0,0,
++ 0,114,135,0,0,0,114,137,0,0,0,122,19,99,111,100,
++ 101,32,111,98,106,101,99,116,32,102,114,111,109,32,123,125,
++ 41,27,114,206,0,0,0,114,124,0,0,0,114,110,0,0,
++ 0,114,255,0,0,0,114,79,0,0,0,114,36,0,0,0,
++ 114,2,1,0,0,114,179,0,0,0,218,10,109,101,109,111,
++ 114,121,118,105,101,119,114,190,0,0,0,90,21,99,104,101,
++ 99,107,95,104,97,115,104,95,98,97,115,101,100,95,112,121,
++ 99,115,114,184,0,0,0,218,17,95,82,65,87,95,77,65,
++ 71,73,67,95,78,85,77,66,69,82,114,185,0,0,0,114,
++ 183,0,0,0,114,145,0,0,0,114,177,0,0,0,114,162,
++ 0,0,0,114,176,0,0,0,114,192,0,0,0,114,8,1,
++ 0,0,114,18,0,0,0,218,19,100,111,110,116,95,119,114,
++ 105,116,101,95,98,121,116,101,99,111,100,101,114,198,0,0,
++ 0,114,197,0,0,0,114,4,0,0,0,114,1,1,0,0,
++ 41,15,114,146,0,0,0,114,166,0,0,0,114,137,0,0,
++ 0,114,181,0,0,0,114,201,0,0,0,114,184,0,0,0,
++ 90,10,104,97,115,104,95,98,97,115,101,100,90,12,99,104,
++ 101,99,107,95,115,111,117,114,99,101,114,135,0,0,0,218,
++ 2,115,116,114,44,0,0,0,114,178,0,0,0,114,19,0,
++ 0,0,90,10,98,121,116,101,115,95,100,97,116,97,90,11,
++ 99,111,100,101,95,111,98,106,101,99,116,114,7,0,0,0,
++ 114,7,0,0,0,114,8,0,0,0,114,244,0,0,0,182,
++ 3,0,0,115,166,0,0,0,10,7,4,1,4,1,4,1,
++ 4,1,4,1,2,1,12,1,12,1,8,1,2,255,2,3,
++ 14,1,12,1,4,1,2,255,12,3,2,1,14,1,12,1,
++ 4,1,2,255,2,4,2,1,6,254,2,4,12,1,16,1,
++ 12,1,4,1,12,1,10,1,2,1,2,255,10,2,10,1,
++ 4,1,2,1,2,1,4,254,8,4,2,1,4,255,2,128,
++ 2,3,2,1,2,1,6,1,2,1,2,1,4,251,4,128,
++ 16,7,4,1,2,255,8,3,2,1,4,255,6,2,2,1,
++ 2,1,6,254,8,3,10,1,12,1,12,1,14,1,8,1,
++ 4,1,8,1,10,1,14,1,6,2,6,1,4,255,2,2,
++ 16,1,4,3,12,254,2,1,4,1,2,254,4,2,122,21,
++ 83,111,117,114,99,101,76,111,97,100,101,114,46,103,101,116,
++ 95,99,111,100,101,78,41,10,114,153,0,0,0,114,152,0,
++ 0,0,114,154,0,0,0,114,254,0,0,0,114,255,0,0,
++ 0,114,1,1,0,0,114,0,1,0,0,114,4,1,0,0,
++ 114,8,1,0,0,114,244,0,0,0,114,7,0,0,0,114,
+ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,252,
+- 0,0,0,65,4,0,0,115,4,0,0,0,8,2,14,1,
+- 122,27,83,111,117,114,99,101,70,105,108,101,76,111,97,100,
+- 101,114,46,112,97,116,104,95,115,116,97,116,115,99,4,0,
+- 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,
+- 0,0,67,0,0,0,115,24,0,0,0,116,0,124,1,131,
+- 1,125,4,124,0,106,1,124,2,124,3,124,4,100,1,141,
+- 3,83,0,41,2,78,169,1,218,5,95,109,111,100,101,41,
+- 2,114,139,0,0,0,114,253,0,0,0,41,5,114,143,0,
+- 0,0,114,134,0,0,0,114,132,0,0,0,114,41,0,0,
+- 0,114,78,0,0,0,114,7,0,0,0,114,7,0,0,0,
+- 114,8,0,0,0,114,254,0,0,0,70,4,0,0,115,4,
+- 0,0,0,8,2,16,1,122,32,83,111,117,114,99,101,70,
+- 105,108,101,76,111,97,100,101,114,46,95,99,97,99,104,101,
+- 95,98,121,116,101,99,111,100,101,114,87,0,0,0,114,36,
+- 1,0,0,99,3,0,0,0,0,0,0,0,1,0,0,0,
+- 9,0,0,0,11,0,0,0,67,0,0,0,115,254,0,0,
+- 0,116,0,124,1,131,1,92,2,125,4,125,5,103,0,125,
+- 6,124,4,114,31,116,1,124,4,131,1,115,31,116,0,124,
+- 4,131,1,92,2,125,4,125,7,124,6,160,2,124,7,161,
+- 1,1,0,124,4,114,31,116,1,124,4,131,1,114,14,116,
+- 3,124,6,131,1,68,0,93,49,125,7,116,4,124,4,124,
+- 7,131,2,125,4,122,7,116,5,160,6,124,4,161,1,1,
+- 0,87,0,113,35,4,0,116,7,121,58,1,0,1,0,1,
+- 0,89,0,113,35,4,0,116,8,121,84,1,0,125,8,1,
+- 0,122,15,116,9,160,10,100,1,124,4,124,8,161,3,1,
+- 0,87,0,89,0,100,2,125,8,126,8,1,0,100,2,83,
+- 0,100,2,125,8,126,8,119,1,119,0,122,15,116,11,124,
+- 1,124,2,124,3,131,3,1,0,116,9,160,10,100,3,124,
+- 1,161,2,1,0,87,0,100,2,83,0,4,0,116,8,121,
+- 126,1,0,125,8,1,0,122,14,116,9,160,10,100,1,124,
+- 1,124,8,161,3,1,0,87,0,89,0,100,2,125,8,126,
+- 8,100,2,83,0,100,2,125,8,126,8,119,1,119,0,41,
+- 4,122,27,87,114,105,116,101,32,98,121,116,101,115,32,100,
+- 97,116,97,32,116,111,32,97,32,102,105,108,101,46,122,27,
+- 99,111,117,108,100,32,110,111,116,32,99,114,101,97,116,101,
+- 32,123,33,114,125,58,32,123,33,114,125,78,122,12,99,114,
+- 101,97,116,101,100,32,123,33,114,125,41,12,114,74,0,0,
+- 0,114,83,0,0,0,114,61,0,0,0,218,8,114,101,118,
+- 101,114,115,101,100,114,67,0,0,0,114,18,0,0,0,90,
+- 5,109,107,100,105,114,218,15,70,105,108,101,69,120,105,115,
+- 116,115,69,114,114,111,114,114,76,0,0,0,114,159,0,0,
+- 0,114,173,0,0,0,114,95,0,0,0,41,9,114,143,0,
+- 0,0,114,65,0,0,0,114,41,0,0,0,114,37,1,0,
+- 0,218,6,112,97,114,101,110,116,114,120,0,0,0,114,63,
+- 0,0,0,114,68,0,0,0,114,0,1,0,0,114,7,0,
+- 0,0,114,7,0,0,0,114,8,0,0,0,114,253,0,0,
+- 0,75,4,0,0,115,56,0,0,0,12,2,4,1,12,2,
+- 12,1,10,1,12,254,12,4,10,1,2,1,14,1,12,1,
+- 4,2,14,1,6,3,4,1,4,255,16,2,8,128,2,251,
+- 2,6,12,1,18,1,14,1,8,2,2,1,18,255,8,128,
+- 2,254,122,25,83,111,117,114,99,101,70,105,108,101,76,111,
+- 97,100,101,114,46,115,101,116,95,100,97,116,97,78,41,7,
+- 114,150,0,0,0,114,149,0,0,0,114,151,0,0,0,114,
+- 152,0,0,0,114,252,0,0,0,114,254,0,0,0,114,253,
+- 0,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,
+- 0,0,114,8,0,0,0,114,34,1,0,0,61,4,0,0,
+- 115,10,0,0,0,8,0,4,2,8,2,8,5,18,5,114,
+- 34,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,
+- 0,0,0,0,0,2,0,0,0,64,0,0,0,115,32,0,
+- 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,
+- 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,
+- 83,0,41,7,218,20,83,111,117,114,99,101,108,101,115,115,
+- 70,105,108,101,76,111,97,100,101,114,122,45,76,111,97,100,
+- 101,114,32,119,104,105,99,104,32,104,97,110,100,108,101,115,
+- 32,115,111,117,114,99,101,108,101,115,115,32,102,105,108,101,
+- 32,105,109,112,111,114,116,115,46,99,2,0,0,0,0,0,
+- 0,0,0,0,0,0,5,0,0,0,5,0,0,0,67,0,
+- 0,0,115,68,0,0,0,124,0,160,0,124,1,161,1,125,
+- 2,124,0,160,1,124,2,161,1,125,3,124,1,124,2,100,
+- 1,156,2,125,4,116,2,124,3,124,1,124,4,131,3,1,
+- 0,116,3,116,4,124,3,131,1,100,2,100,0,133,2,25,
+- 0,124,1,124,2,100,3,141,3,83,0,41,4,78,114,183,
+- 0,0,0,114,169,0,0,0,41,2,114,141,0,0,0,114,
+- 132,0,0,0,41,5,114,203,0,0,0,114,255,0,0,0,
+- 114,176,0,0,0,114,189,0,0,0,114,7,1,0,0,41,
+- 5,114,143,0,0,0,114,163,0,0,0,114,65,0,0,0,
+- 114,41,0,0,0,114,175,0,0,0,114,7,0,0,0,114,
+- 7,0,0,0,114,8,0,0,0,114,241,0,0,0,110,4,
+- 0,0,115,22,0,0,0,10,1,10,1,2,4,2,1,6,
+- 254,12,4,2,1,14,1,2,1,2,1,6,253,122,29,83,
+- 111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,
+- 100,101,114,46,103,101,116,95,99,111,100,101,99,2,0,0,
+- 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,
+- 0,67,0,0,0,114,23,0,0,0,41,2,122,39,82,101,
+- 116,117,114,110,32,78,111,110,101,32,97,115,32,116,104,101,
+- 114,101,32,105,115,32,110,111,32,115,111,117,114,99,101,32,
+- 99,111,100,101,46,78,114,7,0,0,0,114,247,0,0,0,
+- 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
+- 1,1,0,0,126,4,0,0,114,24,0,0,0,122,31,83,
+- 111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,
+- 100,101,114,46,103,101,116,95,115,111,117,114,99,101,78,41,
+- 6,114,150,0,0,0,114,149,0,0,0,114,151,0,0,0,
+- 114,152,0,0,0,114,241,0,0,0,114,1,1,0,0,114,
+- 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
+- 0,0,0,114,41,1,0,0,106,4,0,0,115,8,0,0,
+- 0,8,0,4,2,8,2,12,16,114,41,1,0,0,99,0,
+- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,
+- 0,0,0,64,0,0,0,115,92,0,0,0,101,0,90,1,
+- 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,
+- 100,4,100,5,132,0,90,5,100,6,100,7,132,0,90,6,
+- 100,8,100,9,132,0,90,7,100,10,100,11,132,0,90,8,
+- 100,12,100,13,132,0,90,9,100,14,100,15,132,0,90,10,
+- 100,16,100,17,132,0,90,11,101,12,100,18,100,19,132,0,
+- 131,1,90,13,100,20,83,0,41,21,114,30,1,0,0,122,
+- 93,76,111,97,100,101,114,32,102,111,114,32,101,120,116,101,
+- 110,115,105,111,110,32,109,111,100,117,108,101,115,46,10,10,
+- 32,32,32,32,84,104,101,32,99,111,110,115,116,114,117,99,
+- 116,111,114,32,105,115,32,100,101,115,105,103,110,101,100,32,
+- 116,111,32,119,111,114,107,32,119,105,116,104,32,70,105,108,
+- 101,70,105,110,100,101,114,46,10,10,32,32,32,32,99,3,
+- 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,
+- 0,0,0,67,0,0,0,115,16,0,0,0,124,1,124,0,
+- 95,0,124,2,124,0,95,1,100,0,83,0,114,69,0,0,
+- 0,114,183,0,0,0,41,3,114,143,0,0,0,114,141,0,
+- 0,0,114,65,0,0,0,114,7,0,0,0,114,7,0,0,
+- 0,114,8,0,0,0,114,236,0,0,0,139,4,0,0,115,
+- 4,0,0,0,6,1,10,1,122,28,69,120,116,101,110,115,
+- 105,111,110,70,105,108,101,76,111,97,100,101,114,46,95,95,
+- 105,110,105,116,95,95,99,2,0,0,0,0,0,0,0,0,
+- 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,114,
+- 12,1,0,0,114,69,0,0,0,114,13,1,0,0,114,15,
++ 0,0,0,123,3,0,0,115,16,0,0,0,8,0,8,2,
++ 8,8,8,14,8,10,8,7,14,10,12,8,114,252,0,0,
++ 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
++ 0,0,4,0,0,0,0,0,0,0,115,92,0,0,0,101,
++ 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,
++ 0,90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,
++ 0,90,6,101,7,135,0,102,1,100,8,100,9,132,8,131,
++ 1,90,8,101,7,100,10,100,11,132,0,131,1,90,9,100,
++ 12,100,13,132,0,90,10,101,7,100,14,100,15,132,0,131,
++ 1,90,11,135,0,4,0,90,12,83,0,41,16,218,10,70,
++ 105,108,101,76,111,97,100,101,114,122,103,66,97,115,101,32,
++ 102,105,108,101,32,108,111,97,100,101,114,32,99,108,97,115,
++ 115,32,119,104,105,99,104,32,105,109,112,108,101,109,101,110,
++ 116,115,32,116,104,101,32,108,111,97,100,101,114,32,112,114,
++ 111,116,111,99,111,108,32,109,101,116,104,111,100,115,32,116,
++ 104,97,116,10,32,32,32,32,114,101,113,117,105,114,101,32,
++ 102,105,108,101,32,115,121,115,116,101,109,32,117,115,97,103,
++ 101,46,99,3,0,0,0,0,0,0,0,0,0,0,0,3,
++ 0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0,
++ 124,1,124,0,95,0,124,2,124,0,95,1,100,1,83,0,
++ 41,2,122,75,67,97,99,104,101,32,116,104,101,32,109,111,
++ 100,117,108,101,32,110,97,109,101,32,97,110,100,32,116,104,
++ 101,32,112,97,116,104,32,116,111,32,116,104,101,32,102,105,
++ 108,101,32,102,111,117,110,100,32,98,121,32,116,104,101,10,
++ 32,32,32,32,32,32,32,32,102,105,110,100,101,114,46,78,
++ 114,186,0,0,0,41,3,114,146,0,0,0,114,166,0,0,
++ 0,114,68,0,0,0,114,7,0,0,0,114,7,0,0,0,
++ 114,8,0,0,0,114,239,0,0,0,16,4,0,0,115,4,
++ 0,0,0,6,3,10,1,122,19,70,105,108,101,76,111,97,
++ 100,101,114,46,95,95,105,110,105,116,95,95,99,2,0,0,
++ 0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,
++ 0,67,0,0,0,243,24,0,0,0,124,0,106,0,124,1,
++ 106,0,107,2,111,11,124,0,106,1,124,1,106,1,107,2,
++ 83,0,114,72,0,0,0,169,2,218,9,95,95,99,108,97,
++ 115,115,95,95,114,159,0,0,0,169,2,114,146,0,0,0,
++ 90,5,111,116,104,101,114,114,7,0,0,0,114,7,0,0,
++ 0,114,8,0,0,0,218,6,95,95,101,113,95,95,22,4,
++ 0,0,243,6,0,0,0,12,1,10,1,2,255,122,17,70,
++ 105,108,101,76,111,97,100,101,114,46,95,95,101,113,95,95,
++ 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
++ 0,3,0,0,0,67,0,0,0,243,20,0,0,0,116,0,
++ 124,0,106,1,131,1,116,0,124,0,106,2,131,1,65,0,
++ 83,0,114,72,0,0,0,169,3,218,4,104,97,115,104,114,
++ 144,0,0,0,114,68,0,0,0,169,1,114,146,0,0,0,
++ 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,
++ 8,95,95,104,97,115,104,95,95,26,4,0,0,243,2,0,
++ 0,0,20,1,122,19,70,105,108,101,76,111,97,100,101,114,
++ 46,95,95,104,97,115,104,95,95,99,2,0,0,0,0,0,
++ 0,0,0,0,0,0,2,0,0,0,3,0,0,0,3,0,
++ 0,0,115,16,0,0,0,116,0,116,1,124,0,131,2,160,
++ 2,124,1,161,1,83,0,41,1,122,100,76,111,97,100,32,
++ 97,32,109,111,100,117,108,101,32,102,114,111,109,32,97,32,
++ 102,105,108,101,46,10,10,32,32,32,32,32,32,32,32,84,
++ 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,
++ 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,101,
++ 120,101,99,95,109,111,100,117,108,101,40,41,32,105,110,115,
++ 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,41,
++ 3,218,5,115,117,112,101,114,114,14,1,0,0,114,251,0,
++ 0,0,114,250,0,0,0,169,1,114,17,1,0,0,114,7,
++ 0,0,0,114,8,0,0,0,114,251,0,0,0,29,4,0,
++ 0,115,2,0,0,0,16,10,122,22,70,105,108,101,76,111,
++ 97,100,101,114,46,108,111,97,100,95,109,111,100,117,108,101,
++ 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
++ 0,1,0,0,0,67,0,0,0,243,6,0,0,0,124,0,
++ 106,0,83,0,169,1,122,58,82,101,116,117,114,110,32,116,
++ 104,101,32,112,97,116,104,32,116,111,32,116,104,101,32,115,
++ 111,117,114,99,101,32,102,105,108,101,32,97,115,32,102,111,
++ 117,110,100,32,98,121,32,116,104,101,32,102,105,110,100,101,
++ 114,46,114,74,0,0,0,114,250,0,0,0,114,7,0,0,
++ 0,114,7,0,0,0,114,8,0,0,0,114,206,0,0,0,
++ 41,4,0,0,243,2,0,0,0,6,3,122,23,70,105,108,
++ 101,76,111,97,100,101,114,46,103,101,116,95,102,105,108,101,
++ 110,97,109,101,99,2,0,0,0,0,0,0,0,0,0,0,
++ 0,3,0,0,0,8,0,0,0,67,0,0,0,115,128,0,
++ 0,0,116,0,124,0,116,1,116,2,102,2,131,2,114,36,
++ 116,3,160,4,116,5,124,1,131,1,161,1,143,12,125,2,
++ 124,2,160,6,161,0,87,0,2,0,100,1,4,0,4,0,
++ 131,3,1,0,83,0,49,0,115,29,119,1,1,0,1,0,
++ 1,0,89,0,1,0,100,1,83,0,116,3,160,7,124,1,
++ 100,2,161,2,143,12,125,2,124,2,160,6,161,0,87,0,
++ 2,0,100,1,4,0,4,0,131,3,1,0,83,0,49,0,
++ 115,57,119,1,1,0,1,0,1,0,89,0,1,0,100,1,
++ 83,0,41,3,122,39,82,101,116,117,114,110,32,116,104,101,
++ 32,100,97,116,97,32,102,114,111,109,32,112,97,116,104,32,
++ 97,115,32,114,97,119,32,98,121,116,101,115,46,78,218,1,
++ 114,41,8,114,188,0,0,0,114,252,0,0,0,218,19,69,
++ 120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,
++ 101,114,114,94,0,0,0,90,9,111,112,101,110,95,99,111,
++ 100,101,114,112,0,0,0,218,4,114,101,97,100,114,95,0,
++ 0,0,41,3,114,146,0,0,0,114,68,0,0,0,114,97,
++ 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
++ 0,0,114,2,1,0,0,46,4,0,0,115,14,0,0,0,
++ 14,2,16,1,6,1,36,255,14,3,6,1,36,255,122,19,
++ 70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,100,
++ 97,116,97,99,2,0,0,0,0,0,0,0,0,0,0,0,
++ 3,0,0,0,2,0,0,0,67,0,0,0,115,20,0,0,
++ 0,100,1,100,2,108,0,109,1,125,2,1,0,124,2,124,
++ 0,131,1,83,0,41,3,78,114,0,0,0,0,41,1,218,
++ 10,70,105,108,101,82,101,97,100,101,114,41,2,218,17,105,
++ 109,112,111,114,116,108,105,98,46,114,101,97,100,101,114,115,
++ 114,35,1,0,0,41,3,114,146,0,0,0,114,247,0,0,
++ 0,114,35,1,0,0,114,7,0,0,0,114,7,0,0,0,
++ 114,8,0,0,0,218,19,103,101,116,95,114,101,115,111,117,
++ 114,99,101,95,114,101,97,100,101,114,55,4,0,0,115,4,
++ 0,0,0,12,2,8,1,122,30,70,105,108,101,76,111,97,
++ 100,101,114,46,103,101,116,95,114,101,115,111,117,114,99,101,
++ 95,114,101,97,100,101,114,41,13,114,153,0,0,0,114,152,
++ 0,0,0,114,154,0,0,0,114,155,0,0,0,114,239,0,
++ 0,0,114,19,1,0,0,114,25,1,0,0,114,163,0,0,
++ 0,114,251,0,0,0,114,206,0,0,0,114,2,1,0,0,
++ 114,37,1,0,0,90,13,95,95,99,108,97,115,115,99,101,
++ 108,108,95,95,114,7,0,0,0,114,7,0,0,0,114,28,
++ 1,0,0,114,8,0,0,0,114,14,1,0,0,11,4,0,
++ 0,115,24,0,0,0,8,0,4,2,8,3,8,6,8,4,
++ 2,3,14,1,2,11,10,1,8,4,2,9,18,1,114,14,
++ 1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,
++ 0,0,0,0,3,0,0,0,64,0,0,0,115,46,0,0,
++ 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,
++ 3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,
++ 7,156,1,100,8,100,9,132,2,90,6,100,10,83,0,41,
++ 11,218,16,83,111,117,114,99,101,70,105,108,101,76,111,97,
++ 100,101,114,122,62,67,111,110,99,114,101,116,101,32,105,109,
++ 112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,
++ 83,111,117,114,99,101,76,111,97,100,101,114,32,117,115,105,
++ 110,103,32,116,104,101,32,102,105,108,101,32,115,121,115,116,
++ 101,109,46,99,2,0,0,0,0,0,0,0,0,0,0,0,
++ 3,0,0,0,3,0,0,0,67,0,0,0,115,22,0,0,
++ 0,116,0,124,1,131,1,125,2,124,2,106,1,124,2,106,
++ 2,100,1,156,2,83,0,41,2,122,33,82,101,116,117,114,
++ 110,32,116,104,101,32,109,101,116,97,100,97,116,97,32,102,
++ 111,114,32,116,104,101,32,112,97,116,104,46,41,2,114,196,
++ 0,0,0,114,9,1,0,0,41,3,114,78,0,0,0,218,
++ 8,115,116,95,109,116,105,109,101,90,7,115,116,95,115,105,
++ 122,101,41,3,114,146,0,0,0,114,68,0,0,0,114,13,
+ 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
+- 0,0,114,16,1,0,0,143,4,0,0,114,17,1,0,0,
+- 122,26,69,120,116,101,110,115,105,111,110,70,105,108,101,76,
+- 111,97,100,101,114,46,95,95,101,113,95,95,99,1,0,0,
+- 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,
+- 0,67,0,0,0,114,18,1,0,0,114,69,0,0,0,114,
+- 19,1,0,0,114,21,1,0,0,114,7,0,0,0,114,7,
+- 0,0,0,114,8,0,0,0,114,22,1,0,0,147,4,0,
+- 0,114,23,1,0,0,122,28,69,120,116,101,110,115,105,111,
+- 110,70,105,108,101,76,111,97,100,101,114,46,95,95,104,97,
+- 115,104,95,95,99,2,0,0,0,0,0,0,0,0,0,0,
+- 0,3,0,0,0,5,0,0,0,67,0,0,0,115,36,0,
+- 0,0,116,0,160,1,116,2,106,3,124,1,161,2,125,2,
+- 116,0,160,4,100,1,124,1,106,5,124,0,106,6,161,3,
+- 1,0,124,2,83,0,41,2,122,38,67,114,101,97,116,101,
+- 32,97,110,32,117,110,105,116,105,97,108,105,122,101,100,32,
++ 0,0,114,255,0,0,0,65,4,0,0,115,4,0,0,0,
++ 8,2,14,1,122,27,83,111,117,114,99,101,70,105,108,101,
++ 76,111,97,100,101,114,46,112,97,116,104,95,115,116,97,116,
++ 115,99,4,0,0,0,0,0,0,0,0,0,0,0,5,0,
++ 0,0,5,0,0,0,67,0,0,0,115,24,0,0,0,116,
++ 0,124,1,131,1,125,4,124,0,106,1,124,2,124,3,124,
++ 4,100,1,141,3,83,0,41,2,78,169,1,218,5,95,109,
++ 111,100,101,41,2,114,142,0,0,0,114,0,1,0,0,41,
++ 5,114,146,0,0,0,114,137,0,0,0,114,135,0,0,0,
++ 114,44,0,0,0,114,81,0,0,0,114,7,0,0,0,114,
++ 7,0,0,0,114,8,0,0,0,114,1,1,0,0,70,4,
++ 0,0,115,4,0,0,0,8,2,16,1,122,32,83,111,117,
++ 114,99,101,70,105,108,101,76,111,97,100,101,114,46,95,99,
++ 97,99,104,101,95,98,121,116,101,99,111,100,101,114,90,0,
++ 0,0,114,40,1,0,0,99,3,0,0,0,0,0,0,0,
++ 1,0,0,0,9,0,0,0,11,0,0,0,67,0,0,0,
++ 115,254,0,0,0,116,0,124,1,131,1,92,2,125,4,125,
++ 5,103,0,125,6,124,4,114,31,116,1,124,4,131,1,115,
++ 31,116,0,124,4,131,1,92,2,125,4,125,7,124,6,160,
++ 2,124,7,161,1,1,0,124,4,114,31,116,1,124,4,131,
++ 1,114,14,116,3,124,6,131,1,68,0,93,49,125,7,116,
++ 4,124,4,124,7,131,2,125,4,122,7,116,5,160,6,124,
++ 4,161,1,1,0,87,0,113,35,4,0,116,7,121,58,1,
++ 0,1,0,1,0,89,0,113,35,4,0,116,8,121,84,1,
++ 0,125,8,1,0,122,15,116,9,160,10,100,1,124,4,124,
++ 8,161,3,1,0,87,0,89,0,100,2,125,8,126,8,1,
++ 0,100,2,83,0,100,2,125,8,126,8,119,1,119,0,122,
++ 15,116,11,124,1,124,2,124,3,131,3,1,0,116,9,160,
++ 10,100,3,124,1,161,2,1,0,87,0,100,2,83,0,4,
++ 0,116,8,121,126,1,0,125,8,1,0,122,14,116,9,160,
++ 10,100,1,124,1,124,8,161,3,1,0,87,0,89,0,100,
++ 2,125,8,126,8,100,2,83,0,100,2,125,8,126,8,119,
++ 1,119,0,41,4,122,27,87,114,105,116,101,32,98,121,116,
++ 101,115,32,100,97,116,97,32,116,111,32,97,32,102,105,108,
++ 101,46,122,27,99,111,117,108,100,32,110,111,116,32,99,114,
++ 101,97,116,101,32,123,33,114,125,58,32,123,33,114,125,78,
++ 122,12,99,114,101,97,116,101,100,32,123,33,114,125,41,12,
++ 114,77,0,0,0,114,86,0,0,0,114,64,0,0,0,218,
++ 8,114,101,118,101,114,115,101,100,114,70,0,0,0,114,21,
++ 0,0,0,90,5,109,107,100,105,114,218,15,70,105,108,101,
++ 69,120,105,115,116,115,69,114,114,111,114,114,79,0,0,0,
++ 114,162,0,0,0,114,176,0,0,0,114,98,0,0,0,41,
++ 9,114,146,0,0,0,114,68,0,0,0,114,44,0,0,0,
++ 114,41,1,0,0,218,6,112,97,114,101,110,116,114,123,0,
++ 0,0,114,66,0,0,0,114,71,0,0,0,114,3,1,0,
++ 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
++ 114,0,1,0,0,75,4,0,0,115,56,0,0,0,12,2,
++ 4,1,12,2,12,1,10,1,12,254,12,4,10,1,2,1,
++ 14,1,12,1,4,2,14,1,6,3,4,1,4,255,16,2,
++ 8,128,2,251,2,6,12,1,18,1,14,1,8,2,2,1,
++ 18,255,8,128,2,254,122,25,83,111,117,114,99,101,70,105,
++ 108,101,76,111,97,100,101,114,46,115,101,116,95,100,97,116,
++ 97,78,41,7,114,153,0,0,0,114,152,0,0,0,114,154,
++ 0,0,0,114,155,0,0,0,114,255,0,0,0,114,1,1,
++ 0,0,114,0,1,0,0,114,7,0,0,0,114,7,0,0,
++ 0,114,7,0,0,0,114,8,0,0,0,114,38,1,0,0,
++ 61,4,0,0,115,10,0,0,0,8,0,4,2,8,2,8,
++ 5,18,5,114,38,1,0,0,99,0,0,0,0,0,0,0,
++ 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0,
++ 0,115,32,0,0,0,101,0,90,1,100,0,90,2,100,1,
++ 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,
++ 90,5,100,6,83,0,41,7,218,20,83,111,117,114,99,101,
++ 108,101,115,115,70,105,108,101,76,111,97,100,101,114,122,45,
++ 76,111,97,100,101,114,32,119,104,105,99,104,32,104,97,110,
++ 100,108,101,115,32,115,111,117,114,99,101,108,101,115,115,32,
++ 102,105,108,101,32,105,109,112,111,114,116,115,46,99,2,0,
++ 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,
++ 0,0,67,0,0,0,115,68,0,0,0,124,0,160,0,124,
++ 1,161,1,125,2,124,0,160,1,124,2,161,1,125,3,124,
++ 1,124,2,100,1,156,2,125,4,116,2,124,3,124,1,124,
++ 4,131,3,1,0,116,3,116,4,124,3,131,1,100,2,100,
++ 0,133,2,25,0,124,1,124,2,100,3,141,3,83,0,41,
++ 4,78,114,186,0,0,0,114,172,0,0,0,41,2,114,144,
++ 0,0,0,114,135,0,0,0,41,5,114,206,0,0,0,114,
++ 2,1,0,0,114,179,0,0,0,114,192,0,0,0,114,10,
++ 1,0,0,41,5,114,146,0,0,0,114,166,0,0,0,114,
++ 68,0,0,0,114,44,0,0,0,114,178,0,0,0,114,7,
++ 0,0,0,114,7,0,0,0,114,8,0,0,0,114,244,0,
++ 0,0,110,4,0,0,115,22,0,0,0,10,1,10,1,2,
++ 4,2,1,6,254,12,4,2,1,14,1,2,1,2,1,6,
++ 253,122,29,83,111,117,114,99,101,108,101,115,115,70,105,108,
++ 101,76,111,97,100,101,114,46,103,101,116,95,99,111,100,101,
++ 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
++ 0,1,0,0,0,67,0,0,0,114,26,0,0,0,41,2,
++ 122,39,82,101,116,117,114,110,32,78,111,110,101,32,97,115,
++ 32,116,104,101,114,101,32,105,115,32,110,111,32,115,111,117,
++ 114,99,101,32,99,111,100,101,46,78,114,7,0,0,0,114,
++ 250,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
++ 0,0,0,114,4,1,0,0,126,4,0,0,114,27,0,0,
++ 0,122,31,83,111,117,114,99,101,108,101,115,115,70,105,108,
++ 101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,
++ 99,101,78,41,6,114,153,0,0,0,114,152,0,0,0,114,
++ 154,0,0,0,114,155,0,0,0,114,244,0,0,0,114,4,
++ 1,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,
++ 0,0,114,8,0,0,0,114,45,1,0,0,106,4,0,0,
++ 115,8,0,0,0,8,0,4,2,8,2,12,16,114,45,1,
++ 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,
++ 0,0,0,3,0,0,0,64,0,0,0,115,92,0,0,0,
++ 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,
++ 132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7,
++ 132,0,90,6,100,8,100,9,132,0,90,7,100,10,100,11,
++ 132,0,90,8,100,12,100,13,132,0,90,9,100,14,100,15,
++ 132,0,90,10,100,16,100,17,132,0,90,11,101,12,100,18,
++ 100,19,132,0,131,1,90,13,100,20,83,0,41,21,114,33,
++ 1,0,0,122,93,76,111,97,100,101,114,32,102,111,114,32,
+ 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,
+- 122,38,101,120,116,101,110,115,105,111,110,32,109,111,100,117,
+- 108,101,32,123,33,114,125,32,108,111,97,100,101,100,32,102,
+- 114,111,109,32,123,33,114,125,41,7,114,159,0,0,0,114,
+- 242,0,0,0,114,187,0,0,0,90,14,99,114,101,97,116,
+- 101,95,100,121,110,97,109,105,99,114,173,0,0,0,114,141,
+- 0,0,0,114,65,0,0,0,41,3,114,143,0,0,0,114,
+- 210,0,0,0,114,244,0,0,0,114,7,0,0,0,114,7,
+- 0,0,0,114,8,0,0,0,114,239,0,0,0,150,4,0,
+- 0,115,14,0,0,0,4,2,6,1,4,255,6,2,8,1,
+- 4,255,4,2,122,33,69,120,116,101,110,115,105,111,110,70,
+- 105,108,101,76,111,97,100,101,114,46,99,114,101,97,116,101,
+- 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,
+- 0,0,0,0,2,0,0,0,5,0,0,0,67,0,0,0,
+- 115,36,0,0,0,116,0,160,1,116,2,106,3,124,1,161,
+- 2,1,0,116,0,160,4,100,1,124,0,106,5,124,0,106,
+- 6,161,3,1,0,100,2,83,0,41,3,122,30,73,110,105,
+- 116,105,97,108,105,122,101,32,97,110,32,101,120,116,101,110,
+- 115,105,111,110,32,109,111,100,117,108,101,122,40,101,120,116,
+- 101,110,115,105,111,110,32,109,111,100,117,108,101,32,123,33,
+- 114,125,32,101,120,101,99,117,116,101,100,32,102,114,111,109,
+- 32,123,33,114,125,78,41,7,114,159,0,0,0,114,242,0,
+- 0,0,114,187,0,0,0,90,12,101,120,101,99,95,100,121,
+- 110,97,109,105,99,114,173,0,0,0,114,141,0,0,0,114,
+- 65,0,0,0,169,2,114,143,0,0,0,114,244,0,0,0,
+- 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
+- 245,0,0,0,158,4,0,0,115,8,0,0,0,14,2,6,
+- 1,8,1,8,255,122,31,69,120,116,101,110,115,105,111,110,
+- 70,105,108,101,76,111,97,100,101,114,46,101,120,101,99,95,
+- 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,
+- 0,0,0,2,0,0,0,4,0,0,0,3,0,0,0,115,
+- 36,0,0,0,116,0,124,0,106,1,131,1,100,1,25,0,
+- 137,0,116,2,135,0,102,1,100,2,100,3,132,8,116,3,
+- 68,0,131,1,131,1,83,0,41,4,122,49,82,101,116,117,
+- 114,110,32,84,114,117,101,32,105,102,32,116,104,101,32,101,
+- 120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,
+- 105,115,32,97,32,112,97,99,107,97,103,101,46,114,3,0,
+- 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,
+- 0,0,0,4,0,0,0,51,0,0,0,115,28,0,0,0,
+- 129,0,124,0,93,9,125,1,136,0,100,0,124,1,23,0,
+- 107,2,86,0,1,0,113,2,100,1,83,0,41,2,114,236,
+- 0,0,0,78,114,7,0,0,0,169,2,114,5,0,0,0,
+- 218,6,115,117,102,102,105,120,169,1,90,9,102,105,108,101,
+- 95,110,97,109,101,114,7,0,0,0,114,8,0,0,0,114,
+- 9,0,0,0,167,4,0,0,115,8,0,0,0,2,128,4,
+- 0,2,1,20,255,122,49,69,120,116,101,110,115,105,111,110,
+- 70,105,108,101,76,111,97,100,101,114,46,105,115,95,112,97,
+- 99,107,97,103,101,46,60,108,111,99,97,108,115,62,46,60,
+- 103,101,110,101,120,112,114,62,41,4,114,74,0,0,0,114,
+- 65,0,0,0,218,3,97,110,121,114,232,0,0,0,114,247,
+- 0,0,0,114,7,0,0,0,114,45,1,0,0,114,8,0,
+- 0,0,114,206,0,0,0,164,4,0,0,115,8,0,0,0,
+- 14,2,12,1,2,1,8,255,122,30,69,120,116,101,110,115,
+- 105,111,110,70,105,108,101,76,111,97,100,101,114,46,105,115,
+- 95,112,97,99,107,97,103,101,99,2,0,0,0,0,0,0,
+- 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,
+- 0,114,23,0,0,0,41,2,122,63,82,101,116,117,114,110,
+- 32,78,111,110,101,32,97,115,32,97,110,32,101,120,116,101,
+- 110,115,105,111,110,32,109,111,100,117,108,101,32,99,97,110,
+- 110,111,116,32,99,114,101,97,116,101,32,97,32,99,111,100,
+- 101,32,111,98,106,101,99,116,46,78,114,7,0,0,0,114,
++ 115,46,10,10,32,32,32,32,84,104,101,32,99,111,110,115,
++ 116,114,117,99,116,111,114,32,105,115,32,100,101,115,105,103,
++ 110,101,100,32,116,111,32,119,111,114,107,32,119,105,116,104,
++ 32,70,105,108,101,70,105,110,100,101,114,46,10,10,32,32,
++ 32,32,99,3,0,0,0,0,0,0,0,0,0,0,0,3,
++ 0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0,
++ 124,1,124,0,95,0,124,2,124,0,95,1,100,0,83,0,
++ 114,72,0,0,0,114,186,0,0,0,41,3,114,146,0,0,
++ 0,114,144,0,0,0,114,68,0,0,0,114,7,0,0,0,
++ 114,7,0,0,0,114,8,0,0,0,114,239,0,0,0,139,
++ 4,0,0,115,4,0,0,0,6,1,10,1,122,28,69,120,
++ 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,
++ 114,46,95,95,105,110,105,116,95,95,99,2,0,0,0,0,
++ 0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,67,
++ 0,0,0,114,15,1,0,0,114,72,0,0,0,114,16,1,
++ 0,0,114,18,1,0,0,114,7,0,0,0,114,7,0,0,
++ 0,114,8,0,0,0,114,19,1,0,0,143,4,0,0,114,
++ 20,1,0,0,122,26,69,120,116,101,110,115,105,111,110,70,
++ 105,108,101,76,111,97,100,101,114,46,95,95,101,113,95,95,
++ 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
++ 0,3,0,0,0,67,0,0,0,114,21,1,0,0,114,72,
++ 0,0,0,114,22,1,0,0,114,24,1,0,0,114,7,0,
++ 0,0,114,7,0,0,0,114,8,0,0,0,114,25,1,0,
++ 0,147,4,0,0,114,26,1,0,0,122,28,69,120,116,101,
++ 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,
++ 95,95,104,97,115,104,95,95,99,2,0,0,0,0,0,0,
++ 0,0,0,0,0,3,0,0,0,5,0,0,0,67,0,0,
++ 0,115,36,0,0,0,116,0,160,1,116,2,106,3,124,1,
++ 161,2,125,2,116,0,160,4,100,1,124,1,106,5,124,0,
++ 106,6,161,3,1,0,124,2,83,0,41,2,122,38,67,114,
++ 101,97,116,101,32,97,110,32,117,110,105,116,105,97,108,105,
++ 122,101,100,32,101,120,116,101,110,115,105,111,110,32,109,111,
++ 100,117,108,101,122,38,101,120,116,101,110,115,105,111,110,32,
++ 109,111,100,117,108,101,32,123,33,114,125,32,108,111,97,100,
++ 101,100,32,102,114,111,109,32,123,33,114,125,41,7,114,162,
++ 0,0,0,114,245,0,0,0,114,190,0,0,0,218,14,99,
++ 114,101,97,116,101,95,100,121,110,97,109,105,99,114,176,0,
++ 0,0,114,144,0,0,0,114,68,0,0,0,41,3,114,146,
++ 0,0,0,114,213,0,0,0,114,247,0,0,0,114,7,0,
++ 0,0,114,7,0,0,0,114,8,0,0,0,114,242,0,0,
++ 0,150,4,0,0,115,14,0,0,0,4,2,6,1,4,255,
++ 6,2,8,1,4,255,4,2,122,33,69,120,116,101,110,115,
++ 105,111,110,70,105,108,101,76,111,97,100,101,114,46,99,114,
++ 101,97,116,101,95,109,111,100,117,108,101,99,2,0,0,0,
++ 0,0,0,0,0,0,0,0,2,0,0,0,5,0,0,0,
++ 67,0,0,0,115,36,0,0,0,116,0,160,1,116,2,106,
++ 3,124,1,161,2,1,0,116,0,160,4,100,1,124,0,106,
++ 5,124,0,106,6,161,3,1,0,100,2,83,0,41,3,122,
++ 30,73,110,105,116,105,97,108,105,122,101,32,97,110,32,101,
++ 120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,122,
++ 40,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,
++ 101,32,123,33,114,125,32,101,120,101,99,117,116,101,100,32,
++ 102,114,111,109,32,123,33,114,125,78,41,7,114,162,0,0,
++ 0,114,245,0,0,0,114,190,0,0,0,90,12,101,120,101,
++ 99,95,100,121,110,97,109,105,99,114,176,0,0,0,114,144,
++ 0,0,0,114,68,0,0,0,169,2,114,146,0,0,0,114,
+ 247,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
+- 0,0,0,114,241,0,0,0,170,4,0,0,114,24,0,0,
+- 0,122,28,69,120,116,101,110,115,105,111,110,70,105,108,101,
+- 76,111,97,100,101,114,46,103,101,116,95,99,111,100,101,99,
+- 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,
+- 1,0,0,0,67,0,0,0,114,23,0,0,0,41,2,122,
+- 53,82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,
++ 0,0,0,114,248,0,0,0,158,4,0,0,115,8,0,0,
++ 0,14,2,6,1,8,1,8,255,122,31,69,120,116,101,110,
++ 115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,101,
++ 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0,
++ 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,3,
++ 0,0,0,115,36,0,0,0,116,0,124,0,106,1,131,1,
++ 100,1,25,0,137,0,116,2,135,0,102,1,100,2,100,3,
++ 132,8,116,3,68,0,131,1,131,1,83,0,41,4,122,49,
++ 82,101,116,117,114,110,32,84,114,117,101,32,105,102,32,116,
++ 104,101,32,101,120,116,101,110,115,105,111,110,32,109,111,100,
++ 117,108,101,32,105,115,32,97,32,112,97,99,107,97,103,101,
++ 46,114,3,0,0,0,99,1,0,0,0,0,0,0,0,0,
++ 0,0,0,2,0,0,0,4,0,0,0,51,0,0,0,115,
++ 28,0,0,0,129,0,124,0,93,9,125,1,136,0,100,0,
++ 124,1,23,0,107,2,86,0,1,0,113,2,100,1,83,0,
++ 41,2,114,239,0,0,0,78,114,7,0,0,0,169,2,114,
++ 5,0,0,0,218,6,115,117,102,102,105,120,169,1,90,9,
++ 102,105,108,101,95,110,97,109,101,114,7,0,0,0,114,8,
++ 0,0,0,114,9,0,0,0,167,4,0,0,115,8,0,0,
++ 0,2,128,4,0,2,1,20,255,122,49,69,120,116,101,110,
++ 115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,105,
++ 115,95,112,97,99,107,97,103,101,46,60,108,111,99,97,108,
++ 115,62,46,60,103,101,110,101,120,112,114,62,41,4,114,77,
++ 0,0,0,114,68,0,0,0,218,3,97,110,121,114,235,0,
++ 0,0,114,250,0,0,0,114,7,0,0,0,114,50,1,0,
++ 0,114,8,0,0,0,114,209,0,0,0,164,4,0,0,115,
++ 8,0,0,0,14,2,12,1,2,1,8,255,122,30,69,120,
++ 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,
++ 114,46,105,115,95,112,97,99,107,97,103,101,99,2,0,0,
++ 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,
++ 0,67,0,0,0,114,26,0,0,0,41,2,122,63,82,101,
++ 116,117,114,110,32,78,111,110,101,32,97,115,32,97,110,32,
+ 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,
+- 115,32,104,97,118,101,32,110,111,32,115,111,117,114,99,101,
+- 32,99,111,100,101,46,78,114,7,0,0,0,114,247,0,0,
+- 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
+- 114,1,1,0,0,174,4,0,0,114,24,0,0,0,122,30,
+- 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,
+- 100,101,114,46,103,101,116,95,115,111,117,114,99,101,99,2,
+- 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,
+- 0,0,0,67,0,0,0,114,26,1,0,0,114,27,1,0,
+- 0,114,71,0,0,0,114,247,0,0,0,114,7,0,0,0,
+- 114,7,0,0,0,114,8,0,0,0,114,203,0,0,0,178,
+- 4,0,0,114,28,1,0,0,122,32,69,120,116,101,110,115,
+- 105,111,110,70,105,108,101,76,111,97,100,101,114,46,103,101,
+- 116,95,102,105,108,101,110,97,109,101,78,41,14,114,150,0,
+- 0,0,114,149,0,0,0,114,151,0,0,0,114,152,0,0,
+- 0,114,236,0,0,0,114,16,1,0,0,114,22,1,0,0,
+- 114,239,0,0,0,114,245,0,0,0,114,206,0,0,0,114,
+- 241,0,0,0,114,1,1,0,0,114,160,0,0,0,114,203,
+- 0,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,
+- 0,0,114,8,0,0,0,114,30,1,0,0,131,4,0,0,
+- 115,24,0,0,0,8,0,4,2,8,6,8,4,8,4,8,
+- 3,8,8,8,6,8,6,8,4,2,4,14,1,114,30,1,
+- 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,
+- 0,0,0,2,0,0,0,64,0,0,0,115,108,0,0,0,
+- 101,0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,
+- 100,3,100,4,132,0,90,5,100,5,100,6,132,0,90,6,
+- 100,7,100,8,132,0,90,7,100,9,100,10,132,0,90,8,
+- 100,11,100,12,132,0,90,9,100,13,100,14,132,0,90,10,
+- 100,15,100,16,132,0,90,11,100,17,100,18,132,0,90,12,
+- 100,19,100,20,132,0,90,13,100,21,100,22,132,0,90,14,
+- 100,23,100,24,132,0,90,15,100,25,83,0,41,26,218,14,
+- 95,78,97,109,101,115,112,97,99,101,80,97,116,104,97,38,
+- 1,0,0,82,101,112,114,101,115,101,110,116,115,32,97,32,
+- 110,97,109,101,115,112,97,99,101,32,112,97,99,107,97,103,
+- 101,39,115,32,112,97,116,104,46,32,32,73,116,32,117,115,
+- 101,115,32,116,104,101,32,109,111,100,117,108,101,32,110,97,
+- 109,101,10,32,32,32,32,116,111,32,102,105,110,100,32,105,
+- 116,115,32,112,97,114,101,110,116,32,109,111,100,117,108,101,
+- 44,32,97,110,100,32,102,114,111,109,32,116,104,101,114,101,
+- 32,105,116,32,108,111,111,107,115,32,117,112,32,116,104,101,
+- 32,112,97,114,101,110,116,39,115,10,32,32,32,32,95,95,
+- 112,97,116,104,95,95,46,32,32,87,104,101,110,32,116,104,
+- 105,115,32,99,104,97,110,103,101,115,44,32,116,104,101,32,
+- 109,111,100,117,108,101,39,115,32,111,119,110,32,112,97,116,
+- 104,32,105,115,32,114,101,99,111,109,112,117,116,101,100,44,
+- 10,32,32,32,32,117,115,105,110,103,32,112,97,116,104,95,
+- 102,105,110,100,101,114,46,32,32,70,111,114,32,116,111,112,
+- 45,108,101,118,101,108,32,109,111,100,117,108,101,115,44,32,
+- 116,104,101,32,112,97,114,101,110,116,32,109,111,100,117,108,
+- 101,39,115,32,112,97,116,104,10,32,32,32,32,105,115,32,
+- 115,121,115,46,112,97,116,104,46,114,0,0,0,0,99,4,
+- 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,3,
+- 0,0,0,67,0,0,0,115,44,0,0,0,124,1,124,0,
+- 95,0,124,2,124,0,95,1,116,2,124,0,160,3,161,0,
+- 131,1,124,0,95,4,124,0,106,5,124,0,95,6,124,3,
+- 124,0,95,7,100,0,83,0,114,69,0,0,0,41,8,218,
+- 5,95,110,97,109,101,218,5,95,112,97,116,104,114,136,0,
+- 0,0,218,16,95,103,101,116,95,112,97,114,101,110,116,95,
+- 112,97,116,104,218,17,95,108,97,115,116,95,112,97,114,101,
+- 110,116,95,112,97,116,104,218,6,95,101,112,111,99,104,218,
+- 11,95,108,97,115,116,95,101,112,111,99,104,218,12,95,112,
+- 97,116,104,95,102,105,110,100,101,114,169,4,114,143,0,0,
+- 0,114,141,0,0,0,114,65,0,0,0,90,11,112,97,116,
+- 104,95,102,105,110,100,101,114,114,7,0,0,0,114,7,0,
+- 0,0,114,8,0,0,0,114,236,0,0,0,195,4,0,0,
+- 115,10,0,0,0,6,1,6,1,14,1,8,1,10,1,122,
+- 23,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,
+- 95,95,105,110,105,116,95,95,99,1,0,0,0,0,0,0,
+- 0,0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,
+- 0,115,38,0,0,0,124,0,106,0,160,1,100,1,161,1,
+- 92,3,125,1,125,2,125,3,124,2,100,2,107,2,114,15,
+- 100,3,83,0,124,1,100,4,102,2,83,0,41,5,122,62,
+- 82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,32,
+- 111,102,32,40,112,97,114,101,110,116,45,109,111,100,117,108,
+- 101,45,110,97,109,101,44,32,112,97,114,101,110,116,45,112,
+- 97,116,104,45,97,116,116,114,45,110,97,109,101,41,114,97,
+- 0,0,0,114,10,0,0,0,41,2,114,15,0,0,0,114,
+- 65,0,0,0,90,8,95,95,112,97,116,104,95,95,41,2,
+- 114,48,1,0,0,114,104,0,0,0,41,4,114,143,0,0,
+- 0,114,40,1,0,0,218,3,100,111,116,90,2,109,101,114,
+- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,23,
+- 95,102,105,110,100,95,112,97,114,101,110,116,95,112,97,116,
+- 104,95,110,97,109,101,115,202,4,0,0,115,8,0,0,0,
+- 18,2,8,1,4,2,8,3,122,38,95,78,97,109,101,115,
+- 112,97,99,101,80,97,116,104,46,95,102,105,110,100,95,112,
+- 97,114,101,110,116,95,112,97,116,104,95,110,97,109,101,115,
+- 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
+- 0,3,0,0,0,67,0,0,0,115,28,0,0,0,124,0,
+- 160,0,161,0,92,2,125,1,125,2,116,1,116,2,106,3,
+- 124,1,25,0,124,2,131,2,83,0,114,69,0,0,0,41,
+- 4,114,57,1,0,0,114,155,0,0,0,114,15,0,0,0,
+- 218,7,109,111,100,117,108,101,115,41,3,114,143,0,0,0,
+- 90,18,112,97,114,101,110,116,95,109,111,100,117,108,101,95,
+- 110,97,109,101,90,14,112,97,116,104,95,97,116,116,114,95,
+- 110,97,109,101,114,7,0,0,0,114,7,0,0,0,114,8,
+- 0,0,0,114,50,1,0,0,212,4,0,0,115,4,0,0,
+- 0,12,1,16,1,122,31,95,78,97,109,101,115,112,97,99,
+- 101,80,97,116,104,46,95,103,101,116,95,112,97,114,101,110,
+- 116,95,112,97,116,104,99,1,0,0,0,0,0,0,0,0,
+- 0,0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,
+- 100,0,0,0,116,0,124,0,160,1,161,0,131,1,125,1,
+- 124,1,124,0,106,2,107,3,115,17,124,0,106,3,124,0,
+- 106,4,107,3,114,47,124,0,160,5,124,0,106,6,124,1,
+- 161,2,125,2,124,2,100,0,117,1,114,40,124,2,106,7,
+- 100,0,117,0,114,40,124,2,106,8,114,40,124,2,106,8,
+- 124,0,95,9,124,1,124,0,95,2,124,0,106,3,124,0,
+- 95,4,124,0,106,9,83,0,114,69,0,0,0,41,10,114,
+- 136,0,0,0,114,50,1,0,0,114,51,1,0,0,114,52,
+- 1,0,0,114,53,1,0,0,114,54,1,0,0,114,48,1,
+- 0,0,114,164,0,0,0,114,202,0,0,0,114,49,1,0,
+- 0,41,3,114,143,0,0,0,90,11,112,97,114,101,110,116,
+- 95,112,97,116,104,114,210,0,0,0,114,7,0,0,0,114,
+- 7,0,0,0,114,8,0,0,0,218,12,95,114,101,99,97,
+- 108,99,117,108,97,116,101,216,4,0,0,115,18,0,0,0,
+- 12,2,22,1,14,1,18,3,6,1,8,1,6,1,8,1,
+- 6,1,122,27,95,78,97,109,101,115,112,97,99,101,80,97,
+- 116,104,46,95,114,101,99,97,108,99,117,108,97,116,101,99,
++ 32,99,97,110,110,111,116,32,99,114,101,97,116,101,32,97,
++ 32,99,111,100,101,32,111,98,106,101,99,116,46,78,114,7,
++ 0,0,0,114,250,0,0,0,114,7,0,0,0,114,7,0,
++ 0,0,114,8,0,0,0,114,244,0,0,0,170,4,0,0,
++ 114,27,0,0,0,122,28,69,120,116,101,110,115,105,111,110,
++ 70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,99,
++ 111,100,101,99,2,0,0,0,0,0,0,0,0,0,0,0,
++ 2,0,0,0,1,0,0,0,67,0,0,0,114,26,0,0,
++ 0,41,2,122,53,82,101,116,117,114,110,32,78,111,110,101,
++ 32,97,115,32,101,120,116,101,110,115,105,111,110,32,109,111,
++ 100,117,108,101,115,32,104,97,118,101,32,110,111,32,115,111,
++ 117,114,99,101,32,99,111,100,101,46,78,114,7,0,0,0,
++ 114,250,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
++ 8,0,0,0,114,4,1,0,0,174,4,0,0,114,27,0,
++ 0,0,122,30,69,120,116,101,110,115,105,111,110,70,105,108,
++ 101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,
++ 99,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
++ 0,0,0,1,0,0,0,67,0,0,0,114,29,1,0,0,
++ 114,30,1,0,0,114,74,0,0,0,114,250,0,0,0,114,
++ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,206,
++ 0,0,0,178,4,0,0,114,31,1,0,0,122,32,69,120,
++ 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,
++ 114,46,103,101,116,95,102,105,108,101,110,97,109,101,78,41,
++ 14,114,153,0,0,0,114,152,0,0,0,114,154,0,0,0,
++ 114,155,0,0,0,114,239,0,0,0,114,19,1,0,0,114,
++ 25,1,0,0,114,242,0,0,0,114,248,0,0,0,114,209,
++ 0,0,0,114,244,0,0,0,114,4,1,0,0,114,163,0,
++ 0,0,114,206,0,0,0,114,7,0,0,0,114,7,0,0,
++ 0,114,7,0,0,0,114,8,0,0,0,114,33,1,0,0,
++ 131,4,0,0,115,24,0,0,0,8,0,4,2,8,6,8,
++ 4,8,4,8,3,8,8,8,6,8,6,8,4,2,4,14,
++ 1,114,33,1,0,0,99,0,0,0,0,0,0,0,0,0,
++ 0,0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,
++ 108,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,
++ 100,2,90,4,100,3,100,4,132,0,90,5,100,5,100,6,
++ 132,0,90,6,100,7,100,8,132,0,90,7,100,9,100,10,
++ 132,0,90,8,100,11,100,12,132,0,90,9,100,13,100,14,
++ 132,0,90,10,100,15,100,16,132,0,90,11,100,17,100,18,
++ 132,0,90,12,100,19,100,20,132,0,90,13,100,21,100,22,
++ 132,0,90,14,100,23,100,24,132,0,90,15,100,25,83,0,
++ 41,26,218,14,95,78,97,109,101,115,112,97,99,101,80,97,
++ 116,104,97,38,1,0,0,82,101,112,114,101,115,101,110,116,
++ 115,32,97,32,110,97,109,101,115,112,97,99,101,32,112,97,
++ 99,107,97,103,101,39,115,32,112,97,116,104,46,32,32,73,
++ 116,32,117,115,101,115,32,116,104,101,32,109,111,100,117,108,
++ 101,32,110,97,109,101,10,32,32,32,32,116,111,32,102,105,
++ 110,100,32,105,116,115,32,112,97,114,101,110,116,32,109,111,
++ 100,117,108,101,44,32,97,110,100,32,102,114,111,109,32,116,
++ 104,101,114,101,32,105,116,32,108,111,111,107,115,32,117,112,
++ 32,116,104,101,32,112,97,114,101,110,116,39,115,10,32,32,
++ 32,32,95,95,112,97,116,104,95,95,46,32,32,87,104,101,
++ 110,32,116,104,105,115,32,99,104,97,110,103,101,115,44,32,
++ 116,104,101,32,109,111,100,117,108,101,39,115,32,111,119,110,
++ 32,112,97,116,104,32,105,115,32,114,101,99,111,109,112,117,
++ 116,101,100,44,10,32,32,32,32,117,115,105,110,103,32,112,
++ 97,116,104,95,102,105,110,100,101,114,46,32,32,70,111,114,
++ 32,116,111,112,45,108,101,118,101,108,32,109,111,100,117,108,
++ 101,115,44,32,116,104,101,32,112,97,114,101,110,116,32,109,
++ 111,100,117,108,101,39,115,32,112,97,116,104,10,32,32,32,
++ 32,105,115,32,115,121,115,46,112,97,116,104,46,114,0,0,
++ 0,0,99,4,0,0,0,0,0,0,0,0,0,0,0,4,
++ 0,0,0,3,0,0,0,67,0,0,0,115,44,0,0,0,
++ 124,1,124,0,95,0,124,2,124,0,95,1,116,2,124,0,
++ 160,3,161,0,131,1,124,0,95,4,124,0,106,5,124,0,
++ 95,6,124,3,124,0,95,7,100,0,83,0,114,72,0,0,
++ 0,41,8,218,5,95,110,97,109,101,218,5,95,112,97,116,
++ 104,114,139,0,0,0,218,16,95,103,101,116,95,112,97,114,
++ 101,110,116,95,112,97,116,104,218,17,95,108,97,115,116,95,
++ 112,97,114,101,110,116,95,112,97,116,104,218,6,95,101,112,
++ 111,99,104,218,11,95,108,97,115,116,95,101,112,111,99,104,
++ 218,12,95,112,97,116,104,95,102,105,110,100,101,114,169,4,
++ 114,146,0,0,0,114,144,0,0,0,114,68,0,0,0,90,
++ 11,112,97,116,104,95,102,105,110,100,101,114,114,7,0,0,
++ 0,114,7,0,0,0,114,8,0,0,0,114,239,0,0,0,
++ 195,4,0,0,115,10,0,0,0,6,1,6,1,14,1,8,
++ 1,10,1,122,23,95,78,97,109,101,115,112,97,99,101,80,
++ 97,116,104,46,95,95,105,110,105,116,95,95,99,1,0,0,
++ 0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,
++ 0,67,0,0,0,115,38,0,0,0,124,0,106,0,160,1,
++ 100,1,161,1,92,3,125,1,125,2,125,3,124,2,100,2,
++ 107,2,114,15,100,3,83,0,124,1,100,4,102,2,83,0,
++ 41,5,122,62,82,101,116,117,114,110,115,32,97,32,116,117,
++ 112,108,101,32,111,102,32,40,112,97,114,101,110,116,45,109,
++ 111,100,117,108,101,45,110,97,109,101,44,32,112,97,114,101,
++ 110,116,45,112,97,116,104,45,97,116,116,114,45,110,97,109,
++ 101,41,114,100,0,0,0,114,10,0,0,0,41,2,114,18,
++ 0,0,0,114,68,0,0,0,90,8,95,95,112,97,116,104,
++ 95,95,41,2,114,53,1,0,0,114,107,0,0,0,41,4,
++ 114,146,0,0,0,114,44,1,0,0,218,3,100,111,116,90,
++ 2,109,101,114,7,0,0,0,114,7,0,0,0,114,8,0,
++ 0,0,218,23,95,102,105,110,100,95,112,97,114,101,110,116,
++ 95,112,97,116,104,95,110,97,109,101,115,202,4,0,0,115,
++ 8,0,0,0,18,2,8,1,4,2,8,3,122,38,95,78,
++ 97,109,101,115,112,97,99,101,80,97,116,104,46,95,102,105,
++ 110,100,95,112,97,114,101,110,116,95,112,97,116,104,95,110,
++ 97,109,101,115,99,1,0,0,0,0,0,0,0,0,0,0,
++ 0,3,0,0,0,3,0,0,0,67,0,0,0,115,28,0,
++ 0,0,124,0,160,0,161,0,92,2,125,1,125,2,116,1,
++ 116,2,106,3,124,1,25,0,124,2,131,2,83,0,114,72,
++ 0,0,0,41,4,114,62,1,0,0,114,158,0,0,0,114,
++ 18,0,0,0,218,7,109,111,100,117,108,101,115,41,3,114,
++ 146,0,0,0,90,18,112,97,114,101,110,116,95,109,111,100,
++ 117,108,101,95,110,97,109,101,90,14,112,97,116,104,95,97,
++ 116,116,114,95,110,97,109,101,114,7,0,0,0,114,7,0,
++ 0,0,114,8,0,0,0,114,55,1,0,0,212,4,0,0,
++ 115,4,0,0,0,12,1,16,1,122,31,95,78,97,109,101,
++ 115,112,97,99,101,80,97,116,104,46,95,103,101,116,95,112,
++ 97,114,101,110,116,95,112,97,116,104,99,1,0,0,0,0,
++ 0,0,0,0,0,0,0,3,0,0,0,4,0,0,0,67,
++ 0,0,0,115,100,0,0,0,116,0,124,0,160,1,161,0,
++ 131,1,125,1,124,1,124,0,106,2,107,3,115,17,124,0,
++ 106,3,124,0,106,4,107,3,114,47,124,0,160,5,124,0,
++ 106,6,124,1,161,2,125,2,124,2,100,0,117,1,114,40,
++ 124,2,106,7,100,0,117,0,114,40,124,2,106,8,114,40,
++ 124,2,106,8,124,0,95,9,124,1,124,0,95,2,124,0,
++ 106,3,124,0,95,4,124,0,106,9,83,0,114,72,0,0,
++ 0,41,10,114,139,0,0,0,114,55,1,0,0,114,56,1,
++ 0,0,114,57,1,0,0,114,58,1,0,0,114,59,1,0,
++ 0,114,53,1,0,0,114,167,0,0,0,114,205,0,0,0,
++ 114,54,1,0,0,41,3,114,146,0,0,0,90,11,112,97,
++ 114,101,110,116,95,112,97,116,104,114,213,0,0,0,114,7,
++ 0,0,0,114,7,0,0,0,114,8,0,0,0,218,12,95,
++ 114,101,99,97,108,99,117,108,97,116,101,216,4,0,0,115,
++ 18,0,0,0,12,2,22,1,14,1,18,3,6,1,8,1,
++ 6,1,8,1,6,1,122,27,95,78,97,109,101,115,112,97,
++ 99,101,80,97,116,104,46,95,114,101,99,97,108,99,117,108,
++ 97,116,101,99,1,0,0,0,0,0,0,0,0,0,0,0,
++ 1,0,0,0,3,0,0,0,67,0,0,0,243,12,0,0,
++ 0,116,0,124,0,160,1,161,0,131,1,83,0,114,72,0,
++ 0,0,41,2,218,4,105,116,101,114,114,64,1,0,0,114,
++ 24,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
++ 0,0,0,218,8,95,95,105,116,101,114,95,95,230,4,0,
++ 0,243,2,0,0,0,12,1,122,23,95,78,97,109,101,115,
++ 112,97,99,101,80,97,116,104,46,95,95,105,116,101,114,95,
++ 95,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,
++ 0,0,2,0,0,0,67,0,0,0,115,12,0,0,0,124,
++ 0,160,0,161,0,124,1,25,0,83,0,114,72,0,0,0,
++ 169,1,114,64,1,0,0,41,2,114,146,0,0,0,218,5,
++ 105,110,100,101,120,114,7,0,0,0,114,7,0,0,0,114,
++ 8,0,0,0,218,11,95,95,103,101,116,105,116,101,109,95,
++ 95,233,4,0,0,114,68,1,0,0,122,26,95,78,97,109,
++ 101,115,112,97,99,101,80,97,116,104,46,95,95,103,101,116,
++ 105,116,101,109,95,95,99,3,0,0,0,0,0,0,0,0,
++ 0,0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,
++ 14,0,0,0,124,2,124,0,106,0,124,1,60,0,100,0,
++ 83,0,114,72,0,0,0,41,1,114,54,1,0,0,41,3,
++ 114,146,0,0,0,114,70,1,0,0,114,68,0,0,0,114,
++ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,
++ 95,95,115,101,116,105,116,101,109,95,95,236,4,0,0,115,
++ 2,0,0,0,14,1,122,26,95,78,97,109,101,115,112,97,
++ 99,101,80,97,116,104,46,95,95,115,101,116,105,116,101,109,
++ 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1,
++ 0,0,0,3,0,0,0,67,0,0,0,114,65,1,0,0,
++ 114,72,0,0,0,41,2,114,4,0,0,0,114,64,1,0,
++ 0,114,24,1,0,0,114,7,0,0,0,114,7,0,0,0,
++ 114,8,0,0,0,218,7,95,95,108,101,110,95,95,239,4,
++ 0,0,114,68,1,0,0,122,22,95,78,97,109,101,115,112,
++ 97,99,101,80,97,116,104,46,95,95,108,101,110,95,95,99,
+ 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+- 3,0,0,0,67,0,0,0,243,12,0,0,0,116,0,124,
+- 0,160,1,161,0,131,1,83,0,114,69,0,0,0,41,2,
+- 218,4,105,116,101,114,114,59,1,0,0,114,21,1,0,0,
+- 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,
+- 8,95,95,105,116,101,114,95,95,230,4,0,0,243,2,0,
+- 0,0,12,1,122,23,95,78,97,109,101,115,112,97,99,101,
+- 80,97,116,104,46,95,95,105,116,101,114,95,95,99,2,0,
+- 0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,
+- 0,0,67,0,0,0,115,12,0,0,0,124,0,160,0,161,
+- 0,124,1,25,0,83,0,114,69,0,0,0,169,1,114,59,
+- 1,0,0,41,2,114,143,0,0,0,218,5,105,110,100,101,
+- 120,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
+- 218,11,95,95,103,101,116,105,116,101,109,95,95,233,4,0,
+- 0,114,63,1,0,0,122,26,95,78,97,109,101,115,112,97,
+- 99,101,80,97,116,104,46,95,95,103,101,116,105,116,101,109,
+- 95,95,99,3,0,0,0,0,0,0,0,0,0,0,0,3,
+- 0,0,0,3,0,0,0,67,0,0,0,115,14,0,0,0,
+- 124,2,124,0,106,0,124,1,60,0,100,0,83,0,114,69,
+- 0,0,0,41,1,114,49,1,0,0,41,3,114,143,0,0,
+- 0,114,65,1,0,0,114,65,0,0,0,114,7,0,0,0,
+- 114,7,0,0,0,114,8,0,0,0,218,11,95,95,115,101,
+- 116,105,116,101,109,95,95,236,4,0,0,115,2,0,0,0,
+- 14,1,122,26,95,78,97,109,101,115,112,97,99,101,80,97,
+- 116,104,46,95,95,115,101,116,105,116,101,109,95,95,99,1,
+- 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,
+- 0,0,0,67,0,0,0,114,60,1,0,0,114,69,0,0,
+- 0,41,2,114,4,0,0,0,114,59,1,0,0,114,21,1,
+- 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
+- 0,218,7,95,95,108,101,110,95,95,239,4,0,0,114,63,
+- 1,0,0,122,22,95,78,97,109,101,115,112,97,99,101,80,
+- 97,116,104,46,95,95,108,101,110,95,95,99,1,0,0,0,
+- 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,
+- 67,0,0,0,243,12,0,0,0,100,1,160,0,124,0,106,
+- 1,161,1,83,0,41,2,78,122,20,95,78,97,109,101,115,
+- 112,97,99,101,80,97,116,104,40,123,33,114,125,41,41,2,
+- 114,89,0,0,0,114,49,1,0,0,114,21,1,0,0,114,
+- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,8,
+- 95,95,114,101,112,114,95,95,242,4,0,0,114,63,1,0,
+- 0,122,23,95,78,97,109,101,115,112,97,99,101,80,97,116,
+- 104,46,95,95,114,101,112,114,95,95,99,2,0,0,0,0,
+- 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67,
+- 0,0,0,115,12,0,0,0,124,1,124,0,160,0,161,0,
+- 118,0,83,0,114,69,0,0,0,114,64,1,0,0,169,2,
+- 114,143,0,0,0,218,4,105,116,101,109,114,7,0,0,0,
+- 114,7,0,0,0,114,8,0,0,0,218,12,95,95,99,111,
+- 110,116,97,105,110,115,95,95,245,4,0,0,114,63,1,0,
+- 0,122,27,95,78,97,109,101,115,112,97,99,101,80,97,116,
+- 104,46,95,95,99,111,110,116,97,105,110,115,95,95,99,2,
++ 3,0,0,0,67,0,0,0,243,12,0,0,0,100,1,160,
++ 0,124,0,106,1,161,1,83,0,41,2,78,122,20,95,78,
++ 97,109,101,115,112,97,99,101,80,97,116,104,40,123,33,114,
++ 125,41,41,2,114,92,0,0,0,114,54,1,0,0,114,24,
++ 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
++ 0,0,218,8,95,95,114,101,112,114,95,95,242,4,0,0,
++ 114,68,1,0,0,122,23,95,78,97,109,101,115,112,97,99,
++ 101,80,97,116,104,46,95,95,114,101,112,114,95,95,99,2,
+ 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,
+- 0,0,0,67,0,0,0,115,16,0,0,0,124,0,106,0,
+- 160,1,124,1,161,1,1,0,100,0,83,0,114,69,0,0,
+- 0,41,2,114,49,1,0,0,114,61,0,0,0,114,71,1,
++ 0,0,0,67,0,0,0,115,12,0,0,0,124,1,124,0,
++ 160,0,161,0,118,0,83,0,114,72,0,0,0,114,69,1,
++ 0,0,169,2,114,146,0,0,0,218,4,105,116,101,109,114,
++ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,12,
++ 95,95,99,111,110,116,97,105,110,115,95,95,245,4,0,0,
++ 114,68,1,0,0,122,27,95,78,97,109,101,115,112,97,99,
++ 101,80,97,116,104,46,95,95,99,111,110,116,97,105,110,115,
++ 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
++ 0,0,0,3,0,0,0,67,0,0,0,115,16,0,0,0,
++ 124,0,106,0,160,1,124,1,161,1,1,0,100,0,83,0,
++ 114,72,0,0,0,41,2,114,54,1,0,0,114,64,0,0,
++ 0,114,76,1,0,0,114,7,0,0,0,114,7,0,0,0,
++ 114,8,0,0,0,114,64,0,0,0,248,4,0,0,243,2,
++ 0,0,0,16,1,122,21,95,78,97,109,101,115,112,97,99,
++ 101,80,97,116,104,46,97,112,112,101,110,100,78,41,16,114,
++ 153,0,0,0,114,152,0,0,0,114,154,0,0,0,114,155,
++ 0,0,0,114,57,1,0,0,114,239,0,0,0,114,62,1,
++ 0,0,114,55,1,0,0,114,64,1,0,0,114,67,1,0,
++ 0,114,71,1,0,0,114,72,1,0,0,114,73,1,0,0,
++ 114,75,1,0,0,114,78,1,0,0,114,64,0,0,0,114,
++ 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
++ 0,0,0,114,52,1,0,0,184,4,0,0,115,28,0,0,
++ 0,8,0,4,1,4,8,8,2,8,7,8,10,8,4,8,
++ 14,8,3,8,3,8,3,8,3,8,3,12,3,114,52,1,
++ 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,
++ 0,0,0,3,0,0,0,64,0,0,0,115,88,0,0,0,
++ 101,0,90,1,100,0,90,2,100,1,100,2,132,0,90,3,
++ 101,4,100,3,100,4,132,0,131,1,90,5,100,5,100,6,
++ 132,0,90,6,100,7,100,8,132,0,90,7,100,9,100,10,
++ 132,0,90,8,100,11,100,12,132,0,90,9,100,13,100,14,
++ 132,0,90,10,100,15,100,16,132,0,90,11,100,17,100,18,
++ 132,0,90,12,100,19,83,0,41,20,218,16,95,78,97,109,
++ 101,115,112,97,99,101,76,111,97,100,101,114,99,4,0,0,
++ 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,
++ 0,67,0,0,0,115,18,0,0,0,116,0,124,1,124,2,
++ 124,3,131,3,124,0,95,1,100,0,83,0,114,72,0,0,
++ 0,41,2,114,52,1,0,0,114,54,1,0,0,114,60,1,
+ 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
+- 0,114,61,0,0,0,248,4,0,0,243,2,0,0,0,16,
+- 1,122,21,95,78,97,109,101,115,112,97,99,101,80,97,116,
+- 104,46,97,112,112,101,110,100,78,41,16,114,150,0,0,0,
+- 114,149,0,0,0,114,151,0,0,0,114,152,0,0,0,114,
+- 52,1,0,0,114,236,0,0,0,114,57,1,0,0,114,50,
+- 1,0,0,114,59,1,0,0,114,62,1,0,0,114,66,1,
+- 0,0,114,67,1,0,0,114,68,1,0,0,114,70,1,0,
+- 0,114,73,1,0,0,114,61,0,0,0,114,7,0,0,0,
++ 0,114,239,0,0,0,254,4,0,0,115,2,0,0,0,18,
++ 1,122,25,95,78,97,109,101,115,112,97,99,101,76,111,97,
++ 100,101,114,46,95,95,105,110,105,116,95,95,99,1,0,0,
++ 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,
++ 0,67,0,0,0,115,24,0,0,0,116,0,160,1,100,1,
++ 116,2,161,2,1,0,100,2,160,3,124,0,106,4,161,1,
++ 83,0,41,3,122,115,82,101,116,117,114,110,32,114,101,112,
++ 114,32,102,111,114,32,116,104,101,32,109,111,100,117,108,101,
++ 46,10,10,32,32,32,32,32,32,32,32,84,104,101,32,109,
++ 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,
++ 116,101,100,46,32,32,84,104,101,32,105,109,112,111,114,116,
++ 32,109,97,99,104,105,110,101,114,121,32,100,111,101,115,32,
++ 116,104,101,32,106,111,98,32,105,116,115,101,108,102,46,10,
++ 10,32,32,32,32,32,32,32,32,122,82,95,78,97,109,101,
++ 115,112,97,99,101,76,111,97,100,101,114,46,109,111,100,117,
++ 108,101,95,114,101,112,114,40,41,32,105,115,32,100,101,112,
++ 114,101,99,97,116,101,100,32,97,110,100,32,115,108,97,116,
++ 101,100,32,102,111,114,32,114,101,109,111,118,97,108,32,105,
++ 110,32,80,121,116,104,111,110,32,51,46,49,50,122,25,60,
++ 109,111,100,117,108,101,32,123,33,114,125,32,40,110,97,109,
++ 101,115,112,97,99,101,41,62,41,5,114,102,0,0,0,114,
++ 103,0,0,0,114,104,0,0,0,114,92,0,0,0,114,153,
++ 0,0,0,41,1,114,247,0,0,0,114,7,0,0,0,114,
++ 7,0,0,0,114,8,0,0,0,218,11,109,111,100,117,108,
++ 101,95,114,101,112,114,1,5,0,0,115,8,0,0,0,6,
++ 7,2,1,4,255,12,2,122,28,95,78,97,109,101,115,112,
++ 97,99,101,76,111,97,100,101,114,46,109,111,100,117,108,101,
++ 95,114,101,112,114,99,2,0,0,0,0,0,0,0,0,0,
++ 0,0,2,0,0,0,1,0,0,0,67,0,0,0,114,26,
++ 0,0,0,41,2,78,84,114,7,0,0,0,114,250,0,0,
++ 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
++ 114,209,0,0,0,12,5,0,0,243,2,0,0,0,4,1,
++ 122,27,95,78,97,109,101,115,112,97,99,101,76,111,97,100,
++ 101,114,46,105,115,95,112,97,99,107,97,103,101,99,2,0,
++ 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,
++ 0,0,67,0,0,0,114,26,0,0,0,41,2,78,114,10,
++ 0,0,0,114,7,0,0,0,114,250,0,0,0,114,7,0,
++ 0,0,114,7,0,0,0,114,8,0,0,0,114,4,1,0,
++ 0,15,5,0,0,114,82,1,0,0,122,27,95,78,97,109,
++ 101,115,112,97,99,101,76,111,97,100,101,114,46,103,101,116,
++ 95,115,111,117,114,99,101,99,2,0,0,0,0,0,0,0,
++ 0,0,0,0,2,0,0,0,6,0,0,0,67,0,0,0,
++ 115,16,0,0,0,116,0,100,1,100,2,100,3,100,4,100,
++ 5,141,4,83,0,41,6,78,114,10,0,0,0,122,8,60,
++ 115,116,114,105,110,103,62,114,246,0,0,0,84,41,1,114,
++ 6,1,0,0,41,1,114,7,1,0,0,114,250,0,0,0,
+ 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
+- 47,1,0,0,184,4,0,0,115,28,0,0,0,8,0,4,
+- 1,4,8,8,2,8,7,8,10,8,4,8,14,8,3,8,
+- 3,8,3,8,3,8,3,12,3,114,47,1,0,0,99,0,
+- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,
+- 0,0,0,64,0,0,0,115,88,0,0,0,101,0,90,1,
+- 100,0,90,2,100,1,100,2,132,0,90,3,101,4,100,3,
+- 100,4,132,0,131,1,90,5,100,5,100,6,132,0,90,6,
+- 100,7,100,8,132,0,90,7,100,9,100,10,132,0,90,8,
+- 100,11,100,12,132,0,90,9,100,13,100,14,132,0,90,10,
+- 100,15,100,16,132,0,90,11,100,17,100,18,132,0,90,12,
+- 100,19,83,0,41,20,218,16,95,78,97,109,101,115,112,97,
+- 99,101,76,111,97,100,101,114,99,4,0,0,0,0,0,0,
+- 0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,
+- 0,115,18,0,0,0,116,0,124,1,124,2,124,3,131,3,
+- 124,0,95,1,100,0,83,0,114,69,0,0,0,41,2,114,
+- 47,1,0,0,114,49,1,0,0,114,55,1,0,0,114,7,
+- 0,0,0,114,7,0,0,0,114,8,0,0,0,114,236,0,
+- 0,0,254,4,0,0,115,2,0,0,0,18,1,122,25,95,
++ 244,0,0,0,18,5,0,0,114,79,1,0,0,122,25,95,
+ 78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,
+- 95,95,105,110,105,116,95,95,99,1,0,0,0,0,0,0,
+- 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0,
+- 0,115,24,0,0,0,116,0,160,1,100,1,116,2,161,2,
+- 1,0,100,2,160,3,124,0,106,4,161,1,83,0,41,3,
+- 122,115,82,101,116,117,114,110,32,114,101,112,114,32,102,111,
+- 114,32,116,104,101,32,109,111,100,117,108,101,46,10,10,32,
+- 32,32,32,32,32,32,32,84,104,101,32,109,101,116,104,111,
+- 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,
+- 32,32,84,104,101,32,105,109,112,111,114,116,32,109,97,99,
+- 104,105,110,101,114,121,32,100,111,101,115,32,116,104,101,32,
+- 106,111,98,32,105,116,115,101,108,102,46,10,10,32,32,32,
+- 32,32,32,32,32,122,82,95,78,97,109,101,115,112,97,99,
+- 101,76,111,97,100,101,114,46,109,111,100,117,108,101,95,114,
+- 101,112,114,40,41,32,105,115,32,100,101,112,114,101,99,97,
+- 116,101,100,32,97,110,100,32,115,108,97,116,101,100,32,102,
+- 111,114,32,114,101,109,111,118,97,108,32,105,110,32,80,121,
+- 116,104,111,110,32,51,46,49,50,122,25,60,109,111,100,117,
+- 108,101,32,123,33,114,125,32,40,110,97,109,101,115,112,97,
+- 99,101,41,62,41,5,114,99,0,0,0,114,100,0,0,0,
+- 114,101,0,0,0,114,89,0,0,0,114,150,0,0,0,41,
+- 1,114,244,0,0,0,114,7,0,0,0,114,7,0,0,0,
+- 114,8,0,0,0,218,11,109,111,100,117,108,101,95,114,101,
+- 112,114,1,5,0,0,115,8,0,0,0,6,7,2,1,4,
+- 255,12,2,122,28,95,78,97,109,101,115,112,97,99,101,76,
+- 111,97,100,101,114,46,109,111,100,117,108,101,95,114,101,112,
+- 114,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,
+- 0,0,1,0,0,0,67,0,0,0,114,23,0,0,0,41,
+- 2,78,84,114,7,0,0,0,114,247,0,0,0,114,7,0,
+- 0,0,114,7,0,0,0,114,8,0,0,0,114,206,0,0,
+- 0,12,5,0,0,243,2,0,0,0,4,1,122,27,95,78,
+- 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,105,
+- 115,95,112,97,99,107,97,103,101,99,2,0,0,0,0,0,
+- 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,
+- 0,0,114,23,0,0,0,41,2,78,114,10,0,0,0,114,
+- 7,0,0,0,114,247,0,0,0,114,7,0,0,0,114,7,
+- 0,0,0,114,8,0,0,0,114,1,1,0,0,15,5,0,
+- 0,114,77,1,0,0,122,27,95,78,97,109,101,115,112,97,
+- 99,101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,
+- 114,99,101,99,2,0,0,0,0,0,0,0,0,0,0,0,
+- 2,0,0,0,6,0,0,0,67,0,0,0,115,16,0,0,
+- 0,116,0,100,1,100,2,100,3,100,4,100,5,141,4,83,
+- 0,41,6,78,114,10,0,0,0,122,8,60,115,116,114,105,
+- 110,103,62,114,243,0,0,0,84,41,1,114,3,1,0,0,
+- 41,1,114,4,1,0,0,114,247,0,0,0,114,7,0,0,
+- 0,114,7,0,0,0,114,8,0,0,0,114,241,0,0,0,
+- 18,5,0,0,114,74,1,0,0,122,25,95,78,97,109,101,
+- 115,112,97,99,101,76,111,97,100,101,114,46,103,101,116,95,
+- 99,111,100,101,99,2,0,0,0,0,0,0,0,0,0,0,
+- 0,2,0,0,0,1,0,0,0,67,0,0,0,114,23,0,
+- 0,0,114,237,0,0,0,114,7,0,0,0,114,238,0,0,
+- 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
+- 114,239,0,0,0,21,5,0,0,114,240,0,0,0,122,30,
+- 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,
+- 46,99,114,101,97,116,101,95,109,111,100,117,108,101,99,2,
+- 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,
+- 0,0,0,67,0,0,0,115,4,0,0,0,100,0,83,0,
+- 114,69,0,0,0,114,7,0,0,0,114,42,1,0,0,114,
+- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,245,
+- 0,0,0,24,5,0,0,114,77,1,0,0,122,28,95,78,
+- 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,101,
+- 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0,
+- 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67,
+- 0,0,0,115,26,0,0,0,116,0,160,1,100,1,124,0,
+- 106,2,161,2,1,0,116,0,160,3,124,0,124,1,161,2,
+- 83,0,41,2,122,98,76,111,97,100,32,97,32,110,97,109,
+- 101,115,112,97,99,101,32,109,111,100,117,108,101,46,10,10,
++ 103,101,116,95,99,111,100,101,99,2,0,0,0,0,0,0,
++ 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,
++ 0,114,26,0,0,0,114,240,0,0,0,114,7,0,0,0,
++ 114,241,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
++ 8,0,0,0,114,242,0,0,0,21,5,0,0,114,243,0,
++ 0,0,122,30,95,78,97,109,101,115,112,97,99,101,76,111,
++ 97,100,101,114,46,99,114,101,97,116,101,95,109,111,100,117,
++ 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
++ 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,
++ 100,0,83,0,114,72,0,0,0,114,7,0,0,0,114,47,
++ 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
++ 0,0,114,248,0,0,0,24,5,0,0,114,82,1,0,0,
++ 122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,
++ 101,114,46,101,120,101,99,95,109,111,100,117,108,101,99,2,
++ 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,
++ 0,0,0,67,0,0,0,115,26,0,0,0,116,0,160,1,
++ 100,1,124,0,106,2,161,2,1,0,116,0,160,3,124,0,
++ 124,1,161,2,83,0,41,2,122,98,76,111,97,100,32,97,
++ 32,110,97,109,101,115,112,97,99,101,32,109,111,100,117,108,
++ 101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,
++ 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,
++ 99,97,116,101,100,46,32,32,85,115,101,32,101,120,101,99,
++ 95,109,111,100,117,108,101,40,41,32,105,110,115,116,101,97,
++ 100,46,10,10,32,32,32,32,32,32,32,32,122,38,110,97,
++ 109,101,115,112,97,99,101,32,109,111,100,117,108,101,32,108,
++ 111,97,100,101,100,32,119,105,116,104,32,112,97,116,104,32,
++ 123,33,114,125,41,4,114,162,0,0,0,114,176,0,0,0,
++ 114,54,1,0,0,114,249,0,0,0,114,250,0,0,0,114,
++ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,251,
++ 0,0,0,27,5,0,0,115,8,0,0,0,6,7,4,1,
++ 4,255,12,3,122,28,95,78,97,109,101,115,112,97,99,101,
++ 76,111,97,100,101,114,46,108,111,97,100,95,109,111,100,117,
++ 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,3,
++ 0,0,0,2,0,0,0,67,0,0,0,115,22,0,0,0,
++ 100,1,100,2,108,0,109,1,125,2,1,0,124,2,124,0,
++ 106,2,131,1,83,0,41,3,78,114,0,0,0,0,41,1,
++ 218,15,78,97,109,101,115,112,97,99,101,82,101,97,100,101,
++ 114,41,3,114,36,1,0,0,114,83,1,0,0,114,54,1,
++ 0,0,41,3,114,146,0,0,0,114,247,0,0,0,114,83,
++ 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
++ 0,0,114,37,1,0,0,39,5,0,0,115,4,0,0,0,
++ 12,1,10,1,122,36,95,78,97,109,101,115,112,97,99,101,
++ 76,111,97,100,101,114,46,103,101,116,95,114,101,115,111,117,
++ 114,99,101,95,114,101,97,100,101,114,78,41,13,114,153,0,
++ 0,0,114,152,0,0,0,114,154,0,0,0,114,239,0,0,
++ 0,114,236,0,0,0,114,81,1,0,0,114,209,0,0,0,
++ 114,4,1,0,0,114,244,0,0,0,114,242,0,0,0,114,
++ 248,0,0,0,114,251,0,0,0,114,37,1,0,0,114,7,
++ 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
++ 0,0,114,80,1,0,0,253,4,0,0,115,22,0,0,0,
++ 8,0,8,1,2,3,10,1,8,10,8,3,8,3,8,3,
++ 8,3,8,3,12,12,114,80,1,0,0,99,0,0,0,0,
++ 0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
++ 64,0,0,0,115,118,0,0,0,101,0,90,1,100,0,90,
++ 2,100,1,90,3,101,4,100,2,100,3,132,0,131,1,90,
++ 5,101,4,100,4,100,5,132,0,131,1,90,6,101,7,100,
++ 6,100,7,132,0,131,1,90,8,101,7,100,8,100,9,132,
++ 0,131,1,90,9,101,7,100,19,100,11,100,12,132,1,131,
++ 1,90,10,101,7,100,20,100,13,100,14,132,1,131,1,90,
++ 11,101,7,100,19,100,15,100,16,132,1,131,1,90,12,101,
++ 4,100,17,100,18,132,0,131,1,90,13,100,10,83,0,41,
++ 21,218,10,80,97,116,104,70,105,110,100,101,114,122,62,77,
++ 101,116,97,32,112,97,116,104,32,102,105,110,100,101,114,32,
++ 102,111,114,32,115,121,115,46,112,97,116,104,32,97,110,100,
++ 32,112,97,99,107,97,103,101,32,95,95,112,97,116,104,95,
++ 95,32,97,116,116,114,105,98,117,116,101,115,46,99,0,0,
++ 0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,
++ 0,0,67,0,0,0,115,78,0,0,0,116,0,116,1,106,
++ 2,160,3,161,0,131,1,68,0,93,22,92,2,125,0,125,
++ 1,124,1,100,1,117,0,114,20,116,1,106,2,124,0,61,
++ 0,113,7,116,4,124,1,100,2,131,2,114,29,124,1,160,
++ 5,161,0,1,0,113,7,116,6,4,0,106,7,100,3,55,
++ 0,2,0,95,7,100,1,83,0,41,4,122,125,67,97,108,
++ 108,32,116,104,101,32,105,110,118,97,108,105,100,97,116,101,
++ 95,99,97,99,104,101,115,40,41,32,109,101,116,104,111,100,
++ 32,111,110,32,97,108,108,32,112,97,116,104,32,101,110,116,
++ 114,121,32,102,105,110,100,101,114,115,10,32,32,32,32,32,
++ 32,32,32,115,116,111,114,101,100,32,105,110,32,115,121,115,
++ 46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,
++ 97,99,104,101,115,32,40,119,104,101,114,101,32,105,109,112,
++ 108,101,109,101,110,116,101,100,41,46,78,218,17,105,110,118,
++ 97,108,105,100,97,116,101,95,99,97,99,104,101,115,114,3,
++ 0,0,0,41,8,218,4,108,105,115,116,114,18,0,0,0,
++ 218,19,112,97,116,104,95,105,109,112,111,114,116,101,114,95,
++ 99,97,99,104,101,218,5,105,116,101,109,115,114,156,0,0,
++ 0,114,85,1,0,0,114,52,1,0,0,114,57,1,0,0,
++ 41,2,114,144,0,0,0,218,6,102,105,110,100,101,114,114,
++ 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,85,
++ 1,0,0,50,5,0,0,115,14,0,0,0,22,4,8,1,
++ 10,1,10,1,8,1,2,128,18,3,122,28,80,97,116,104,
++ 70,105,110,100,101,114,46,105,110,118,97,108,105,100,97,116,
++ 101,95,99,97,99,104,101,115,99,1,0,0,0,0,0,0,
++ 0,0,0,0,0,2,0,0,0,9,0,0,0,67,0,0,
++ 0,115,76,0,0,0,116,0,106,1,100,1,117,1,114,14,
++ 116,0,106,1,115,14,116,2,160,3,100,2,116,4,161,2,
++ 1,0,116,0,106,1,68,0,93,18,125,1,122,7,124,1,
++ 124,0,131,1,87,0,2,0,1,0,83,0,4,0,116,5,
++ 121,35,1,0,1,0,1,0,89,0,113,17,119,0,100,1,
++ 83,0,41,3,122,46,83,101,97,114,99,104,32,115,121,115,
++ 46,112,97,116,104,95,104,111,111,107,115,32,102,111,114,32,
++ 97,32,102,105,110,100,101,114,32,102,111,114,32,39,112,97,
++ 116,104,39,46,78,122,23,115,121,115,46,112,97,116,104,95,
++ 104,111,111,107,115,32,105,115,32,101,109,112,116,121,41,6,
++ 114,18,0,0,0,218,10,112,97,116,104,95,104,111,111,107,
++ 115,114,102,0,0,0,114,103,0,0,0,114,165,0,0,0,
++ 114,145,0,0,0,41,2,114,68,0,0,0,90,4,104,111,
++ 111,107,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
++ 0,218,11,95,112,97,116,104,95,104,111,111,107,115,63,5,
++ 0,0,115,18,0,0,0,16,3,12,1,10,1,2,1,14,
++ 1,12,1,4,1,2,255,4,3,122,22,80,97,116,104,70,
++ 105,110,100,101,114,46,95,112,97,116,104,95,104,111,111,107,
++ 115,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,
++ 0,0,8,0,0,0,67,0,0,0,115,100,0,0,0,124,
++ 1,100,1,107,2,114,21,122,6,116,0,160,1,161,0,125,
++ 1,87,0,110,10,4,0,116,2,121,20,1,0,1,0,1,
++ 0,89,0,100,2,83,0,119,0,122,8,116,3,106,4,124,
++ 1,25,0,125,2,87,0,124,2,83,0,4,0,116,5,121,
++ 49,1,0,1,0,1,0,124,0,160,6,124,1,161,1,125,
++ 2,124,2,116,3,106,4,124,1,60,0,89,0,124,2,83,
++ 0,119,0,41,3,122,210,71,101,116,32,116,104,101,32,102,
++ 105,110,100,101,114,32,102,111,114,32,116,104,101,32,112,97,
++ 116,104,32,101,110,116,114,121,32,102,114,111,109,32,115,121,
++ 115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,
++ 99,97,99,104,101,46,10,10,32,32,32,32,32,32,32,32,
++ 73,102,32,116,104,101,32,112,97,116,104,32,101,110,116,114,
++ 121,32,105,115,32,110,111,116,32,105,110,32,116,104,101,32,
++ 99,97,99,104,101,44,32,102,105,110,100,32,116,104,101,32,
++ 97,112,112,114,111,112,114,105,97,116,101,32,102,105,110,100,
++ 101,114,10,32,32,32,32,32,32,32,32,97,110,100,32,99,
++ 97,99,104,101,32,105,116,46,32,73,102,32,110,111,32,102,
++ 105,110,100,101,114,32,105,115,32,97,118,97,105,108,97,98,
++ 108,101,44,32,115,116,111,114,101,32,78,111,110,101,46,10,
++ 10,32,32,32,32,32,32,32,32,114,10,0,0,0,78,41,
++ 7,114,21,0,0,0,114,85,0,0,0,218,17,70,105,108,
++ 101,78,111,116,70,111,117,110,100,69,114,114,111,114,114,18,
++ 0,0,0,114,87,1,0,0,218,8,75,101,121,69,114,114,
++ 111,114,114,91,1,0,0,41,3,114,224,0,0,0,114,68,
++ 0,0,0,114,89,1,0,0,114,7,0,0,0,114,7,0,
++ 0,0,114,8,0,0,0,218,20,95,112,97,116,104,95,105,
++ 109,112,111,114,116,101,114,95,99,97,99,104,101,76,5,0,
++ 0,115,28,0,0,0,8,8,2,1,12,1,12,1,6,3,
++ 2,253,2,4,12,1,4,4,12,253,10,1,12,1,4,1,
++ 2,253,122,31,80,97,116,104,70,105,110,100,101,114,46,95,
++ 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,
++ 99,104,101,99,3,0,0,0,0,0,0,0,0,0,0,0,
++ 7,0,0,0,4,0,0,0,67,0,0,0,115,138,0,0,
++ 0,116,0,124,2,100,1,131,2,114,27,116,1,160,2,124,
++ 2,161,1,155,0,100,2,157,2,125,3,116,3,160,4,124,
++ 3,116,5,161,2,1,0,124,2,160,6,124,1,161,1,92,
++ 2,125,4,125,5,110,21,116,1,160,2,124,2,161,1,155,
++ 0,100,3,157,2,125,3,116,3,160,4,124,3,116,5,161,
++ 2,1,0,124,2,160,7,124,1,161,1,125,4,103,0,125,
++ 5,124,4,100,0,117,1,114,58,116,1,160,8,124,1,124,
++ 4,161,2,83,0,116,1,160,9,124,1,100,0,161,2,125,
++ 6,124,5,124,6,95,10,124,6,83,0,41,4,78,114,164,
++ 0,0,0,122,53,46,102,105,110,100,95,115,112,101,99,40,
++ 41,32,110,111,116,32,102,111,117,110,100,59,32,102,97,108,
++ 108,105,110,103,32,98,97,99,107,32,116,111,32,102,105,110,
++ 100,95,108,111,97,100,101,114,40,41,122,53,46,102,105,110,
++ 100,95,115,112,101,99,40,41,32,110,111,116,32,102,111,117,
++ 110,100,59,32,102,97,108,108,105,110,103,32,98,97,99,107,
++ 32,116,111,32,102,105,110,100,95,109,111,100,117,108,101,40,
++ 41,41,11,114,156,0,0,0,114,162,0,0,0,90,12,95,
++ 111,98,106,101,99,116,95,110,97,109,101,114,102,0,0,0,
++ 114,103,0,0,0,114,165,0,0,0,114,164,0,0,0,114,
++ 232,0,0,0,114,227,0,0,0,114,210,0,0,0,114,205,
++ 0,0,0,41,7,114,224,0,0,0,114,166,0,0,0,114,
++ 89,1,0,0,114,169,0,0,0,114,167,0,0,0,114,168,
++ 0,0,0,114,213,0,0,0,114,7,0,0,0,114,7,0,
++ 0,0,114,8,0,0,0,218,16,95,108,101,103,97,99,121,
++ 95,103,101,116,95,115,112,101,99,98,5,0,0,115,26,0,
++ 0,0,10,4,16,1,12,2,16,1,16,2,12,2,10,1,
++ 4,1,8,1,12,1,12,1,6,1,4,1,122,27,80,97,
++ 116,104,70,105,110,100,101,114,46,95,108,101,103,97,99,121,
++ 95,103,101,116,95,115,112,101,99,78,99,4,0,0,0,0,
++ 0,0,0,0,0,0,0,9,0,0,0,5,0,0,0,67,
++ 0,0,0,115,166,0,0,0,103,0,125,4,124,2,68,0,
++ 93,67,125,5,116,0,124,5,116,1,116,2,102,2,131,2,
++ 115,14,113,4,124,0,160,3,124,5,161,1,125,6,124,6,
++ 100,1,117,1,114,71,116,4,124,6,100,2,131,2,114,35,
++ 124,6,160,5,124,1,124,3,161,2,125,7,110,6,124,0,
++ 160,6,124,1,124,6,161,2,125,7,124,7,100,1,117,0,
++ 114,46,113,4,124,7,106,7,100,1,117,1,114,55,124,7,
++ 2,0,1,0,83,0,124,7,106,8,125,8,124,8,100,1,
++ 117,0,114,66,116,9,100,3,131,1,130,1,124,4,160,10,
++ 124,8,161,1,1,0,113,4,116,11,160,12,124,1,100,1,
++ 161,2,125,7,124,4,124,7,95,8,124,7,83,0,41,4,
++ 122,63,70,105,110,100,32,116,104,101,32,108,111,97,100,101,
++ 114,32,111,114,32,110,97,109,101,115,112,97,99,101,95,112,
++ 97,116,104,32,102,111,114,32,116,104,105,115,32,109,111,100,
++ 117,108,101,47,112,97,99,107,97,103,101,32,110,97,109,101,
++ 46,78,114,229,0,0,0,122,19,115,112,101,99,32,109,105,
++ 115,115,105,110,103,32,108,111,97,100,101,114,41,13,114,188,
++ 0,0,0,114,112,0,0,0,218,5,98,121,116,101,115,114,
++ 94,1,0,0,114,156,0,0,0,114,229,0,0,0,114,95,
++ 1,0,0,114,167,0,0,0,114,205,0,0,0,114,145,0,
++ 0,0,114,194,0,0,0,114,162,0,0,0,114,210,0,0,
++ 0,41,9,114,224,0,0,0,114,166,0,0,0,114,68,0,
++ 0,0,114,228,0,0,0,218,14,110,97,109,101,115,112,97,
++ 99,101,95,112,97,116,104,90,5,101,110,116,114,121,114,89,
++ 1,0,0,114,213,0,0,0,114,168,0,0,0,114,7,0,
++ 0,0,114,7,0,0,0,114,8,0,0,0,218,9,95,103,
++ 101,116,95,115,112,101,99,119,5,0,0,115,42,0,0,0,
++ 4,5,8,1,14,1,2,1,10,1,8,1,10,1,14,1,
++ 12,2,8,1,2,1,10,1,8,1,6,1,8,1,8,1,
++ 10,5,2,128,12,2,6,1,4,1,122,20,80,97,116,104,
++ 70,105,110,100,101,114,46,95,103,101,116,95,115,112,101,99,
++ 99,4,0,0,0,0,0,0,0,0,0,0,0,6,0,0,
++ 0,5,0,0,0,67,0,0,0,115,94,0,0,0,124,2,
++ 100,1,117,0,114,7,116,0,106,1,125,2,124,0,160,2,
++ 124,1,124,2,124,3,161,3,125,4,124,4,100,1,117,0,
++ 114,20,100,1,83,0,124,4,106,3,100,1,117,0,114,45,
++ 124,4,106,4,125,5,124,5,114,43,100,1,124,4,95,5,
++ 116,6,124,1,124,5,124,0,106,2,131,3,124,4,95,4,
++ 124,4,83,0,100,1,83,0,124,4,83,0,41,2,122,141,
++ 84,114,121,32,116,111,32,102,105,110,100,32,97,32,115,112,
++ 101,99,32,102,111,114,32,39,102,117,108,108,110,97,109,101,
++ 39,32,111,110,32,115,121,115,46,112,97,116,104,32,111,114,
++ 32,39,112,97,116,104,39,46,10,10,32,32,32,32,32,32,
++ 32,32,84,104,101,32,115,101,97,114,99,104,32,105,115,32,
++ 98,97,115,101,100,32,111,110,32,115,121,115,46,112,97,116,
++ 104,95,104,111,111,107,115,32,97,110,100,32,115,121,115,46,
++ 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,
++ 99,104,101,46,10,32,32,32,32,32,32,32,32,78,41,7,
++ 114,18,0,0,0,114,68,0,0,0,114,98,1,0,0,114,
++ 167,0,0,0,114,205,0,0,0,114,208,0,0,0,114,52,
++ 1,0,0,41,6,114,224,0,0,0,114,166,0,0,0,114,
++ 68,0,0,0,114,228,0,0,0,114,213,0,0,0,114,97,
++ 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
++ 0,0,114,229,0,0,0,151,5,0,0,115,26,0,0,0,
++ 8,6,6,1,14,1,8,1,4,1,10,1,6,1,4,1,
++ 6,3,16,1,4,1,4,2,4,2,122,20,80,97,116,104,
++ 70,105,110,100,101,114,46,102,105,110,100,95,115,112,101,99,
++ 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
++ 0,4,0,0,0,67,0,0,0,115,42,0,0,0,116,0,
++ 160,1,100,1,116,2,161,2,1,0,124,0,160,3,124,1,
++ 124,2,161,2,125,3,124,3,100,2,117,0,114,18,100,2,
++ 83,0,124,3,106,4,83,0,41,3,122,170,102,105,110,100,
++ 32,116,104,101,32,109,111,100,117,108,101,32,111,110,32,115,
++ 121,115,46,112,97,116,104,32,111,114,32,39,112,97,116,104,
++ 39,32,98,97,115,101,100,32,111,110,32,115,121,115,46,112,
++ 97,116,104,95,104,111,111,107,115,32,97,110,100,10,32,32,
++ 32,32,32,32,32,32,115,121,115,46,112,97,116,104,95,105,
++ 109,112,111,114,116,101,114,95,99,97,99,104,101,46,10,10,
+ 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,
+ 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,
+- 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100,
+- 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10,
+- 32,32,32,32,32,32,32,32,122,38,110,97,109,101,115,112,
+- 97,99,101,32,109,111,100,117,108,101,32,108,111,97,100,101,
+- 100,32,119,105,116,104,32,112,97,116,104,32,123,33,114,125,
+- 41,4,114,159,0,0,0,114,173,0,0,0,114,49,1,0,
+- 0,114,246,0,0,0,114,247,0,0,0,114,7,0,0,0,
+- 114,7,0,0,0,114,8,0,0,0,114,248,0,0,0,27,
+- 5,0,0,115,8,0,0,0,6,7,4,1,4,255,12,3,
+- 122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,
+- 101,114,46,108,111,97,100,95,109,111,100,117,108,101,99,2,
+- 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,
+- 0,0,0,67,0,0,0,115,22,0,0,0,100,1,100,2,
+- 108,0,109,1,125,2,1,0,124,2,124,0,106,2,131,1,
+- 83,0,41,3,78,114,0,0,0,0,41,1,218,15,78,97,
+- 109,101,115,112,97,99,101,82,101,97,100,101,114,41,3,114,
+- 32,1,0,0,114,78,1,0,0,114,49,1,0,0,41,3,
+- 114,143,0,0,0,114,244,0,0,0,114,78,1,0,0,114,
+- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,33,
+- 1,0,0,39,5,0,0,115,4,0,0,0,12,1,10,1,
+- 122,36,95,78,97,109,101,115,112,97,99,101,76,111,97,100,
+- 101,114,46,103,101,116,95,114,101,115,111,117,114,99,101,95,
+- 114,101,97,100,101,114,78,41,13,114,150,0,0,0,114,149,
+- 0,0,0,114,151,0,0,0,114,236,0,0,0,114,233,0,
+- 0,0,114,76,1,0,0,114,206,0,0,0,114,1,1,0,
+- 0,114,241,0,0,0,114,239,0,0,0,114,245,0,0,0,
+- 114,248,0,0,0,114,33,1,0,0,114,7,0,0,0,114,
+- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,75,
+- 1,0,0,253,4,0,0,115,22,0,0,0,8,0,8,1,
+- 2,3,10,1,8,10,8,3,8,3,8,3,8,3,8,3,
+- 12,12,114,75,1,0,0,99,0,0,0,0,0,0,0,0,
+- 0,0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,
+- 115,118,0,0,0,101,0,90,1,100,0,90,2,100,1,90,
+- 3,101,4,100,2,100,3,132,0,131,1,90,5,101,4,100,
+- 4,100,5,132,0,131,1,90,6,101,7,100,6,100,7,132,
+- 0,131,1,90,8,101,7,100,8,100,9,132,0,131,1,90,
+- 9,101,7,100,19,100,11,100,12,132,1,131,1,90,10,101,
+- 7,100,20,100,13,100,14,132,1,131,1,90,11,101,7,100,
+- 19,100,15,100,16,132,1,131,1,90,12,101,4,100,17,100,
+- 18,132,0,131,1,90,13,100,10,83,0,41,21,218,10,80,
+- 97,116,104,70,105,110,100,101,114,122,62,77,101,116,97,32,
+- 112,97,116,104,32,102,105,110,100,101,114,32,102,111,114,32,
+- 115,121,115,46,112,97,116,104,32,97,110,100,32,112,97,99,
+- 107,97,103,101,32,95,95,112,97,116,104,95,95,32,97,116,
+- 116,114,105,98,117,116,101,115,46,99,0,0,0,0,0,0,
+- 0,0,0,0,0,0,2,0,0,0,4,0,0,0,67,0,
+- 0,0,115,78,0,0,0,116,0,116,1,106,2,160,3,161,
+- 0,131,1,68,0,93,22,92,2,125,0,125,1,124,1,100,
+- 1,117,0,114,20,116,1,106,2,124,0,61,0,113,7,116,
+- 4,124,1,100,2,131,2,114,29,124,1,160,5,161,0,1,
+- 0,113,7,116,6,4,0,106,7,100,3,55,0,2,0,95,
+- 7,100,1,83,0,41,4,122,125,67,97,108,108,32,116,104,
+- 101,32,105,110,118,97,108,105,100,97,116,101,95,99,97,99,
+- 104,101,115,40,41,32,109,101,116,104,111,100,32,111,110,32,
+- 97,108,108,32,112,97,116,104,32,101,110,116,114,121,32,102,
+- 105,110,100,101,114,115,10,32,32,32,32,32,32,32,32,115,
+- 116,111,114,101,100,32,105,110,32,115,121,115,46,112,97,116,
+- 104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,
+- 115,32,40,119,104,101,114,101,32,105,109,112,108,101,109,101,
+- 110,116,101,100,41,46,78,218,17,105,110,118,97,108,105,100,
+- 97,116,101,95,99,97,99,104,101,115,114,3,0,0,0,41,
+- 8,218,4,108,105,115,116,114,15,0,0,0,218,19,112,97,
+- 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,
+- 101,218,5,105,116,101,109,115,114,153,0,0,0,114,80,1,
+- 0,0,114,47,1,0,0,114,52,1,0,0,41,2,114,141,
+- 0,0,0,218,6,102,105,110,100,101,114,114,7,0,0,0,
+- 114,7,0,0,0,114,8,0,0,0,114,80,1,0,0,50,
+- 5,0,0,115,14,0,0,0,22,4,8,1,10,1,10,1,
+- 8,1,2,128,18,3,122,28,80,97,116,104,70,105,110,100,
+- 101,114,46,105,110,118,97,108,105,100,97,116,101,95,99,97,
+- 99,104,101,115,99,1,0,0,0,0,0,0,0,0,0,0,
+- 0,2,0,0,0,9,0,0,0,67,0,0,0,115,76,0,
+- 0,0,116,0,106,1,100,1,117,1,114,14,116,0,106,1,
+- 115,14,116,2,160,3,100,2,116,4,161,2,1,0,116,0,
+- 106,1,68,0,93,18,125,1,122,7,124,1,124,0,131,1,
+- 87,0,2,0,1,0,83,0,4,0,116,5,121,35,1,0,
+- 1,0,1,0,89,0,113,17,119,0,100,1,83,0,41,3,
+- 122,46,83,101,97,114,99,104,32,115,121,115,46,112,97,116,
+- 104,95,104,111,111,107,115,32,102,111,114,32,97,32,102,105,
+- 110,100,101,114,32,102,111,114,32,39,112,97,116,104,39,46,
+- 78,122,23,115,121,115,46,112,97,116,104,95,104,111,111,107,
+- 115,32,105,115,32,101,109,112,116,121,41,6,114,15,0,0,
+- 0,218,10,112,97,116,104,95,104,111,111,107,115,114,99,0,
+- 0,0,114,100,0,0,0,114,162,0,0,0,114,142,0,0,
+- 0,41,2,114,65,0,0,0,90,4,104,111,111,107,114,7,
+- 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,95,
+- 112,97,116,104,95,104,111,111,107,115,63,5,0,0,115,18,
+- 0,0,0,16,3,12,1,10,1,2,1,14,1,12,1,4,
+- 1,2,255,4,3,122,22,80,97,116,104,70,105,110,100,101,
+- 114,46,95,112,97,116,104,95,104,111,111,107,115,99,2,0,
+- 0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,
+- 0,0,67,0,0,0,115,100,0,0,0,124,1,100,1,107,
+- 2,114,21,122,6,116,0,160,1,161,0,125,1,87,0,110,
+- 10,4,0,116,2,121,20,1,0,1,0,1,0,89,0,100,
+- 2,83,0,119,0,122,8,116,3,106,4,124,1,25,0,125,
+- 2,87,0,124,2,83,0,4,0,116,5,121,49,1,0,1,
+- 0,1,0,124,0,160,6,124,1,161,1,125,2,124,2,116,
+- 3,106,4,124,1,60,0,89,0,124,2,83,0,119,0,41,
+- 3,122,210,71,101,116,32,116,104,101,32,102,105,110,100,101,
+- 114,32,102,111,114,32,116,104,101,32,112,97,116,104,32,101,
+- 110,116,114,121,32,102,114,111,109,32,115,121,115,46,112,97,
+- 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,
+- 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,116,
+- 104,101,32,112,97,116,104,32,101,110,116,114,121,32,105,115,
+- 32,110,111,116,32,105,110,32,116,104,101,32,99,97,99,104,
+- 101,44,32,102,105,110,100,32,116,104,101,32,97,112,112,114,
+- 111,112,114,105,97,116,101,32,102,105,110,100,101,114,10,32,
+- 32,32,32,32,32,32,32,97,110,100,32,99,97,99,104,101,
+- 32,105,116,46,32,73,102,32,110,111,32,102,105,110,100,101,
+- 114,32,105,115,32,97,118,97,105,108,97,98,108,101,44,32,
+- 115,116,111,114,101,32,78,111,110,101,46,10,10,32,32,32,
+- 32,32,32,32,32,114,10,0,0,0,78,41,7,114,18,0,
+- 0,0,114,82,0,0,0,218,17,70,105,108,101,78,111,116,
+- 70,111,117,110,100,69,114,114,111,114,114,15,0,0,0,114,
+- 82,1,0,0,218,8,75,101,121,69,114,114,111,114,114,86,
+- 1,0,0,41,3,114,221,0,0,0,114,65,0,0,0,114,
+- 84,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
+- 0,0,0,218,20,95,112,97,116,104,95,105,109,112,111,114,
+- 116,101,114,95,99,97,99,104,101,76,5,0,0,115,28,0,
+- 0,0,8,8,2,1,12,1,12,1,6,3,2,253,2,4,
+- 12,1,4,4,12,253,10,1,12,1,4,1,2,253,122,31,
+- 80,97,116,104,70,105,110,100,101,114,46,95,112,97,116,104,
+- 95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,99,
+- 3,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,
+- 4,0,0,0,67,0,0,0,115,138,0,0,0,116,0,124,
+- 2,100,1,131,2,114,27,116,1,160,2,124,2,161,1,155,
+- 0,100,2,157,2,125,3,116,3,160,4,124,3,116,5,161,
+- 2,1,0,124,2,160,6,124,1,161,1,92,2,125,4,125,
+- 5,110,21,116,1,160,2,124,2,161,1,155,0,100,3,157,
+- 2,125,3,116,3,160,4,124,3,116,5,161,2,1,0,124,
+- 2,160,7,124,1,161,1,125,4,103,0,125,5,124,4,100,
+- 0,117,1,114,58,116,1,160,8,124,1,124,4,161,2,83,
+- 0,116,1,160,9,124,1,100,0,161,2,125,6,124,5,124,
+- 6,95,10,124,6,83,0,41,4,78,114,161,0,0,0,122,
+- 53,46,102,105,110,100,95,115,112,101,99,40,41,32,110,111,
+- 116,32,102,111,117,110,100,59,32,102,97,108,108,105,110,103,
+- 32,98,97,99,107,32,116,111,32,102,105,110,100,95,108,111,
+- 97,100,101,114,40,41,122,53,46,102,105,110,100,95,115,112,
+- 101,99,40,41,32,110,111,116,32,102,111,117,110,100,59,32,
+- 102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,
+- 102,105,110,100,95,109,111,100,117,108,101,40,41,41,11,114,
+- 153,0,0,0,114,159,0,0,0,90,12,95,111,98,106,101,
+- 99,116,95,110,97,109,101,114,99,0,0,0,114,100,0,0,
+- 0,114,162,0,0,0,114,161,0,0,0,114,229,0,0,0,
+- 114,224,0,0,0,114,207,0,0,0,114,202,0,0,0,41,
+- 7,114,221,0,0,0,114,163,0,0,0,114,84,1,0,0,
+- 114,166,0,0,0,114,164,0,0,0,114,165,0,0,0,114,
+- 210,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
+- 0,0,0,218,16,95,108,101,103,97,99,121,95,103,101,116,
+- 95,115,112,101,99,98,5,0,0,115,26,0,0,0,10,4,
+- 16,1,12,2,16,1,16,2,12,2,10,1,4,1,8,1,
+- 12,1,12,1,6,1,4,1,122,27,80,97,116,104,70,105,
+- 110,100,101,114,46,95,108,101,103,97,99,121,95,103,101,116,
+- 95,115,112,101,99,78,99,4,0,0,0,0,0,0,0,0,
+- 0,0,0,9,0,0,0,5,0,0,0,67,0,0,0,115,
+- 166,0,0,0,103,0,125,4,124,2,68,0,93,67,125,5,
+- 116,0,124,5,116,1,116,2,102,2,131,2,115,14,113,4,
+- 124,0,160,3,124,5,161,1,125,6,124,6,100,1,117,1,
+- 114,71,116,4,124,6,100,2,131,2,114,35,124,6,160,5,
+- 124,1,124,3,161,2,125,7,110,6,124,0,160,6,124,1,
+- 124,6,161,2,125,7,124,7,100,1,117,0,114,46,113,4,
+- 124,7,106,7,100,1,117,1,114,55,124,7,2,0,1,0,
+- 83,0,124,7,106,8,125,8,124,8,100,1,117,0,114,66,
+- 116,9,100,3,131,1,130,1,124,4,160,10,124,8,161,1,
+- 1,0,113,4,116,11,160,12,124,1,100,1,161,2,125,7,
+- 124,4,124,7,95,8,124,7,83,0,41,4,122,63,70,105,
+- 110,100,32,116,104,101,32,108,111,97,100,101,114,32,111,114,
+- 32,110,97,109,101,115,112,97,99,101,95,112,97,116,104,32,
+- 102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,47,
+- 112,97,99,107,97,103,101,32,110,97,109,101,46,78,114,226,
+- 0,0,0,122,19,115,112,101,99,32,109,105,115,115,105,110,
+- 103,32,108,111,97,100,101,114,41,13,114,185,0,0,0,114,
+- 109,0,0,0,218,5,98,121,116,101,115,114,89,1,0,0,
+- 114,153,0,0,0,114,226,0,0,0,114,90,1,0,0,114,
+- 164,0,0,0,114,202,0,0,0,114,142,0,0,0,114,191,
+- 0,0,0,114,159,0,0,0,114,207,0,0,0,41,9,114,
+- 221,0,0,0,114,163,0,0,0,114,65,0,0,0,114,225,
+- 0,0,0,218,14,110,97,109,101,115,112,97,99,101,95,112,
+- 97,116,104,90,5,101,110,116,114,121,114,84,1,0,0,114,
+- 210,0,0,0,114,165,0,0,0,114,7,0,0,0,114,7,
+- 0,0,0,114,8,0,0,0,218,9,95,103,101,116,95,115,
+- 112,101,99,119,5,0,0,115,42,0,0,0,4,5,8,1,
+- 14,1,2,1,10,1,8,1,10,1,14,1,12,2,8,1,
+- 2,1,10,1,8,1,6,1,8,1,8,1,10,5,2,128,
+- 12,2,6,1,4,1,122,20,80,97,116,104,70,105,110,100,
+- 101,114,46,95,103,101,116,95,115,112,101,99,99,4,0,0,
+- 0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0,
+- 0,67,0,0,0,115,94,0,0,0,124,2,100,1,117,0,
+- 114,7,116,0,106,1,125,2,124,0,160,2,124,1,124,2,
+- 124,3,161,3,125,4,124,4,100,1,117,0,114,20,100,1,
+- 83,0,124,4,106,3,100,1,117,0,114,45,124,4,106,4,
+- 125,5,124,5,114,43,100,1,124,4,95,5,116,6,124,1,
+- 124,5,124,0,106,2,131,3,124,4,95,4,124,4,83,0,
+- 100,1,83,0,124,4,83,0,41,2,122,141,84,114,121,32,
+- 116,111,32,102,105,110,100,32,97,32,115,112,101,99,32,102,
+- 111,114,32,39,102,117,108,108,110,97,109,101,39,32,111,110,
+- 32,115,121,115,46,112,97,116,104,32,111,114,32,39,112,97,
+- 116,104,39,46,10,10,32,32,32,32,32,32,32,32,84,104,
+- 101,32,115,101,97,114,99,104,32,105,115,32,98,97,115,101,
+- 100,32,111,110,32,115,121,115,46,112,97,116,104,95,104,111,
+- 111,107,115,32,97,110,100,32,115,121,115,46,112,97,116,104,
+- 95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,46,
+- 10,32,32,32,32,32,32,32,32,78,41,7,114,15,0,0,
+- 0,114,65,0,0,0,114,93,1,0,0,114,164,0,0,0,
+- 114,202,0,0,0,114,205,0,0,0,114,47,1,0,0,41,
+- 6,114,221,0,0,0,114,163,0,0,0,114,65,0,0,0,
+- 114,225,0,0,0,114,210,0,0,0,114,92,1,0,0,114,
+- 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,226,
+- 0,0,0,151,5,0,0,115,26,0,0,0,8,6,6,1,
+- 14,1,8,1,4,1,10,1,6,1,4,1,6,3,16,1,
+- 4,1,4,2,4,2,122,20,80,97,116,104,70,105,110,100,
+- 101,114,46,102,105,110,100,95,115,112,101,99,99,3,0,0,
+- 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,
+- 0,67,0,0,0,115,42,0,0,0,116,0,160,1,100,1,
+- 116,2,161,2,1,0,124,0,160,3,124,1,124,2,161,2,
+- 125,3,124,3,100,2,117,0,114,18,100,2,83,0,124,3,
+- 106,4,83,0,41,3,122,170,102,105,110,100,32,116,104,101,
+- 32,109,111,100,117,108,101,32,111,110,32,115,121,115,46,112,
+- 97,116,104,32,111,114,32,39,112,97,116,104,39,32,98,97,
+- 115,101,100,32,111,110,32,115,121,115,46,112,97,116,104,95,
+- 104,111,111,107,115,32,97,110,100,10,32,32,32,32,32,32,
+- 32,32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,
+- 116,101,114,95,99,97,99,104,101,46,10,10,32,32,32,32,
++ 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101,
++ 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,
++ 32,32,32,32,32,32,122,101,80,97,116,104,70,105,110,100,
++ 101,114,46,102,105,110,100,95,109,111,100,117,108,101,40,41,
++ 32,105,115,32,100,101,112,114,101,99,97,116,101,100,32,97,
++ 110,100,32,115,108,97,116,101,100,32,102,111,114,32,114,101,
++ 109,111,118,97,108,32,105,110,32,80,121,116,104,111,110,32,
++ 51,46,49,50,59,32,117,115,101,32,102,105,110,100,95,115,
++ 112,101,99,40,41,32,105,110,115,116,101,97,100,78,114,230,
++ 0,0,0,114,231,0,0,0,114,7,0,0,0,114,7,0,
++ 0,0,114,8,0,0,0,114,232,0,0,0,175,5,0,0,
++ 115,14,0,0,0,6,8,2,2,4,254,12,3,8,1,4,
++ 1,6,1,122,22,80,97,116,104,70,105,110,100,101,114,46,
++ 102,105,110,100,95,109,111,100,117,108,101,99,0,0,0,0,
++ 0,0,0,0,0,0,0,0,3,0,0,0,4,0,0,0,
++ 79,0,0,0,115,28,0,0,0,100,1,100,2,108,0,109,
++ 1,125,2,1,0,124,2,106,2,124,0,105,0,124,1,164,
++ 1,142,1,83,0,41,3,97,32,1,0,0,10,32,32,32,
++ 32,32,32,32,32,70,105,110,100,32,100,105,115,116,114,105,
++ 98,117,116,105,111,110,115,46,10,10,32,32,32,32,32,32,
++ 32,32,82,101,116,117,114,110,32,97,110,32,105,116,101,114,
++ 97,98,108,101,32,111,102,32,97,108,108,32,68,105,115,116,
++ 114,105,98,117,116,105,111,110,32,105,110,115,116,97,110,99,
++ 101,115,32,99,97,112,97,98,108,101,32,111,102,10,32,32,
++ 32,32,32,32,32,32,108,111,97,100,105,110,103,32,116,104,
++ 101,32,109,101,116,97,100,97,116,97,32,102,111,114,32,112,
++ 97,99,107,97,103,101,115,32,109,97,116,99,104,105,110,103,
++ 32,96,96,99,111,110,116,101,120,116,46,110,97,109,101,96,
++ 96,10,32,32,32,32,32,32,32,32,40,111,114,32,97,108,
++ 108,32,110,97,109,101,115,32,105,102,32,96,96,78,111,110,
++ 101,96,96,32,105,110,100,105,99,97,116,101,100,41,32,97,
++ 108,111,110,103,32,116,104,101,32,112,97,116,104,115,32,105,
++ 110,32,116,104,101,32,108,105,115,116,10,32,32,32,32,32,
++ 32,32,32,111,102,32,100,105,114,101,99,116,111,114,105,101,
++ 115,32,96,96,99,111,110,116,101,120,116,46,112,97,116,104,
++ 96,96,46,10,32,32,32,32,32,32,32,32,114,0,0,0,
++ 0,41,1,218,18,77,101,116,97,100,97,116,97,80,97,116,
++ 104,70,105,110,100,101,114,41,3,90,18,105,109,112,111,114,
++ 116,108,105,98,46,109,101,116,97,100,97,116,97,114,99,1,
++ 0,0,218,18,102,105,110,100,95,100,105,115,116,114,105,98,
++ 117,116,105,111,110,115,41,3,114,147,0,0,0,114,148,0,
++ 0,0,114,99,1,0,0,114,7,0,0,0,114,7,0,0,
++ 0,114,8,0,0,0,114,100,1,0,0,191,5,0,0,115,
++ 4,0,0,0,12,10,16,1,122,29,80,97,116,104,70,105,
++ 110,100,101,114,46,102,105,110,100,95,100,105,115,116,114,105,
++ 98,117,116,105,111,110,115,114,72,0,0,0,114,233,0,0,
++ 0,41,14,114,153,0,0,0,114,152,0,0,0,114,154,0,
++ 0,0,114,155,0,0,0,114,236,0,0,0,114,85,1,0,
++ 0,114,91,1,0,0,114,237,0,0,0,114,94,1,0,0,
++ 114,95,1,0,0,114,98,1,0,0,114,229,0,0,0,114,
++ 232,0,0,0,114,100,1,0,0,114,7,0,0,0,114,7,
++ 0,0,0,114,7,0,0,0,114,8,0,0,0,114,84,1,
++ 0,0,46,5,0,0,115,36,0,0,0,8,0,4,2,2,
++ 2,10,1,2,12,10,1,2,12,10,1,2,21,10,1,2,
++ 20,12,1,2,31,12,1,2,23,12,1,2,15,14,1,114,
++ 84,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,
++ 0,0,0,0,0,3,0,0,0,64,0,0,0,115,90,0,
++ 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,
++ 100,3,132,0,90,4,100,4,100,5,132,0,90,5,101,6,
++ 90,7,100,6,100,7,132,0,90,8,100,8,100,9,132,0,
++ 90,9,100,19,100,11,100,12,132,1,90,10,100,13,100,14,
++ 132,0,90,11,101,12,100,15,100,16,132,0,131,1,90,13,
++ 100,17,100,18,132,0,90,14,100,10,83,0,41,20,218,10,
++ 70,105,108,101,70,105,110,100,101,114,122,172,70,105,108,101,
++ 45,98,97,115,101,100,32,102,105,110,100,101,114,46,10,10,
++ 32,32,32,32,73,110,116,101,114,97,99,116,105,111,110,115,
++ 32,119,105,116,104,32,116,104,101,32,102,105,108,101,32,115,
++ 121,115,116,101,109,32,97,114,101,32,99,97,99,104,101,100,
++ 32,102,111,114,32,112,101,114,102,111,114,109,97,110,99,101,
++ 44,32,98,101,105,110,103,10,32,32,32,32,114,101,102,114,
++ 101,115,104,101,100,32,119,104,101,110,32,116,104,101,32,100,
++ 105,114,101,99,116,111,114,121,32,116,104,101,32,102,105,110,
++ 100,101,114,32,105,115,32,104,97,110,100,108,105,110,103,32,
++ 104,97,115,32,98,101,101,110,32,109,111,100,105,102,105,101,
++ 100,46,10,10,32,32,32,32,99,2,0,0,0,0,0,0,
++ 0,0,0,0,0,5,0,0,0,6,0,0,0,7,0,0,
++ 0,115,112,0,0,0,103,0,125,3,124,2,68,0,93,16,
++ 92,2,137,0,125,4,124,3,160,0,135,0,102,1,100,1,
++ 100,2,132,8,124,4,68,0,131,1,161,1,1,0,113,4,
++ 124,3,124,0,95,1,124,1,112,27,100,3,124,0,95,2,
++ 116,3,124,0,106,2,131,1,115,43,116,4,116,5,160,6,
++ 161,0,124,0,106,2,131,2,124,0,95,2,100,4,124,0,
++ 95,7,116,8,131,0,124,0,95,9,116,8,131,0,124,0,
++ 95,10,100,5,83,0,41,6,122,154,73,110,105,116,105,97,
++ 108,105,122,101,32,119,105,116,104,32,116,104,101,32,112,97,
++ 116,104,32,116,111,32,115,101,97,114,99,104,32,111,110,32,
++ 97,110,100,32,97,32,118,97,114,105,97,98,108,101,32,110,
++ 117,109,98,101,114,32,111,102,10,32,32,32,32,32,32,32,
++ 32,50,45,116,117,112,108,101,115,32,99,111,110,116,97,105,
++ 110,105,110,103,32,116,104,101,32,108,111,97,100,101,114,32,
++ 97,110,100,32,116,104,101,32,102,105,108,101,32,115,117,102,
++ 102,105,120,101,115,32,116,104,101,32,108,111,97,100,101,114,
++ 10,32,32,32,32,32,32,32,32,114,101,99,111,103,110,105,
++ 122,101,115,46,99,1,0,0,0,0,0,0,0,0,0,0,
++ 0,2,0,0,0,3,0,0,0,51,0,0,0,115,24,0,
++ 0,0,129,0,124,0,93,7,125,1,124,1,136,0,102,2,
++ 86,0,1,0,113,2,100,0,83,0,114,72,0,0,0,114,
++ 7,0,0,0,114,48,1,0,0,169,1,114,167,0,0,0,
++ 114,7,0,0,0,114,8,0,0,0,114,9,0,0,0,220,
++ 5,0,0,115,4,0,0,0,2,128,22,0,122,38,70,105,
++ 108,101,70,105,110,100,101,114,46,95,95,105,110,105,116,95,
++ 95,46,60,108,111,99,97,108,115,62,46,60,103,101,110,101,
++ 120,112,114,62,114,100,0,0,0,114,133,0,0,0,78,41,
++ 11,114,194,0,0,0,218,8,95,108,111,97,100,101,114,115,
++ 114,68,0,0,0,114,89,0,0,0,114,70,0,0,0,114,
++ 21,0,0,0,114,85,0,0,0,218,11,95,112,97,116,104,
++ 95,109,116,105,109,101,218,3,115,101,116,218,11,95,112,97,
++ 116,104,95,99,97,99,104,101,218,19,95,114,101,108,97,120,
++ 101,100,95,112,97,116,104,95,99,97,99,104,101,41,5,114,
++ 146,0,0,0,114,68,0,0,0,218,14,108,111,97,100,101,
++ 114,95,100,101,116,97,105,108,115,90,7,108,111,97,100,101,
++ 114,115,114,215,0,0,0,114,7,0,0,0,114,102,1,0,
++ 0,114,8,0,0,0,114,239,0,0,0,214,5,0,0,115,
++ 20,0,0,0,4,4,12,1,26,1,6,1,10,2,10,1,
++ 18,1,6,1,8,1,12,1,122,19,70,105,108,101,70,105,
++ 110,100,101,114,46,95,95,105,110,105,116,95,95,99,1,0,
++ 0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,
++ 0,0,67,0,0,0,115,10,0,0,0,100,1,124,0,95,
++ 0,100,2,83,0,41,3,122,31,73,110,118,97,108,105,100,
++ 97,116,101,32,116,104,101,32,100,105,114,101,99,116,111,114,
++ 121,32,109,116,105,109,101,46,114,133,0,0,0,78,41,1,
++ 114,104,1,0,0,114,24,1,0,0,114,7,0,0,0,114,
++ 7,0,0,0,114,8,0,0,0,114,85,1,0,0,230,5,
++ 0,0,114,84,0,0,0,122,28,70,105,108,101,70,105,110,
++ 100,101,114,46,105,110,118,97,108,105,100,97,116,101,95,99,
++ 97,99,104,101,115,99,2,0,0,0,0,0,0,0,0,0,
++ 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,54,
++ 0,0,0,116,0,160,1,100,1,116,2,161,2,1,0,124,
++ 0,160,3,124,1,161,1,125,2,124,2,100,2,117,0,114,
++ 19,100,2,103,0,102,2,83,0,124,2,106,4,124,2,106,
++ 5,112,25,103,0,102,2,83,0,41,3,122,197,84,114,121,
++ 32,116,111,32,102,105,110,100,32,97,32,108,111,97,100,101,
++ 114,32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,
++ 105,101,100,32,109,111,100,117,108,101,44,32,111,114,32,116,
++ 104,101,32,110,97,109,101,115,112,97,99,101,10,32,32,32,
++ 32,32,32,32,32,112,97,99,107,97,103,101,32,112,111,114,
++ 116,105,111,110,115,46,32,82,101,116,117,114,110,115,32,40,
++ 108,111,97,100,101,114,44,32,108,105,115,116,45,111,102,45,
++ 112,111,114,116,105,111,110,115,41,46,10,10,32,32,32,32,
+ 32,32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,
+ 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,
+ 85,115,101,32,102,105,110,100,95,115,112,101,99,40,41,32,
+ 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,
+- 32,32,122,101,80,97,116,104,70,105,110,100,101,114,46,102,
+- 105,110,100,95,109,111,100,117,108,101,40,41,32,105,115,32,
++ 32,32,122,101,70,105,108,101,70,105,110,100,101,114,46,102,
++ 105,110,100,95,108,111,97,100,101,114,40,41,32,105,115,32,
+ 100,101,112,114,101,99,97,116,101,100,32,97,110,100,32,115,
+ 108,97,116,101,100,32,102,111,114,32,114,101,109,111,118,97,
+ 108,32,105,110,32,80,121,116,104,111,110,32,51,46,49,50,
+ 59,32,117,115,101,32,102,105,110,100,95,115,112,101,99,40,
+- 41,32,105,110,115,116,101,97,100,78,114,227,0,0,0,114,
+- 228,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
+- 0,0,0,114,229,0,0,0,175,5,0,0,115,14,0,0,
+- 0,6,8,2,2,4,254,12,3,8,1,4,1,6,1,122,
+- 22,80,97,116,104,70,105,110,100,101,114,46,102,105,110,100,
+- 95,109,111,100,117,108,101,99,0,0,0,0,0,0,0,0,
+- 0,0,0,0,3,0,0,0,4,0,0,0,79,0,0,0,
+- 115,28,0,0,0,100,1,100,2,108,0,109,1,125,2,1,
+- 0,124,2,106,2,124,0,105,0,124,1,164,1,142,1,83,
+- 0,41,3,97,32,1,0,0,10,32,32,32,32,32,32,32,
+- 32,70,105,110,100,32,100,105,115,116,114,105,98,117,116,105,
+- 111,110,115,46,10,10,32,32,32,32,32,32,32,32,82,101,
+- 116,117,114,110,32,97,110,32,105,116,101,114,97,98,108,101,
+- 32,111,102,32,97,108,108,32,68,105,115,116,114,105,98,117,
+- 116,105,111,110,32,105,110,115,116,97,110,99,101,115,32,99,
+- 97,112,97,98,108,101,32,111,102,10,32,32,32,32,32,32,
+- 32,32,108,111,97,100,105,110,103,32,116,104,101,32,109,101,
+- 116,97,100,97,116,97,32,102,111,114,32,112,97,99,107,97,
+- 103,101,115,32,109,97,116,99,104,105,110,103,32,96,96,99,
+- 111,110,116,101,120,116,46,110,97,109,101,96,96,10,32,32,
+- 32,32,32,32,32,32,40,111,114,32,97,108,108,32,110,97,
+- 109,101,115,32,105,102,32,96,96,78,111,110,101,96,96,32,
+- 105,110,100,105,99,97,116,101,100,41,32,97,108,111,110,103,
+- 32,116,104,101,32,112,97,116,104,115,32,105,110,32,116,104,
+- 101,32,108,105,115,116,10,32,32,32,32,32,32,32,32,111,
+- 102,32,100,105,114,101,99,116,111,114,105,101,115,32,96,96,
+- 99,111,110,116,101,120,116,46,112,97,116,104,96,96,46,10,
+- 32,32,32,32,32,32,32,32,114,0,0,0,0,41,1,218,
+- 18,77,101,116,97,100,97,116,97,80,97,116,104,70,105,110,
+- 100,101,114,41,3,90,18,105,109,112,111,114,116,108,105,98,
+- 46,109,101,116,97,100,97,116,97,114,94,1,0,0,218,18,
+- 102,105,110,100,95,100,105,115,116,114,105,98,117,116,105,111,
+- 110,115,41,3,114,144,0,0,0,114,145,0,0,0,114,94,
+- 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
+- 0,0,114,95,1,0,0,191,5,0,0,115,4,0,0,0,
+- 12,10,16,1,122,29,80,97,116,104,70,105,110,100,101,114,
+- 46,102,105,110,100,95,100,105,115,116,114,105,98,117,116,105,
+- 111,110,115,114,69,0,0,0,114,230,0,0,0,41,14,114,
+- 150,0,0,0,114,149,0,0,0,114,151,0,0,0,114,152,
+- 0,0,0,114,233,0,0,0,114,80,1,0,0,114,86,1,
+- 0,0,114,234,0,0,0,114,89,1,0,0,114,90,1,0,
+- 0,114,93,1,0,0,114,226,0,0,0,114,229,0,0,0,
+- 114,95,1,0,0,114,7,0,0,0,114,7,0,0,0,114,
+- 7,0,0,0,114,8,0,0,0,114,79,1,0,0,46,5,
+- 0,0,115,36,0,0,0,8,0,4,2,2,2,10,1,2,
+- 12,10,1,2,12,10,1,2,21,10,1,2,20,12,1,2,
+- 31,12,1,2,23,12,1,2,15,14,1,114,79,1,0,0,
+- 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+- 0,3,0,0,0,64,0,0,0,115,90,0,0,0,101,0,
+- 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,
+- 90,4,100,4,100,5,132,0,90,5,101,6,90,7,100,6,
+- 100,7,132,0,90,8,100,8,100,9,132,0,90,9,100,19,
+- 100,11,100,12,132,1,90,10,100,13,100,14,132,0,90,11,
+- 101,12,100,15,100,16,132,0,131,1,90,13,100,17,100,18,
+- 132,0,90,14,100,10,83,0,41,20,218,10,70,105,108,101,
+- 70,105,110,100,101,114,122,172,70,105,108,101,45,98,97,115,
+- 101,100,32,102,105,110,100,101,114,46,10,10,32,32,32,32,
+- 73,110,116,101,114,97,99,116,105,111,110,115,32,119,105,116,
+- 104,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,
+- 109,32,97,114,101,32,99,97,99,104,101,100,32,102,111,114,
+- 32,112,101,114,102,111,114,109,97,110,99,101,44,32,98,101,
+- 105,110,103,10,32,32,32,32,114,101,102,114,101,115,104,101,
+- 100,32,119,104,101,110,32,116,104,101,32,100,105,114,101,99,
+- 116,111,114,121,32,116,104,101,32,102,105,110,100,101,114,32,
+- 105,115,32,104,97,110,100,108,105,110,103,32,104,97,115,32,
+- 98,101,101,110,32,109,111,100,105,102,105,101,100,46,10,10,
+- 32,32,32,32,99,2,0,0,0,0,0,0,0,0,0,0,
+- 0,5,0,0,0,6,0,0,0,7,0,0,0,115,112,0,
+- 0,0,103,0,125,3,124,2,68,0,93,16,92,2,137,0,
+- 125,4,124,3,160,0,135,0,102,1,100,1,100,2,132,8,
+- 124,4,68,0,131,1,161,1,1,0,113,4,124,3,124,0,
+- 95,1,124,1,112,27,100,3,124,0,95,2,116,3,124,0,
+- 106,2,131,1,115,43,116,4,116,5,160,6,161,0,124,0,
+- 106,2,131,2,124,0,95,2,100,4,124,0,95,7,116,8,
+- 131,0,124,0,95,9,116,8,131,0,124,0,95,10,100,5,
+- 83,0,41,6,122,154,73,110,105,116,105,97,108,105,122,101,
+- 32,119,105,116,104,32,116,104,101,32,112,97,116,104,32,116,
+- 111,32,115,101,97,114,99,104,32,111,110,32,97,110,100,32,
+- 97,32,118,97,114,105,97,98,108,101,32,110,117,109,98,101,
+- 114,32,111,102,10,32,32,32,32,32,32,32,32,50,45,116,
+- 117,112,108,101,115,32,99,111,110,116,97,105,110,105,110,103,
+- 32,116,104,101,32,108,111,97,100,101,114,32,97,110,100,32,
+- 116,104,101,32,102,105,108,101,32,115,117,102,102,105,120,101,
+- 115,32,116,104,101,32,108,111,97,100,101,114,10,32,32,32,
+- 32,32,32,32,32,114,101,99,111,103,110,105,122,101,115,46,
++ 41,32,105,110,115,116,101,97,100,78,41,6,114,102,0,0,
++ 0,114,103,0,0,0,114,104,0,0,0,114,229,0,0,0,
++ 114,167,0,0,0,114,205,0,0,0,41,3,114,146,0,0,
++ 0,114,166,0,0,0,114,213,0,0,0,114,7,0,0,0,
++ 114,7,0,0,0,114,8,0,0,0,114,164,0,0,0,236,
++ 5,0,0,115,14,0,0,0,6,7,2,2,4,254,10,3,
++ 8,1,8,1,16,1,122,22,70,105,108,101,70,105,110,100,
++ 101,114,46,102,105,110,100,95,108,111,97,100,101,114,99,6,
++ 0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,6,
++ 0,0,0,67,0,0,0,115,26,0,0,0,124,1,124,2,
++ 124,3,131,2,125,6,116,0,124,2,124,3,124,6,124,4,
++ 100,1,141,4,83,0,41,2,78,114,204,0,0,0,41,1,
++ 114,216,0,0,0,41,7,114,146,0,0,0,114,214,0,0,
++ 0,114,166,0,0,0,114,68,0,0,0,90,4,115,109,115,
++ 108,114,228,0,0,0,114,167,0,0,0,114,7,0,0,0,
++ 114,7,0,0,0,114,8,0,0,0,114,98,1,0,0,251,
++ 5,0,0,115,8,0,0,0,10,1,8,1,2,1,6,255,
++ 122,20,70,105,108,101,70,105,110,100,101,114,46,95,103,101,
++ 116,95,115,112,101,99,78,99,3,0,0,0,0,0,0,0,
++ 0,0,0,0,14,0,0,0,9,0,0,0,67,0,0,0,
++ 115,122,1,0,0,100,1,125,3,124,1,160,0,100,2,161,
++ 1,100,3,25,0,125,4,122,12,116,1,124,0,106,2,112,
++ 17,116,3,160,4,161,0,131,1,106,5,125,5,87,0,110,
++ 11,4,0,116,6,121,32,1,0,1,0,1,0,100,4,125,
++ 5,89,0,110,1,119,0,124,5,124,0,106,7,107,3,114,
++ 45,124,0,160,8,161,0,1,0,124,5,124,0,95,7,116,
++ 9,131,0,114,56,124,0,106,10,125,6,124,4,160,11,161,
++ 0,125,7,110,5,124,0,106,12,125,6,124,4,125,7,124,
++ 7,124,6,118,0,114,108,116,13,124,0,106,2,124,4,131,
++ 2,125,8,124,0,106,14,68,0,93,29,92,2,125,9,125,
++ 10,100,5,124,9,23,0,125,11,116,13,124,8,124,11,131,
++ 2,125,12,116,15,124,12,131,1,114,103,124,0,160,16,124,
++ 10,124,1,124,12,124,8,103,1,124,2,161,5,2,0,1,
++ 0,83,0,113,74,116,17,124,8,131,1,125,3,124,0,106,
++ 14,68,0,93,55,92,2,125,9,125,10,122,10,116,13,124,
++ 0,106,2,124,4,124,9,23,0,131,2,125,12,87,0,110,
++ 11,4,0,116,18,121,136,1,0,1,0,1,0,89,0,1,
++ 0,100,6,83,0,119,0,116,19,106,20,100,7,124,12,100,
++ 3,100,8,141,3,1,0,124,7,124,9,23,0,124,6,118,
++ 0,114,166,116,15,124,12,131,1,114,166,124,0,160,16,124,
++ 10,124,1,124,12,100,6,124,2,161,5,2,0,1,0,83,
++ 0,113,111,124,3,114,187,116,19,160,20,100,9,124,8,161,
++ 2,1,0,116,19,160,21,124,1,100,6,161,2,125,13,124,
++ 8,103,1,124,13,95,22,124,13,83,0,100,6,83,0,41,
++ 10,122,111,84,114,121,32,116,111,32,102,105,110,100,32,97,
++ 32,115,112,101,99,32,102,111,114,32,116,104,101,32,115,112,
++ 101,99,105,102,105,101,100,32,109,111,100,117,108,101,46,10,
++ 10,32,32,32,32,32,32,32,32,82,101,116,117,114,110,115,
++ 32,116,104,101,32,109,97,116,99,104,105,110,103,32,115,112,
++ 101,99,44,32,111,114,32,78,111,110,101,32,105,102,32,110,
++ 111,116,32,102,111,117,110,100,46,10,32,32,32,32,32,32,
++ 32,32,70,114,100,0,0,0,114,47,0,0,0,114,133,0,
++ 0,0,114,239,0,0,0,78,122,9,116,114,121,105,110,103,
++ 32,123,125,41,1,90,9,118,101,114,98,111,115,105,116,121,
++ 122,25,112,111,115,115,105,98,108,101,32,110,97,109,101,115,
++ 112,97,99,101,32,102,111,114,32,123,125,41,23,114,107,0,
++ 0,0,114,78,0,0,0,114,68,0,0,0,114,21,0,0,
++ 0,114,85,0,0,0,114,39,1,0,0,114,79,0,0,0,
++ 114,104,1,0,0,218,11,95,102,105,108,108,95,99,97,99,
++ 104,101,114,24,0,0,0,114,107,1,0,0,114,134,0,0,
++ 0,114,106,1,0,0,114,70,0,0,0,114,103,1,0,0,
++ 114,83,0,0,0,114,98,1,0,0,114,86,0,0,0,114,
++ 114,0,0,0,114,162,0,0,0,114,176,0,0,0,114,210,
++ 0,0,0,114,205,0,0,0,41,14,114,146,0,0,0,114,
++ 166,0,0,0,114,228,0,0,0,90,12,105,115,95,110,97,
++ 109,101,115,112,97,99,101,90,11,116,97,105,108,95,109,111,
++ 100,117,108,101,114,196,0,0,0,90,5,99,97,99,104,101,
++ 90,12,99,97,99,104,101,95,109,111,100,117,108,101,90,9,
++ 98,97,115,101,95,112,97,116,104,114,49,1,0,0,114,214,
++ 0,0,0,90,13,105,110,105,116,95,102,105,108,101,110,97,
++ 109,101,90,9,102,117,108,108,95,112,97,116,104,114,213,0,
++ 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
++ 0,114,229,0,0,0,0,6,0,0,115,86,0,0,0,4,
++ 5,14,1,2,1,24,1,12,1,8,1,2,255,10,2,8,
++ 1,6,1,6,2,6,1,10,1,6,2,4,1,8,2,12,
++ 1,14,1,8,1,10,1,8,1,24,1,2,255,8,5,14,
++ 2,2,1,20,1,12,1,8,1,2,255,16,2,12,1,8,
++ 1,10,1,4,1,8,255,2,128,4,2,12,1,12,1,8,
++ 1,4,1,4,1,122,20,70,105,108,101,70,105,110,100,101,
++ 114,46,102,105,110,100,95,115,112,101,99,99,1,0,0,0,
++ 0,0,0,0,0,0,0,0,9,0,0,0,10,0,0,0,
++ 67,0,0,0,115,192,0,0,0,124,0,106,0,125,1,122,
++ 11,116,1,160,2,124,1,112,11,116,1,160,3,161,0,161,
++ 1,125,2,87,0,110,14,4,0,116,4,116,5,116,6,102,
++ 3,121,28,1,0,1,0,1,0,103,0,125,2,89,0,110,
++ 1,119,0,116,7,106,8,160,9,100,1,161,1,115,41,116,
++ 10,124,2,131,1,124,0,95,11,110,37,116,10,131,0,125,
++ 3,124,2,68,0,93,28,125,4,124,4,160,12,100,2,161,
++ 1,92,3,125,5,125,6,125,7,124,6,114,67,100,3,160,
++ 13,124,5,124,7,160,14,161,0,161,2,125,8,110,2,124,
++ 5,125,8,124,3,160,15,124,8,161,1,1,0,113,46,124,
++ 3,124,0,95,11,116,7,106,8,160,9,116,16,161,1,114,
++ 94,100,4,100,5,132,0,124,2,68,0,131,1,124,0,95,
++ 17,100,6,83,0,100,6,83,0,41,7,122,68,70,105,108,
++ 108,32,116,104,101,32,99,97,99,104,101,32,111,102,32,112,
++ 111,116,101,110,116,105,97,108,32,109,111,100,117,108,101,115,
++ 32,97,110,100,32,112,97,99,107,97,103,101,115,32,102,111,
++ 114,32,116,104,105,115,32,100,105,114,101,99,116,111,114,121,
++ 46,114,14,0,0,0,114,100,0,0,0,114,91,0,0,0,
+ 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
+- 0,3,0,0,0,51,0,0,0,115,24,0,0,0,129,0,
+- 124,0,93,7,125,1,124,1,136,0,102,2,86,0,1,0,
+- 113,2,100,0,83,0,114,69,0,0,0,114,7,0,0,0,
+- 114,43,1,0,0,169,1,114,164,0,0,0,114,7,0,0,
+- 0,114,8,0,0,0,114,9,0,0,0,220,5,0,0,115,
+- 4,0,0,0,2,128,22,0,122,38,70,105,108,101,70,105,
+- 110,100,101,114,46,95,95,105,110,105,116,95,95,46,60,108,
+- 111,99,97,108,115,62,46,60,103,101,110,101,120,112,114,62,
+- 114,97,0,0,0,114,130,0,0,0,78,41,11,114,191,0,
+- 0,0,218,8,95,108,111,97,100,101,114,115,114,65,0,0,
+- 0,114,86,0,0,0,114,67,0,0,0,114,18,0,0,0,
+- 114,82,0,0,0,218,11,95,112,97,116,104,95,109,116,105,
+- 109,101,218,3,115,101,116,218,11,95,112,97,116,104,95,99,
+- 97,99,104,101,218,19,95,114,101,108,97,120,101,100,95,112,
+- 97,116,104,95,99,97,99,104,101,41,5,114,143,0,0,0,
+- 114,65,0,0,0,218,14,108,111,97,100,101,114,95,100,101,
+- 116,97,105,108,115,90,7,108,111,97,100,101,114,115,114,212,
+- 0,0,0,114,7,0,0,0,114,97,1,0,0,114,8,0,
+- 0,0,114,236,0,0,0,214,5,0,0,115,20,0,0,0,
+- 4,4,12,1,26,1,6,1,10,2,10,1,18,1,6,1,
+- 8,1,12,1,122,19,70,105,108,101,70,105,110,100,101,114,
+- 46,95,95,105,110,105,116,95,95,99,1,0,0,0,0,0,
+- 0,0,0,0,0,0,1,0,0,0,2,0,0,0,67,0,
+- 0,0,115,10,0,0,0,100,1,124,0,95,0,100,2,83,
+- 0,41,3,122,31,73,110,118,97,108,105,100,97,116,101,32,
+- 116,104,101,32,100,105,114,101,99,116,111,114,121,32,109,116,
+- 105,109,101,46,114,130,0,0,0,78,41,1,114,99,1,0,
+- 0,114,21,1,0,0,114,7,0,0,0,114,7,0,0,0,
+- 114,8,0,0,0,114,80,1,0,0,230,5,0,0,114,81,
+- 0,0,0,122,28,70,105,108,101,70,105,110,100,101,114,46,
+- 105,110,118,97,108,105,100,97,116,101,95,99,97,99,104,101,
+- 115,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,
+- 0,0,4,0,0,0,67,0,0,0,115,54,0,0,0,116,
+- 0,160,1,100,1,116,2,161,2,1,0,124,0,160,3,124,
+- 1,161,1,125,2,124,2,100,2,117,0,114,19,100,2,103,
+- 0,102,2,83,0,124,2,106,4,124,2,106,5,112,25,103,
+- 0,102,2,83,0,41,3,122,197,84,114,121,32,116,111,32,
+- 102,105,110,100,32,97,32,108,111,97,100,101,114,32,102,111,
+- 114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,
+- 109,111,100,117,108,101,44,32,111,114,32,116,104,101,32,110,
+- 97,109,101,115,112,97,99,101,10,32,32,32,32,32,32,32,
+- 32,112,97,99,107,97,103,101,32,112,111,114,116,105,111,110,
+- 115,46,32,82,101,116,117,114,110,115,32,40,108,111,97,100,
+- 101,114,44,32,108,105,115,116,45,111,102,45,112,111,114,116,
+- 105,111,110,115,41,46,10,10,32,32,32,32,32,32,32,32,
+- 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,
+- 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,
+- 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,
+- 101,97,100,46,10,10,32,32,32,32,32,32,32,32,122,101,
+- 70,105,108,101,70,105,110,100,101,114,46,102,105,110,100,95,
+- 108,111,97,100,101,114,40,41,32,105,115,32,100,101,112,114,
+- 101,99,97,116,101,100,32,97,110,100,32,115,108,97,116,101,
+- 100,32,102,111,114,32,114,101,109,111,118,97,108,32,105,110,
+- 32,80,121,116,104,111,110,32,51,46,49,50,59,32,117,115,
+- 101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,
+- 115,116,101,97,100,78,41,6,114,99,0,0,0,114,100,0,
+- 0,0,114,101,0,0,0,114,226,0,0,0,114,164,0,0,
+- 0,114,202,0,0,0,41,3,114,143,0,0,0,114,163,0,
+- 0,0,114,210,0,0,0,114,7,0,0,0,114,7,0,0,
+- 0,114,8,0,0,0,114,161,0,0,0,236,5,0,0,115,
+- 14,0,0,0,6,7,2,2,4,254,10,3,8,1,8,1,
+- 16,1,122,22,70,105,108,101,70,105,110,100,101,114,46,102,
+- 105,110,100,95,108,111,97,100,101,114,99,6,0,0,0,0,
+- 0,0,0,0,0,0,0,7,0,0,0,6,0,0,0,67,
+- 0,0,0,115,26,0,0,0,124,1,124,2,124,3,131,2,
+- 125,6,116,0,124,2,124,3,124,6,124,4,100,1,141,4,
+- 83,0,41,2,78,114,201,0,0,0,41,1,114,213,0,0,
+- 0,41,7,114,143,0,0,0,114,211,0,0,0,114,163,0,
+- 0,0,114,65,0,0,0,90,4,115,109,115,108,114,225,0,
+- 0,0,114,164,0,0,0,114,7,0,0,0,114,7,0,0,
+- 0,114,8,0,0,0,114,93,1,0,0,251,5,0,0,115,
+- 8,0,0,0,10,1,8,1,2,1,6,255,122,20,70,105,
+- 108,101,70,105,110,100,101,114,46,95,103,101,116,95,115,112,
+- 101,99,78,99,3,0,0,0,0,0,0,0,0,0,0,0,
+- 14,0,0,0,9,0,0,0,67,0,0,0,115,122,1,0,
+- 0,100,1,125,3,124,1,160,0,100,2,161,1,100,3,25,
+- 0,125,4,122,12,116,1,124,0,106,2,112,17,116,3,160,
+- 4,161,0,131,1,106,5,125,5,87,0,110,11,4,0,116,
+- 6,121,32,1,0,1,0,1,0,100,4,125,5,89,0,110,
+- 1,119,0,124,5,124,0,106,7,107,3,114,45,124,0,160,
+- 8,161,0,1,0,124,5,124,0,95,7,116,9,131,0,114,
+- 56,124,0,106,10,125,6,124,4,160,11,161,0,125,7,110,
+- 5,124,0,106,12,125,6,124,4,125,7,124,7,124,6,118,
+- 0,114,108,116,13,124,0,106,2,124,4,131,2,125,8,124,
+- 0,106,14,68,0,93,29,92,2,125,9,125,10,100,5,124,
+- 9,23,0,125,11,116,13,124,8,124,11,131,2,125,12,116,
+- 15,124,12,131,1,114,103,124,0,160,16,124,10,124,1,124,
+- 12,124,8,103,1,124,2,161,5,2,0,1,0,83,0,113,
+- 74,116,17,124,8,131,1,125,3,124,0,106,14,68,0,93,
+- 55,92,2,125,9,125,10,122,10,116,13,124,0,106,2,124,
+- 4,124,9,23,0,131,2,125,12,87,0,110,11,4,0,116,
+- 18,121,136,1,0,1,0,1,0,89,0,1,0,100,6,83,
+- 0,119,0,116,19,106,20,100,7,124,12,100,3,100,8,141,
+- 3,1,0,124,7,124,9,23,0,124,6,118,0,114,166,116,
+- 15,124,12,131,1,114,166,124,0,160,16,124,10,124,1,124,
+- 12,100,6,124,2,161,5,2,0,1,0,83,0,113,111,124,
+- 3,114,187,116,19,160,20,100,9,124,8,161,2,1,0,116,
+- 19,160,21,124,1,100,6,161,2,125,13,124,8,103,1,124,
+- 13,95,22,124,13,83,0,100,6,83,0,41,10,122,111,84,
+- 114,121,32,116,111,32,102,105,110,100,32,97,32,115,112,101,
+- 99,32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,
+- 105,101,100,32,109,111,100,117,108,101,46,10,10,32,32,32,
+- 32,32,32,32,32,82,101,116,117,114,110,115,32,116,104,101,
+- 32,109,97,116,99,104,105,110,103,32,115,112,101,99,44,32,
+- 111,114,32,78,111,110,101,32,105,102,32,110,111,116,32,102,
+- 111,117,110,100,46,10,32,32,32,32,32,32,32,32,70,114,
+- 97,0,0,0,114,44,0,0,0,114,130,0,0,0,114,236,
+- 0,0,0,78,122,9,116,114,121,105,110,103,32,123,125,41,
+- 1,90,9,118,101,114,98,111,115,105,116,121,122,25,112,111,
+- 115,115,105,98,108,101,32,110,97,109,101,115,112,97,99,101,
+- 32,102,111,114,32,123,125,41,23,114,104,0,0,0,114,75,
+- 0,0,0,114,65,0,0,0,114,18,0,0,0,114,82,0,
+- 0,0,114,35,1,0,0,114,76,0,0,0,114,99,1,0,
+- 0,218,11,95,102,105,108,108,95,99,97,99,104,101,114,21,
+- 0,0,0,114,102,1,0,0,114,131,0,0,0,114,101,1,
+- 0,0,114,67,0,0,0,114,98,1,0,0,114,80,0,0,
+- 0,114,93,1,0,0,114,83,0,0,0,114,111,0,0,0,
+- 114,159,0,0,0,114,173,0,0,0,114,207,0,0,0,114,
+- 202,0,0,0,41,14,114,143,0,0,0,114,163,0,0,0,
+- 114,225,0,0,0,90,12,105,115,95,110,97,109,101,115,112,
+- 97,99,101,90,11,116,97,105,108,95,109,111,100,117,108,101,
+- 114,193,0,0,0,90,5,99,97,99,104,101,90,12,99,97,
+- 99,104,101,95,109,111,100,117,108,101,90,9,98,97,115,101,
+- 95,112,97,116,104,114,44,1,0,0,114,211,0,0,0,90,
+- 13,105,110,105,116,95,102,105,108,101,110,97,109,101,90,9,
+- 102,117,108,108,95,112,97,116,104,114,210,0,0,0,114,7,
+- 0,0,0,114,7,0,0,0,114,8,0,0,0,114,226,0,
+- 0,0,0,6,0,0,115,86,0,0,0,4,5,14,1,2,
+- 1,24,1,12,1,8,1,2,255,10,2,8,1,6,1,6,
+- 2,6,1,10,1,6,2,4,1,8,2,12,1,14,1,8,
+- 1,10,1,8,1,24,1,2,255,8,5,14,2,2,1,20,
+- 1,12,1,8,1,2,255,16,2,12,1,8,1,10,1,4,
+- 1,8,255,2,128,4,2,12,1,12,1,8,1,4,1,4,
+- 1,122,20,70,105,108,101,70,105,110,100,101,114,46,102,105,
+- 110,100,95,115,112,101,99,99,1,0,0,0,0,0,0,0,
+- 0,0,0,0,9,0,0,0,10,0,0,0,67,0,0,0,
+- 115,192,0,0,0,124,0,106,0,125,1,122,11,116,1,160,
+- 2,124,1,112,11,116,1,160,3,161,0,161,1,125,2,87,
+- 0,110,14,4,0,116,4,116,5,116,6,102,3,121,28,1,
+- 0,1,0,1,0,103,0,125,2,89,0,110,1,119,0,116,
+- 7,106,8,160,9,100,1,161,1,115,41,116,10,124,2,131,
+- 1,124,0,95,11,110,37,116,10,131,0,125,3,124,2,68,
+- 0,93,28,125,4,124,4,160,12,100,2,161,1,92,3,125,
+- 5,125,6,125,7,124,6,114,67,100,3,160,13,124,5,124,
+- 7,160,14,161,0,161,2,125,8,110,2,124,5,125,8,124,
+- 3,160,15,124,8,161,1,1,0,113,46,124,3,124,0,95,
+- 11,116,7,106,8,160,9,116,16,161,1,114,94,100,4,100,
+- 5,132,0,124,2,68,0,131,1,124,0,95,17,100,6,83,
+- 0,100,6,83,0,41,7,122,68,70,105,108,108,32,116,104,
+- 101,32,99,97,99,104,101,32,111,102,32,112,111,116,101,110,
+- 116,105,97,108,32,109,111,100,117,108,101,115,32,97,110,100,
+- 32,112,97,99,107,97,103,101,115,32,102,111,114,32,116,104,
+- 105,115,32,100,105,114,101,99,116,111,114,121,46,114,14,0,
+- 0,0,114,97,0,0,0,114,88,0,0,0,99,1,0,0,
+- 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,
+- 0,83,0,0,0,115,20,0,0,0,104,0,124,0,93,6,
+- 125,1,124,1,160,0,161,0,146,2,113,2,83,0,114,7,
+- 0,0,0,41,1,114,131,0,0,0,41,2,114,5,0,0,
+- 0,90,2,102,110,114,7,0,0,0,114,7,0,0,0,114,
+- 8,0,0,0,114,13,0,0,0,80,6,0,0,115,2,0,
+- 0,0,20,0,122,41,70,105,108,101,70,105,110,100,101,114,
+- 46,95,102,105,108,108,95,99,97,99,104,101,46,60,108,111,
+- 99,97,108,115,62,46,60,115,101,116,99,111,109,112,62,78,
+- 41,18,114,65,0,0,0,114,18,0,0,0,90,7,108,105,
+- 115,116,100,105,114,114,82,0,0,0,114,87,1,0,0,218,
+- 15,80,101,114,109,105,115,115,105,111,110,69,114,114,111,114,
+- 218,18,78,111,116,65,68,105,114,101,99,116,111,114,121,69,
+- 114,114,111,114,114,15,0,0,0,114,25,0,0,0,114,26,
+- 0,0,0,114,100,1,0,0,114,101,1,0,0,114,126,0,
+- 0,0,114,89,0,0,0,114,131,0,0,0,218,3,97,100,
+- 100,114,27,0,0,0,114,102,1,0,0,41,9,114,143,0,
+- 0,0,114,65,0,0,0,90,8,99,111,110,116,101,110,116,
+- 115,90,21,108,111,119,101,114,95,115,117,102,102,105,120,95,
+- 99,111,110,116,101,110,116,115,114,72,1,0,0,114,141,0,
+- 0,0,114,56,1,0,0,114,44,1,0,0,90,8,110,101,
+- 119,95,110,97,109,101,114,7,0,0,0,114,7,0,0,0,
+- 114,8,0,0,0,114,104,1,0,0,51,6,0,0,115,38,
+- 0,0,0,6,2,2,1,22,1,18,1,8,3,2,253,12,
+- 6,12,1,6,7,8,1,16,1,4,1,18,1,4,2,12,
+- 1,6,1,12,1,20,1,4,255,122,22,70,105,108,101,70,
+- 105,110,100,101,114,46,95,102,105,108,108,95,99,97,99,104,
+- 101,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,
+- 0,0,3,0,0,0,7,0,0,0,115,18,0,0,0,135,
+- 0,135,1,102,2,100,1,100,2,132,8,125,2,124,2,83,
+- 0,41,3,97,20,1,0,0,65,32,99,108,97,115,115,32,
+- 109,101,116,104,111,100,32,119,104,105,99,104,32,114,101,116,
+- 117,114,110,115,32,97,32,99,108,111,115,117,114,101,32,116,
+- 111,32,117,115,101,32,111,110,32,115,121,115,46,112,97,116,
+- 104,95,104,111,111,107,10,32,32,32,32,32,32,32,32,119,
+- 104,105,99,104,32,119,105,108,108,32,114,101,116,117,114,110,
+- 32,97,110,32,105,110,115,116,97,110,99,101,32,117,115,105,
+- 110,103,32,116,104,101,32,115,112,101,99,105,102,105,101,100,
+- 32,108,111,97,100,101,114,115,32,97,110,100,32,116,104,101,
+- 32,112,97,116,104,10,32,32,32,32,32,32,32,32,99,97,
++ 0,4,0,0,0,83,0,0,0,115,20,0,0,0,104,0,
++ 124,0,93,6,125,1,124,1,160,0,161,0,146,2,113,2,
++ 83,0,114,7,0,0,0,41,1,114,134,0,0,0,41,2,
++ 114,5,0,0,0,90,2,102,110,114,7,0,0,0,114,7,
++ 0,0,0,114,8,0,0,0,114,13,0,0,0,80,6,0,
++ 0,115,2,0,0,0,20,0,122,41,70,105,108,101,70,105,
++ 110,100,101,114,46,95,102,105,108,108,95,99,97,99,104,101,
++ 46,60,108,111,99,97,108,115,62,46,60,115,101,116,99,111,
++ 109,112,62,78,41,18,114,68,0,0,0,114,21,0,0,0,
++ 90,7,108,105,115,116,100,105,114,114,85,0,0,0,114,92,
++ 1,0,0,218,15,80,101,114,109,105,115,115,105,111,110,69,
++ 114,114,111,114,218,18,78,111,116,65,68,105,114,101,99,116,
++ 111,114,121,69,114,114,111,114,114,18,0,0,0,114,28,0,
++ 0,0,114,29,0,0,0,114,105,1,0,0,114,106,1,0,
++ 0,114,129,0,0,0,114,92,0,0,0,114,134,0,0,0,
++ 218,3,97,100,100,114,30,0,0,0,114,107,1,0,0,41,
++ 9,114,146,0,0,0,114,68,0,0,0,90,8,99,111,110,
++ 116,101,110,116,115,90,21,108,111,119,101,114,95,115,117,102,
++ 102,105,120,95,99,111,110,116,101,110,116,115,114,77,1,0,
++ 0,114,144,0,0,0,114,61,1,0,0,114,49,1,0,0,
++ 90,8,110,101,119,95,110,97,109,101,114,7,0,0,0,114,
++ 7,0,0,0,114,8,0,0,0,114,109,1,0,0,51,6,
++ 0,0,115,38,0,0,0,6,2,2,1,22,1,18,1,8,
++ 3,2,253,12,6,12,1,6,7,8,1,16,1,4,1,18,
++ 1,4,2,12,1,6,1,12,1,20,1,4,255,122,22,70,
++ 105,108,101,70,105,110,100,101,114,46,95,102,105,108,108,95,
++ 99,97,99,104,101,99,1,0,0,0,0,0,0,0,0,0,
++ 0,0,3,0,0,0,3,0,0,0,7,0,0,0,115,18,
++ 0,0,0,135,0,135,1,102,2,100,1,100,2,132,8,125,
++ 2,124,2,83,0,41,3,97,20,1,0,0,65,32,99,108,
++ 97,115,115,32,109,101,116,104,111,100,32,119,104,105,99,104,
++ 32,114,101,116,117,114,110,115,32,97,32,99,108,111,115,117,
++ 114,101,32,116,111,32,117,115,101,32,111,110,32,115,121,115,
++ 46,112,97,116,104,95,104,111,111,107,10,32,32,32,32,32,
++ 32,32,32,119,104,105,99,104,32,119,105,108,108,32,114,101,
++ 116,117,114,110,32,97,110,32,105,110,115,116,97,110,99,101,
++ 32,117,115,105,110,103,32,116,104,101,32,115,112,101,99,105,
++ 102,105,101,100,32,108,111,97,100,101,114,115,32,97,110,100,
++ 32,116,104,101,32,112,97,116,104,10,32,32,32,32,32,32,
++ 32,32,99,97,108,108,101,100,32,111,110,32,116,104,101,32,
++ 99,108,111,115,117,114,101,46,10,10,32,32,32,32,32,32,
++ 32,32,73,102,32,116,104,101,32,112,97,116,104,32,99,97,
+ 108,108,101,100,32,111,110,32,116,104,101,32,99,108,111,115,
+- 117,114,101,46,10,10,32,32,32,32,32,32,32,32,73,102,
+- 32,116,104,101,32,112,97,116,104,32,99,97,108,108,101,100,
+- 32,111,110,32,116,104,101,32,99,108,111,115,117,114,101,32,
+- 105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,
+- 114,121,44,32,73,109,112,111,114,116,69,114,114,111,114,32,
+- 105,115,10,32,32,32,32,32,32,32,32,114,97,105,115,101,
+- 100,46,10,10,32,32,32,32,32,32,32,32,99,1,0,0,
+- 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,
+- 0,19,0,0,0,115,36,0,0,0,116,0,124,0,131,1,
+- 115,10,116,1,100,1,124,0,100,2,141,2,130,1,136,0,
+- 124,0,103,1,136,1,162,1,82,0,142,0,83,0,41,3,
+- 122,45,80,97,116,104,32,104,111,111,107,32,102,111,114,32,
+- 105,109,112,111,114,116,108,105,98,46,109,97,99,104,105,110,
+- 101,114,121,46,70,105,108,101,70,105,110,100,101,114,46,122,
+- 30,111,110,108,121,32,100,105,114,101,99,116,111,114,105,101,
+- 115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,114,
+- 71,0,0,0,41,2,114,83,0,0,0,114,142,0,0,0,
+- 114,71,0,0,0,169,2,114,221,0,0,0,114,103,1,0,
+- 0,114,7,0,0,0,114,8,0,0,0,218,24,112,97,116,
+- 104,95,104,111,111,107,95,102,111,114,95,70,105,108,101,70,
+- 105,110,100,101,114,92,6,0,0,115,6,0,0,0,8,2,
+- 12,1,16,1,122,54,70,105,108,101,70,105,110,100,101,114,
+- 46,112,97,116,104,95,104,111,111,107,46,60,108,111,99,97,
+- 108,115,62,46,112,97,116,104,95,104,111,111,107,95,102,111,
+- 114,95,70,105,108,101,70,105,110,100,101,114,114,7,0,0,
+- 0,41,3,114,221,0,0,0,114,103,1,0,0,114,109,1,
+- 0,0,114,7,0,0,0,114,108,1,0,0,114,8,0,0,
+- 0,218,9,112,97,116,104,95,104,111,111,107,82,6,0,0,
+- 115,4,0,0,0,14,10,4,6,122,20,70,105,108,101,70,
+- 105,110,100,101,114,46,112,97,116,104,95,104,111,111,107,99,
+- 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+- 3,0,0,0,67,0,0,0,114,69,1,0,0,41,2,78,
+- 122,16,70,105,108,101,70,105,110,100,101,114,40,123,33,114,
+- 125,41,41,2,114,89,0,0,0,114,65,0,0,0,114,21,
+- 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
+- 0,0,114,70,1,0,0,100,6,0,0,114,63,1,0,0,
+- 122,19,70,105,108,101,70,105,110,100,101,114,46,95,95,114,
+- 101,112,114,95,95,114,69,0,0,0,41,15,114,150,0,0,
+- 0,114,149,0,0,0,114,151,0,0,0,114,152,0,0,0,
+- 114,236,0,0,0,114,80,1,0,0,114,167,0,0,0,114,
+- 229,0,0,0,114,161,0,0,0,114,93,1,0,0,114,226,
+- 0,0,0,114,104,1,0,0,114,234,0,0,0,114,110,1,
+- 0,0,114,70,1,0,0,114,7,0,0,0,114,7,0,0,
+- 0,114,7,0,0,0,114,8,0,0,0,114,96,1,0,0,
+- 205,5,0,0,115,24,0,0,0,8,0,4,2,8,7,8,
+- 16,4,4,8,2,8,15,10,5,8,51,2,31,10,1,12,
+- 17,114,96,1,0,0,99,4,0,0,0,0,0,0,0,0,
++ 117,114,101,32,105,115,32,110,111,116,32,97,32,100,105,114,
++ 101,99,116,111,114,121,44,32,73,109,112,111,114,116,69,114,
++ 114,111,114,32,105,115,10,32,32,32,32,32,32,32,32,114,
++ 97,105,115,101,100,46,10,10,32,32,32,32,32,32,32,32,
++ 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
++ 0,4,0,0,0,19,0,0,0,115,36,0,0,0,116,0,
++ 124,0,131,1,115,10,116,1,100,1,124,0,100,2,141,2,
++ 130,1,136,0,124,0,103,1,136,1,162,1,82,0,142,0,
++ 83,0,41,3,122,45,80,97,116,104,32,104,111,111,107,32,
++ 102,111,114,32,105,109,112,111,114,116,108,105,98,46,109,97,
++ 99,104,105,110,101,114,121,46,70,105,108,101,70,105,110,100,
++ 101,114,46,122,30,111,110,108,121,32,100,105,114,101,99,116,
++ 111,114,105,101,115,32,97,114,101,32,115,117,112,112,111,114,
++ 116,101,100,114,74,0,0,0,41,2,114,86,0,0,0,114,
++ 145,0,0,0,114,74,0,0,0,169,2,114,224,0,0,0,
++ 114,108,1,0,0,114,7,0,0,0,114,8,0,0,0,218,
++ 24,112,97,116,104,95,104,111,111,107,95,102,111,114,95,70,
++ 105,108,101,70,105,110,100,101,114,92,6,0,0,115,6,0,
++ 0,0,8,2,12,1,16,1,122,54,70,105,108,101,70,105,
++ 110,100,101,114,46,112,97,116,104,95,104,111,111,107,46,60,
++ 108,111,99,97,108,115,62,46,112,97,116,104,95,104,111,111,
++ 107,95,102,111,114,95,70,105,108,101,70,105,110,100,101,114,
++ 114,7,0,0,0,41,3,114,224,0,0,0,114,108,1,0,
++ 0,114,114,1,0,0,114,7,0,0,0,114,113,1,0,0,
++ 114,8,0,0,0,218,9,112,97,116,104,95,104,111,111,107,
++ 82,6,0,0,115,4,0,0,0,14,10,4,6,122,20,70,
++ 105,108,101,70,105,110,100,101,114,46,112,97,116,104,95,104,
++ 111,111,107,99,1,0,0,0,0,0,0,0,0,0,0,0,
++ 1,0,0,0,3,0,0,0,67,0,0,0,114,74,1,0,
++ 0,41,2,78,122,16,70,105,108,101,70,105,110,100,101,114,
++ 40,123,33,114,125,41,41,2,114,92,0,0,0,114,68,0,
++ 0,0,114,24,1,0,0,114,7,0,0,0,114,7,0,0,
++ 0,114,8,0,0,0,114,75,1,0,0,100,6,0,0,114,
++ 68,1,0,0,122,19,70,105,108,101,70,105,110,100,101,114,
++ 46,95,95,114,101,112,114,95,95,114,72,0,0,0,41,15,
++ 114,153,0,0,0,114,152,0,0,0,114,154,0,0,0,114,
++ 155,0,0,0,114,239,0,0,0,114,85,1,0,0,114,170,
++ 0,0,0,114,232,0,0,0,114,164,0,0,0,114,98,1,
++ 0,0,114,229,0,0,0,114,109,1,0,0,114,237,0,0,
++ 0,114,115,1,0,0,114,75,1,0,0,114,7,0,0,0,
++ 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
++ 101,1,0,0,205,5,0,0,115,24,0,0,0,8,0,4,
++ 2,8,7,8,16,4,4,8,2,8,15,10,5,8,51,2,
++ 31,10,1,12,17,114,101,1,0,0,99,0,0,0,0,0,
++ 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64,
++ 0,0,0,115,24,0,0,0,101,0,90,1,100,0,90,2,
++ 100,1,90,3,100,2,100,3,132,0,90,4,100,4,83,0,
++ 41,5,218,20,65,112,112,108,101,70,114,97,109,101,119,111,
++ 114,107,76,111,97,100,101,114,122,122,65,32,108,111,97,100,
++ 101,114,32,102,111,114,32,109,111,100,117,108,101,115,32,116,
++ 104,97,116,32,104,97,118,101,32,98,101,101,110,32,112,97,
++ 99,107,97,103,101,100,32,97,115,32,102,114,97,109,101,119,
++ 111,114,107,115,32,102,111,114,10,32,32,32,32,99,111,109,
++ 112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,
++ 65,112,112,108,101,39,115,32,105,79,83,32,65,112,112,32,
++ 83,116,111,114,101,32,112,111,108,105,99,105,101,115,46,10,
++ 32,32,32,32,99,2,0,0,0,0,0,0,0,0,0,0,
++ 0,8,0,0,0,8,0,0,0,67,0,0,0,115,254,0,
++ 0,0,124,1,106,0,160,1,100,1,161,1,114,50,116,2,
++ 160,3,124,1,106,0,100,2,161,2,143,16,125,2,124,2,
++ 160,4,161,0,160,5,161,0,160,6,161,0,125,3,87,0,
++ 100,0,4,0,4,0,131,3,1,0,110,8,49,0,115,32,
++ 119,1,1,0,1,0,1,0,89,0,1,0,116,7,116,8,
++ 106,9,131,1,100,3,25,0,125,4,116,10,124,4,124,3,
++ 131,2,124,1,95,0,124,0,106,11,160,1,100,1,161,1,
++ 114,60,124,0,106,11,125,5,110,45,116,2,160,3,124,0,
++ 106,11,100,4,23,0,100,2,161,2,143,28,125,2,124,2,
++ 160,4,161,0,160,5,161,0,160,6,161,0,125,6,116,7,
++ 116,8,106,9,131,1,100,3,25,0,125,4,116,10,124,4,
++ 124,6,131,2,125,5,87,0,100,0,4,0,4,0,131,3,
++ 1,0,110,8,49,0,115,100,119,1,1,0,1,0,1,0,
++ 89,0,1,0,116,12,160,13,116,14,106,15,124,1,161,2,
++ 125,7,116,12,160,16,100,5,124,1,106,17,124,1,106,0,
++ 124,5,161,4,1,0,124,5,124,7,95,18,124,7,83,0,
++ 41,6,78,250,6,46,102,119,111,114,107,114,32,1,0,0,
++ 114,0,0,0,0,122,7,46,111,114,105,103,105,110,122,66,
++ 65,112,112,108,101,32,102,114,97,109,101,119,111,114,107,32,
++ 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,
++ 32,123,33,114,125,32,108,111,97,100,101,100,32,102,114,111,
++ 109,32,123,33,114,125,32,40,112,97,116,104,32,123,33,114,
++ 125,41,41,19,114,208,0,0,0,114,61,0,0,0,114,94,
++ 0,0,0,114,95,0,0,0,114,34,1,0,0,114,200,0,
++ 0,0,218,5,115,116,114,105,112,114,77,0,0,0,114,18,
++ 0,0,0,90,10,101,120,101,99,117,116,97,98,108,101,114,
++ 70,0,0,0,114,68,0,0,0,114,162,0,0,0,114,245,
++ 0,0,0,114,190,0,0,0,114,46,1,0,0,114,176,0,
++ 0,0,114,144,0,0,0,218,8,95,95,102,105,108,101,95,
++ 95,41,8,114,146,0,0,0,114,213,0,0,0,114,97,0,
++ 0,0,90,16,102,114,97,109,101,119,111,114,107,95,98,105,
++ 110,97,114,121,90,11,98,117,110,100,108,101,95,112,97,116,
++ 104,114,68,0,0,0,114,208,0,0,0,114,247,0,0,0,
++ 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
++ 242,0,0,0,108,6,0,0,115,44,0,0,0,12,5,16,
++ 1,18,1,28,255,14,2,12,1,12,5,8,1,20,2,16,
++ 1,14,1,12,1,28,253,14,5,4,2,2,1,4,1,4,
++ 1,2,1,4,252,6,8,4,2,122,34,65,112,112,108,101,
++ 70,114,97,109,101,119,111,114,107,76,111,97,100,101,114,46,
++ 99,114,101,97,116,101,95,109,111,100,117,108,101,78,41,5,
++ 114,153,0,0,0,114,152,0,0,0,114,154,0,0,0,114,
++ 155,0,0,0,114,242,0,0,0,114,7,0,0,0,114,7,
++ 0,0,0,114,7,0,0,0,114,8,0,0,0,114,116,1,
++ 0,0,104,6,0,0,115,6,0,0,0,8,0,4,1,12,
++ 3,114,116,1,0,0,99,4,0,0,0,0,0,0,0,0,
+ 0,0,0,6,0,0,0,8,0,0,0,67,0,0,0,115,
+ 144,0,0,0,124,0,160,0,100,1,161,1,125,4,124,0,
+ 160,0,100,2,161,1,125,5,124,4,115,33,124,5,114,18,
+@@ -2664,108 +2725,125 @@
+ 60,0,124,3,124,0,100,5,60,0,87,0,100,0,83,0,
+ 4,0,116,5,121,71,1,0,1,0,1,0,89,0,100,0,
+ 83,0,119,0,41,6,78,218,10,95,95,108,111,97,100,101,
+- 114,95,95,218,8,95,95,115,112,101,99,95,95,114,97,1,
+- 0,0,90,8,95,95,102,105,108,101,95,95,90,10,95,95,
+- 99,97,99,104,101,100,95,95,41,6,218,3,103,101,116,114,
+- 164,0,0,0,114,41,1,0,0,114,34,1,0,0,114,213,
+- 0,0,0,218,9,69,120,99,101,112,116,105,111,110,41,6,
+- 90,2,110,115,114,141,0,0,0,90,8,112,97,116,104,110,
+- 97,109,101,90,9,99,112,97,116,104,110,97,109,101,114,164,
+- 0,0,0,114,210,0,0,0,114,7,0,0,0,114,7,0,
+- 0,0,114,8,0,0,0,218,14,95,102,105,120,95,117,112,
+- 95,109,111,100,117,108,101,106,6,0,0,115,36,0,0,0,
+- 10,2,10,1,4,1,4,1,8,1,8,1,12,1,10,2,
+- 4,1,14,1,2,1,8,1,8,1,8,1,14,1,12,1,
+- 6,2,2,254,114,115,1,0,0,99,0,0,0,0,0,0,
+- 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,
+- 0,0,115,38,0,0,0,116,0,116,1,160,2,161,0,102,
+- 2,125,0,116,3,116,4,102,2,125,1,116,5,116,6,102,
+- 2,125,2,124,0,124,1,124,2,103,3,83,0,41,1,122,
+- 95,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,
+- 111,102,32,102,105,108,101,45,98,97,115,101,100,32,109,111,
+- 100,117,108,101,32,108,111,97,100,101,114,115,46,10,10,32,
+- 32,32,32,69,97,99,104,32,105,116,101,109,32,105,115,32,
+- 97,32,116,117,112,108,101,32,40,108,111,97,100,101,114,44,
+- 32,115,117,102,102,105,120,101,115,41,46,10,32,32,32,32,
+- 41,7,114,30,1,0,0,114,187,0,0,0,218,18,101,120,
+- 116,101,110,115,105,111,110,95,115,117,102,102,105,120,101,115,
+- 114,34,1,0,0,114,127,0,0,0,114,41,1,0,0,114,
+- 113,0,0,0,41,3,90,10,101,120,116,101,110,115,105,111,
+- 110,115,90,6,115,111,117,114,99,101,90,8,98,121,116,101,
+- 99,111,100,101,114,7,0,0,0,114,7,0,0,0,114,8,
+- 0,0,0,114,208,0,0,0,129,6,0,0,115,8,0,0,
+- 0,12,5,8,1,8,1,10,1,114,208,0,0,0,99,1,
+- 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,
+- 0,0,0,67,0,0,0,115,8,0,0,0,124,0,97,0,
+- 100,0,83,0,114,69,0,0,0,41,1,114,159,0,0,0,
+- 41,1,218,17,95,98,111,111,116,115,116,114,97,112,95,109,
+- 111,100,117,108,101,114,7,0,0,0,114,7,0,0,0,114,
+- 8,0,0,0,218,21,95,115,101,116,95,98,111,111,116,115,
+- 116,114,97,112,95,109,111,100,117,108,101,140,6,0,0,115,
+- 2,0,0,0,8,2,114,118,1,0,0,99,1,0,0,0,
+- 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,
+- 67,0,0,0,115,50,0,0,0,116,0,124,0,131,1,1,
+- 0,116,1,131,0,125,1,116,2,106,3,160,4,116,5,106,
+- 6,124,1,142,0,103,1,161,1,1,0,116,2,106,7,160,
+- 8,116,9,161,1,1,0,100,1,83,0,41,2,122,41,73,
+- 110,115,116,97,108,108,32,116,104,101,32,112,97,116,104,45,
+- 98,97,115,101,100,32,105,109,112,111,114,116,32,99,111,109,
+- 112,111,110,101,110,116,115,46,78,41,10,114,118,1,0,0,
+- 114,208,0,0,0,114,15,0,0,0,114,85,1,0,0,114,
+- 191,0,0,0,114,96,1,0,0,114,110,1,0,0,218,9,
+- 109,101,116,97,95,112,97,116,104,114,61,0,0,0,114,79,
+- 1,0,0,41,2,114,117,1,0,0,90,17,115,117,112,112,
+- 111,114,116,101,100,95,108,111,97,100,101,114,115,114,7,0,
+- 0,0,114,7,0,0,0,114,8,0,0,0,218,8,95,105,
+- 110,115,116,97,108,108,145,6,0,0,115,8,0,0,0,8,
+- 2,6,1,20,1,16,1,114,120,1,0,0,41,1,114,87,
+- 0,0,0,114,69,0,0,0,41,3,78,78,78,41,2,114,
+- 0,0,0,0,114,0,0,0,0,41,1,84,41,85,114,152,
+- 0,0,0,114,159,0,0,0,114,187,0,0,0,114,91,0,
+- 0,0,114,15,0,0,0,114,99,0,0,0,114,184,0,0,
+- 0,114,25,0,0,0,114,231,0,0,0,90,2,110,116,114,
+- 18,0,0,0,114,215,0,0,0,90,5,112,111,115,105,120,
+- 114,50,0,0,0,218,3,97,108,108,114,59,0,0,0,114,
+- 136,0,0,0,114,57,0,0,0,114,62,0,0,0,90,20,
+- 95,112,97,116,104,115,101,112,115,95,119,105,116,104,95,99,
+- 111,108,111,110,114,28,0,0,0,90,37,95,67,65,83,69,
+- 95,73,78,83,69,78,83,73,84,73,86,69,95,80,76,65,
+- 84,70,79,82,77,83,95,66,89,84,69,83,95,75,69,89,
+- 114,27,0,0,0,114,29,0,0,0,114,21,0,0,0,114,
+- 36,0,0,0,114,42,0,0,0,114,45,0,0,0,114,67,
+- 0,0,0,114,74,0,0,0,114,75,0,0,0,114,79,0,
+- 0,0,114,80,0,0,0,114,83,0,0,0,114,86,0,0,
+- 0,114,95,0,0,0,218,4,116,121,112,101,218,8,95,95,
+- 99,111,100,101,95,95,114,186,0,0,0,114,34,0,0,0,
+- 114,172,0,0,0,114,33,0,0,0,114,39,0,0,0,114,
+- 8,1,0,0,114,116,0,0,0,114,112,0,0,0,114,127,
+- 0,0,0,114,61,0,0,0,114,116,1,0,0,114,232,0,
+- 0,0,114,113,0,0,0,90,23,68,69,66,85,71,95,66,
+- 89,84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,
+- 90,27,79,80,84,73,77,73,90,69,68,95,66,89,84,69,
+- 67,79,68,69,95,83,85,70,70,73,88,69,83,114,121,0,
+- 0,0,114,128,0,0,0,114,135,0,0,0,114,137,0,0,
+- 0,114,139,0,0,0,114,160,0,0,0,114,167,0,0,0,
+- 114,176,0,0,0,114,180,0,0,0,114,182,0,0,0,114,
+- 189,0,0,0,114,194,0,0,0,114,195,0,0,0,114,200,
+- 0,0,0,218,6,111,98,106,101,99,116,114,209,0,0,0,
+- 114,213,0,0,0,114,214,0,0,0,114,235,0,0,0,114,
+- 249,0,0,0,114,11,1,0,0,114,34,1,0,0,114,41,
+- 1,0,0,114,30,1,0,0,114,47,1,0,0,114,75,1,
+- 0,0,114,79,1,0,0,114,96,1,0,0,114,115,1,0,
+- 0,114,208,0,0,0,114,118,1,0,0,114,120,1,0,0,
+- 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
+- 8,0,0,0,218,8,60,109,111,100,117,108,101,62,1,0,
+- 0,0,115,180,0,0,0,4,0,4,22,8,3,8,1,8,
+- 1,8,1,8,1,10,3,4,1,8,1,10,1,8,2,4,
+- 3,10,1,6,2,22,2,8,1,8,1,10,1,14,1,4,
+- 4,4,1,2,1,2,1,4,255,8,4,6,16,8,3,8,
+- 5,8,5,4,6,10,1,8,30,8,6,8,8,8,10,8,
+- 9,8,5,4,7,10,1,8,8,10,5,10,22,0,127,16,
+- 30,12,1,4,2,4,1,6,2,4,1,10,1,8,2,6,
+- 2,8,2,16,2,8,71,8,40,8,19,8,12,8,12,8,
+- 31,8,20,8,33,8,28,10,24,10,13,10,10,8,11,6,
+- 14,4,3,2,1,12,255,14,73,14,67,16,30,0,127,14,
+- 17,18,50,18,45,18,25,14,53,14,69,14,49,0,127,14,
+- 32,0,127,10,30,8,23,8,11,12,5,
++ 114,95,95,218,8,95,95,115,112,101,99,95,95,114,102,1,
++ 0,0,114,119,1,0,0,90,10,95,95,99,97,99,104,101,
++ 100,95,95,41,6,218,3,103,101,116,114,167,0,0,0,114,
++ 45,1,0,0,114,38,1,0,0,114,216,0,0,0,218,9,
++ 69,120,99,101,112,116,105,111,110,41,6,90,2,110,115,114,
++ 144,0,0,0,90,8,112,97,116,104,110,97,109,101,90,9,
++ 99,112,97,116,104,110,97,109,101,114,167,0,0,0,114,213,
++ 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
++ 0,0,218,14,95,102,105,120,95,117,112,95,109,111,100,117,
++ 108,101,146,6,0,0,115,36,0,0,0,10,2,10,1,4,
++ 1,4,1,8,1,8,1,12,1,10,2,4,1,14,1,2,
++ 1,8,1,8,1,8,1,14,1,12,1,6,2,2,254,114,
++ 124,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,
++ 0,3,0,0,0,5,0,0,0,67,0,0,0,115,86,0,
++ 0,0,116,0,106,1,100,1,118,0,114,18,116,2,100,2,
++ 100,3,132,0,116,3,160,4,161,0,68,0,131,1,102,2,
++ 103,1,125,0,110,2,103,0,125,0,124,0,160,5,116,6,
++ 116,3,160,4,161,0,102,2,161,1,1,0,116,7,116,8,
++ 102,2,125,1,116,9,116,10,102,2,125,2,124,0,124,1,
++ 124,2,103,2,23,0,83,0,41,4,122,95,82,101,116,117,
++ 114,110,115,32,97,32,108,105,115,116,32,111,102,32,102,105,
++ 108,101,45,98,97,115,101,100,32,109,111,100,117,108,101,32,
++ 108,111,97,100,101,114,115,46,10,10,32,32,32,32,69,97,
++ 99,104,32,105,116,101,109,32,105,115,32,97,32,116,117,112,
++ 108,101,32,40,108,111,97,100,101,114,44,32,115,117,102,102,
++ 105,120,101,115,41,46,10,32,32,32,32,62,3,0,0,0,
++ 114,15,0,0,0,114,17,0,0,0,114,16,0,0,0,99,
++ 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,
++ 6,0,0,0,83,0,0,0,115,24,0,0,0,103,0,124,
++ 0,93,8,125,1,124,1,160,0,100,0,100,1,161,2,145,
++ 2,113,2,83,0,41,2,122,3,46,115,111,114,117,1,0,
++ 0,41,1,114,88,0,0,0,114,48,1,0,0,114,7,0,
++ 0,0,114,7,0,0,0,114,8,0,0,0,114,56,0,0,
++ 0,175,6,0,0,115,8,0,0,0,6,0,2,2,10,255,
++ 6,255,122,47,95,103,101,116,95,115,117,112,112,111,114,116,
++ 101,100,95,102,105,108,101,95,108,111,97,100,101,114,115,46,
++ 60,108,111,99,97,108,115,62,46,60,108,105,115,116,99,111,
++ 109,112,62,41,11,114,18,0,0,0,114,28,0,0,0,114,
++ 116,1,0,0,114,190,0,0,0,218,18,101,120,116,101,110,
++ 115,105,111,110,95,115,117,102,102,105,120,101,115,114,64,0,
++ 0,0,114,33,1,0,0,114,38,1,0,0,114,130,0,0,
++ 0,114,45,1,0,0,114,116,0,0,0,41,3,90,17,101,
++ 120,116,101,110,115,105,111,110,95,108,111,97,100,101,114,115,
++ 90,6,115,111,117,114,99,101,90,8,98,121,116,101,99,111,
++ 100,101,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
++ 0,114,211,0,0,0,169,6,0,0,115,18,0,0,0,10,
++ 5,8,1,6,2,12,254,4,5,18,1,8,1,8,1,12,
++ 1,114,211,0,0,0,99,1,0,0,0,0,0,0,0,0,
++ 0,0,0,1,0,0,0,1,0,0,0,67,0,0,0,115,
++ 8,0,0,0,124,0,97,0,100,0,83,0,114,72,0,0,
++ 0,41,1,114,162,0,0,0,41,1,218,17,95,98,111,111,
++ 116,115,116,114,97,112,95,109,111,100,117,108,101,114,7,0,
++ 0,0,114,7,0,0,0,114,8,0,0,0,218,21,95,115,
++ 101,116,95,98,111,111,116,115,116,114,97,112,95,109,111,100,
++ 117,108,101,187,6,0,0,115,2,0,0,0,8,2,114,127,
++ 1,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,
++ 2,0,0,0,4,0,0,0,67,0,0,0,115,50,0,0,
++ 0,116,0,124,0,131,1,1,0,116,1,131,0,125,1,116,
++ 2,106,3,160,4,116,5,106,6,124,1,142,0,103,1,161,
++ 1,1,0,116,2,106,7,160,8,116,9,161,1,1,0,100,
++ 1,83,0,41,2,122,41,73,110,115,116,97,108,108,32,116,
++ 104,101,32,112,97,116,104,45,98,97,115,101,100,32,105,109,
++ 112,111,114,116,32,99,111,109,112,111,110,101,110,116,115,46,
++ 78,41,10,114,127,1,0,0,114,211,0,0,0,114,18,0,
++ 0,0,114,90,1,0,0,114,194,0,0,0,114,101,1,0,
++ 0,114,115,1,0,0,218,9,109,101,116,97,95,112,97,116,
++ 104,114,64,0,0,0,114,84,1,0,0,41,2,114,126,1,
++ 0,0,90,17,115,117,112,112,111,114,116,101,100,95,108,111,
++ 97,100,101,114,115,114,7,0,0,0,114,7,0,0,0,114,
++ 8,0,0,0,218,8,95,105,110,115,116,97,108,108,192,6,
++ 0,0,115,8,0,0,0,8,2,6,1,20,1,16,1,114,
++ 129,1,0,0,41,1,114,90,0,0,0,114,72,0,0,0,
++ 41,3,78,78,78,41,2,114,0,0,0,0,114,0,0,0,
++ 0,41,1,84,41,86,114,155,0,0,0,114,162,0,0,0,
++ 114,190,0,0,0,114,94,0,0,0,114,18,0,0,0,114,
++ 102,0,0,0,114,187,0,0,0,114,28,0,0,0,114,234,
++ 0,0,0,90,2,110,116,114,21,0,0,0,114,218,0,0,
++ 0,90,5,112,111,115,105,120,114,53,0,0,0,218,3,97,
++ 108,108,114,62,0,0,0,114,139,0,0,0,114,60,0,0,
++ 0,114,65,0,0,0,90,20,95,112,97,116,104,115,101,112,
++ 115,95,119,105,116,104,95,99,111,108,111,110,114,31,0,0,
++ 0,90,37,95,67,65,83,69,95,73,78,83,69,78,83,73,
++ 84,73,86,69,95,80,76,65,84,70,79,82,77,83,95,66,
++ 89,84,69,83,95,75,69,89,114,30,0,0,0,114,32,0,
++ 0,0,114,24,0,0,0,114,39,0,0,0,114,45,0,0,
++ 0,114,48,0,0,0,114,70,0,0,0,114,77,0,0,0,
++ 114,78,0,0,0,114,82,0,0,0,114,83,0,0,0,114,
++ 86,0,0,0,114,89,0,0,0,114,98,0,0,0,218,4,
++ 116,121,112,101,218,8,95,95,99,111,100,101,95,95,114,189,
++ 0,0,0,114,37,0,0,0,114,175,0,0,0,114,36,0,
++ 0,0,114,42,0,0,0,114,11,1,0,0,114,119,0,0,
++ 0,114,115,0,0,0,114,130,0,0,0,114,64,0,0,0,
++ 114,125,1,0,0,114,235,0,0,0,114,116,0,0,0,90,
++ 23,68,69,66,85,71,95,66,89,84,69,67,79,68,69,95,
++ 83,85,70,70,73,88,69,83,90,27,79,80,84,73,77,73,
++ 90,69,68,95,66,89,84,69,67,79,68,69,95,83,85,70,
++ 70,73,88,69,83,114,124,0,0,0,114,131,0,0,0,114,
++ 138,0,0,0,114,140,0,0,0,114,142,0,0,0,114,163,
++ 0,0,0,114,170,0,0,0,114,179,0,0,0,114,183,0,
++ 0,0,114,185,0,0,0,114,192,0,0,0,114,197,0,0,
++ 0,114,198,0,0,0,114,203,0,0,0,218,6,111,98,106,
++ 101,99,116,114,212,0,0,0,114,216,0,0,0,114,217,0,
++ 0,0,114,238,0,0,0,114,252,0,0,0,114,14,1,0,
++ 0,114,38,1,0,0,114,45,1,0,0,114,33,1,0,0,
++ 114,52,1,0,0,114,80,1,0,0,114,84,1,0,0,114,
++ 101,1,0,0,114,116,1,0,0,114,124,1,0,0,114,211,
++ 0,0,0,114,127,1,0,0,114,129,1,0,0,114,7,0,
++ 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
++ 0,218,8,60,109,111,100,117,108,101,62,1,0,0,0,115,
++ 182,0,0,0,4,0,4,22,8,3,8,1,8,1,8,1,
++ 8,1,10,3,4,1,8,1,10,1,8,2,4,3,10,1,
++ 6,2,22,2,8,1,8,1,10,1,14,1,4,4,4,1,
++ 2,1,2,1,4,255,8,4,6,16,8,3,8,5,8,5,
++ 4,6,10,1,8,30,8,6,8,8,8,10,8,9,8,5,
++ 4,7,10,1,8,8,10,5,10,22,0,127,16,30,12,1,
++ 4,2,4,1,6,2,4,1,10,1,8,2,6,2,8,2,
++ 16,2,8,71,8,40,8,19,8,12,8,12,8,31,8,20,
++ 8,33,8,28,10,24,10,13,10,10,8,11,6,14,4,3,
++ 2,1,12,255,14,73,14,67,16,30,0,127,14,17,18,50,
++ 18,45,18,25,14,53,14,69,14,49,0,127,14,32,0,127,
++ 16,28,10,42,8,23,8,18,12,5,
+ };
+diff --git a/Python/marshal.c b/Python/marshal.c
+index 67540e08ed9..062e3047fb8 100644
+--- a/Python/marshal.c
++++ b/Python/marshal.c
+@@ -14,6 +14,10 @@
+ #include "marshal.h"
+ #include "pycore_hashtable.h"
+
++#ifdef __APPLE__
++# include "TargetConditionals.h"
++#endif /* __APPLE__ */
+
-+ print(f"Successfully cloned testbed: {target.resolve()}")
+ /*[clinic input]
+ module marshal
+ [clinic start generated code]*/
+@@ -33,9 +37,12 @@
+ * #if defined(MS_WINDOWS) && defined(_DEBUG)
+ */
+ #if defined(MS_WINDOWS)
+-#define MAX_MARSHAL_STACK_DEPTH 1000
++# define MAX_MARSHAL_STACK_DEPTH 1000
++// TARGET_OS_IPHONE covers any non-macOS Apple platform.
++#elif defined(__APPLE__) && TARGET_OS_IPHONE
++# define MAX_MARSHAL_STACK_DEPTH 1500
+ #else
+-#define MAX_MARSHAL_STACK_DEPTH 2000
++# define MAX_MARSHAL_STACK_DEPTH 2000
+ #endif
+
+ #define TYPE_NULL '0'
+diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
+index b0c5da56c4f..ec53e7484fc 100644
+--- a/Python/pylifecycle.c
++++ b/Python/pylifecycle.c
+@@ -18,7 +18,21 @@
+ #include // setlocale()
+
+ #if defined(__APPLE__)
+-#include
++# include
++# include
++# include
++// The os_log unified logging APIs were introduced in macOS 10.12, iOS 10.0,
++// tvOS 10.0, and watchOS 3.0; we enable the use of the system logger
++// automatically on non-macOS platforms.
++# if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
++# define USE_APPLE_SYSTEM_LOG 1
++# else
++# define USE_APPLE_SYSTEM_LOG 0
++# endif
+
++# if USE_APPLE_SYSTEM_LOG
++# include
++# endif
+ #endif
+
+ #ifdef HAVE_SIGNAL_H
+@@ -58,6 +72,9 @@
+ static PyStatus init_import_site(void);
+ static PyStatus init_set_builtins_open(void);
+ static PyStatus init_sys_streams(PyThreadState *tstate);
++#if defined(__APPLE__) && USE_APPLE_SYSTEM_LOG
++static PyStatus init_apple_streams(PyThreadState *tstate);
++#endif
+ static void wait_for_thread_shutdown(PyThreadState *tstate);
+ static void call_ll_exitfuncs(_PyRuntimeState *runtime);
+
+@@ -1126,6 +1143,17 @@
+ return status;
+ }
+
++#if defined(__APPLE__) && USE_APPLE_SYSTEM_LOG
++ status = init_apple_streams(tstate);
++ if (_PyStatus_EXCEPTION(status)) {
++ return status;
++ }
++#endif
+
-+def update_plist(testbed_path, args):
-+ # Add the test runner arguments to the testbed's Info.plist file.
-+ info_plist = testbed_path / "iOSTestbed" / "iOSTestbed-Info.plist"
-+ with info_plist.open("rb") as f:
-+ info = plistlib.load(f)
++#ifdef Py_DEBUG
++ run_presite(tstate);
++#endif
+
-+ info["TestArgs"] = args
+ status = add_main_module(interp);
+ if (_PyStatus_EXCEPTION(status)) {
+ return status;
+@@ -2408,6 +2436,69 @@
+ return res;
+ }
+
++#if defined(__APPLE__) && USE_APPLE_SYSTEM_LOG
+
-+ with info_plist.open("wb") as f:
-+ plistlib.dump(info, f)
++static PyObject *
++apple_log_write_impl(PyObject *self, PyObject *args)
++{
++ int logtype = 0;
++ const char *text = NULL;
++ if (!PyArg_ParseTuple(args, "iy", &logtype, &text)) {
++ return NULL;
++ }
+
++ // Pass the user-provided text through explicit %s formatting
++ // to avoid % literals being interpreted as a formatting directive.
++ os_log_with_type(OS_LOG_DEFAULT, logtype, "%s", text);
++ Py_RETURN_NONE;
++}
+
-+async def run_testbed(simulator: str, args: list[str], verbose: bool=False):
-+ location = Path(__file__).parent
-+ print("Updating plist...", end="", flush=True)
-+ update_plist(location, args)
-+ print(" done.")
+
-+ # Get the list of devices that are booted at the start of the test run.
-+ # The simulator started by the test suite will be detected as the new
-+ # entry that appears on the device list.
-+ initial_devices = await list_devices()
++static PyMethodDef apple_log_write_method = {
++ "apple_log_write", apple_log_write_impl, METH_VARARGS
++};
+
-+ try:
-+ async with asyncio.TaskGroup() as tg:
-+ tg.create_task(log_stream_task(initial_devices))
-+ tg.create_task(xcode_test(location, simulator=simulator, verbose=verbose))
-+ except MySystemExit as e:
-+ raise SystemExit(*e.exceptions[0].args) from None
-+ except subprocess.CalledProcessError as e:
-+ # Extract it from the ExceptionGroup so it can be handled by `main`.
-+ raise e.exceptions[0]
+
++static PyStatus
++init_apple_streams(PyThreadState *tstate)
++{
++ PyStatus status = _PyStatus_OK();
++ PyObject *_apple_support = NULL;
++ PyObject *apple_log_write = NULL;
++ PyObject *result = NULL;
+
-+def main():
-+ parser = argparse.ArgumentParser(
-+ description=(
-+ "Manages the process of testing a Python project in the iOS simulator."
-+ ),
-+ )
++ _apple_support = PyImport_ImportModule("_apple_support");
++ if (_apple_support == NULL) {
++ goto error;
++ }
+
-+ subcommands = parser.add_subparsers(dest="subcommand")
++ apple_log_write = PyCFunction_New(&apple_log_write_method, NULL);
++ if (apple_log_write == NULL) {
++ goto error;
++ }
+
-+ clone = subcommands.add_parser(
-+ "clone",
-+ description=(
-+ "Clone the testbed project, copying in an iOS Python framework and"
-+ "any specified application code."
-+ ),
-+ help="Clone a testbed project to a new location.",
-+ )
-+ clone.add_argument(
-+ "--framework",
-+ help=(
-+ "The location of the XCFramework (or simulator-only slice of an "
-+ "XCFramework) to use when running the testbed"
-+ ),
-+ )
-+ clone.add_argument(
-+ "--app",
-+ dest="apps",
-+ action="append",
-+ default=[],
-+ help="The location of any code to include in the testbed project",
-+ )
-+ clone.add_argument(
-+ "location",
-+ help="The path where the testbed will be cloned.",
-+ )
++ // Initialize the logging streams, sending stdout -> Default; stderr -> Error
++ result = PyObject_CallMethod(
++ _apple_support, "init_streams", "Oii",
++ apple_log_write, OS_LOG_TYPE_DEFAULT, OS_LOG_TYPE_ERROR);
++ if (result == NULL) {
++ goto error;
++ }
++ goto done;
+
-+ run = subcommands.add_parser(
-+ "run",
-+ usage="%(prog)s [-h] [--simulator SIMULATOR] -- [ ...]",
-+ description=(
-+ "Run a testbed project. The arguments provided after `--` will be "
-+ "passed to the running iOS process as if they were arguments to "
-+ "`python -m`."
-+ ),
-+ help="Run a testbed project",
-+ )
-+ run.add_argument(
-+ "--simulator",
-+ default="iPhone SE (3rd Generation)",
-+ help="The name of the simulator to use (default: 'iPhone SE (3rd Generation)')",
-+ )
-+ run.add_argument(
-+ "-v", "--verbose",
-+ action="store_true",
-+ help="Enable verbose output",
-+ )
++error:
++ _PyErr_Print(tstate);
++ status = _PyStatus_ERR("failed to initialize Apple log streams");
+
-+ try:
-+ pos = sys.argv.index("--")
-+ testbed_args = sys.argv[1:pos]
-+ test_args = sys.argv[pos + 1 :]
-+ except ValueError:
-+ testbed_args = sys.argv[1:]
-+ test_args = []
++done:
++ Py_XDECREF(result);
++ Py_XDECREF(apple_log_write);
++ Py_XDECREF(_apple_support);
++ return status;
++}
+
-+ context = parser.parse_args(testbed_args)
++#endif // __APPLE__ && USE_APPLE_SYSTEM_LOG
+
-+ if context.subcommand == "clone":
-+ clone_testbed(
-+ source=Path(__file__).parent.resolve(),
-+ target=Path(context.location).resolve(),
-+ framework=Path(context.framework).resolve() if context.framework else None,
-+ apps=[Path(app) for app in context.apps],
-+ )
-+ elif context.subcommand == "run":
-+ if test_args:
-+ if not (
-+ Path(__file__).parent / "Python.xcframework/ios-arm64_x86_64-simulator/bin"
-+ ).is_dir():
-+ print(
-+ f"Testbed does not contain a compiled iOS framework. Use "
-+ f"`python {sys.argv[0]} clone ...` to create a runnable "
-+ f"clone of this testbed."
-+ )
-+ sys.exit(20)
+
+ static void
+ _Py_FatalError_DumpTracebacks(int fd, PyInterpreterState *interp,
+diff --git a/Python/stdlib_module_names.h b/Python/stdlib_module_names.h
+index 50cf340e543..c1d391e5229 100644
+--- a/Python/stdlib_module_names.h
++++ b/Python/stdlib_module_names.h
+@@ -5,6 +5,7 @@
+ "__future__",
+ "_abc",
+ "_aix_support",
++"_apple_support",
+ "_ast",
+ "_asyncio",
+ "_bisect",
+@@ -40,6 +41,7 @@
+ "_heapq",
+ "_imp",
+ "_io",
++"_ios_support",
+ "_json",
+ "_locale",
+ "_lsprof",
+diff --git a/config.sub b/config.sub
+index d74fb6deac9..1bb6a05dc11 100755
+--- a/config.sub
++++ b/config.sub
+@@ -1,14 +1,15 @@
+ #! /bin/sh
+ # Configuration validation subroutine script.
+-# Copyright 1992-2021 Free Software Foundation, Inc.
++# Copyright 1992-2024 Free Software Foundation, Inc.
+
+ # shellcheck disable=SC2006,SC2268 # see below for rationale
+
+-timestamp='2021-08-14'
++# Patched 2024-02-03 to include support for arm64_32 and iOS/tvOS/watchOS simulators
++timestamp='2024-01-01'
+
+ # This file is free software; you can redistribute it and/or modify it
+ # under the terms of the GNU General Public License as published by
+-# the Free Software Foundation; either version 3 of the License, or
++# the Free Software Foundation, either version 3 of the License, or
+ # (at your option) any later version.
+ #
+ # This program is distributed in the hope that it will be useful, but
+@@ -76,13 +77,13 @@
+ version="\
+ GNU config.sub ($timestamp)
+
+-Copyright 1992-2021 Free Software Foundation, Inc.
++Copyright 1992-2024 Free Software Foundation, Inc.
+
+ This is free software; see the source for copying conditions. There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+ help="
+-Try \`$me --help' for more information."
++Try '$me --help' for more information."
+
+ # Parse command line
+ while test $# -gt 0 ; do
+@@ -130,7 +131,7 @@
+ # Separate into logical components for further validation
+ case $1 in
+ *-*-*-*-*)
+- echo Invalid configuration \`"$1"\': more than four components >&2
++ echo "Invalid configuration '$1': more than four components" >&2
+ exit 1
+ ;;
+ *-*-*-*)
+@@ -145,7 +146,8 @@
+ nto-qnx* | linux-* | uclinux-uclibc* \
+ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
+ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
+- | storm-chaos* | os2-emx* | rtmk-nova*)
++ | storm-chaos* | os2-emx* | rtmk-nova* | managarm-* \
++ | windows-* )
+ basic_machine=$field1
+ basic_os=$maybe_os
+ ;;
+@@ -943,7 +945,7 @@
+ EOF
+ IFS=$saved_IFS
+ ;;
+- # We use `pc' rather than `unknown'
++ # We use 'pc' rather than 'unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+@@ -1020,6 +1022,11 @@
+ ;;
+
+ # Here we normalize CPU types with a missing or matching vendor
++ armh-unknown | armh-alt)
++ cpu=armv7l
++ vendor=alt
++ basic_os=${basic_os:-linux-gnueabihf}
++ ;;
+ dpx20-unknown | dpx20-bull)
+ cpu=rs6000
+ vendor=bull
+@@ -1070,7 +1077,7 @@
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ cpu=i586
+ ;;
+- pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
++ pentiumpro-* | p6-* | 6x86-* | athlon-* | athlon_*-*)
+ cpu=i686
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+@@ -1121,7 +1128,7 @@
+ xscale-* | xscalee[bl]-*)
+ cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
+ ;;
+- arm64-*)
++ arm64-* | aarch64le-* | arm64_32-*)
+ cpu=aarch64
+ ;;
+
+@@ -1175,7 +1182,7 @@
+ case $cpu in
+ 1750a | 580 \
+ | a29k \
+- | aarch64 | aarch64_be \
++ | aarch64 | aarch64_be | aarch64c | arm64ec \
+ | abacus \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
+@@ -1194,50 +1201,29 @@
+ | d10v | d30v | dlx | dsp16xx \
+ | e2k | elxsi | epiphany \
+ | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
++ | javascript \
+ | h8300 | h8500 \
+ | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | hexagon \
+ | i370 | i*86 | i860 | i960 | ia16 | ia64 \
+ | ip2k | iq2000 \
+ | k1om \
++ | kvx \
+ | le32 | le64 \
+ | lm32 \
+- | loongarch32 | loongarch64 | loongarchx32 \
++ | loongarch32 | loongarch64 \
+ | m32c | m32r | m32rle \
+ | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+ | m88110 | m88k | maxq | mb | mcore | mep | metag \
+ | microblaze | microblazeel \
+- | mips | mipsbe | mipseb | mipsel | mipsle \
+- | mips16 \
+- | mips64 | mips64eb | mips64el \
+- | mips64octeon | mips64octeonel \
+- | mips64orion | mips64orionel \
+- | mips64r5900 | mips64r5900el \
+- | mips64vr | mips64vrel \
+- | mips64vr4100 | mips64vr4100el \
+- | mips64vr4300 | mips64vr4300el \
+- | mips64vr5000 | mips64vr5000el \
+- | mips64vr5900 | mips64vr5900el \
+- | mipsisa32 | mipsisa32el \
+- | mipsisa32r2 | mipsisa32r2el \
+- | mipsisa32r3 | mipsisa32r3el \
+- | mipsisa32r5 | mipsisa32r5el \
+- | mipsisa32r6 | mipsisa32r6el \
+- | mipsisa64 | mipsisa64el \
+- | mipsisa64r2 | mipsisa64r2el \
+- | mipsisa64r3 | mipsisa64r3el \
+- | mipsisa64r5 | mipsisa64r5el \
+- | mipsisa64r6 | mipsisa64r6el \
+- | mipsisa64sb1 | mipsisa64sb1el \
+- | mipsisa64sr71k | mipsisa64sr71kel \
+- | mipsr5900 | mipsr5900el \
+- | mipstx39 | mipstx39el \
++ | mips* \
+ | mmix \
+ | mn10200 | mn10300 \
+ | moxie \
+ | mt \
+ | msp430 \
++ | nanomips* \
+ | nds32 | nds32le | nds32be \
+ | nfp \
+ | nios | nios2 | nios2eb | nios2el \
+@@ -1269,6 +1255,7 @@
+ | ubicom32 \
+ | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
+ | vax \
++ | vc4 \
+ | visium \
+ | w65 \
+ | wasm32 | wasm64 \
+@@ -1280,7 +1267,7 @@
+ ;;
+
+ *)
+- echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
++ echo "Invalid configuration '$1': machine '$cpu-$vendor' not recognized" 1>&2
+ exit 1
+ ;;
+ esac
+@@ -1301,11 +1288,12 @@
+
+ # Decode manufacturer-specific aliases for certain operating systems.
+
+-if test x$basic_os != x
++if test x"$basic_os" != x
+ then
+
+-# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just
++# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just
+ # set os.
++obj=
+ case $basic_os in
+ gnu/linux*)
+ kernel=linux
+@@ -1336,6 +1324,10 @@
+ kernel=linux
+ os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
+ ;;
++ managarm*)
++ kernel=managarm
++ os=`echo "$basic_os" | sed -e 's|managarm|mlibc|'`
++ ;;
+ *)
+ kernel=
+ os=$basic_os
+@@ -1501,10 +1493,16 @@
+ os=eabi
+ ;;
+ *)
+- os=elf
++ os=
++ obj=elf
+ ;;
+ esac
+ ;;
++ aout* | coff* | elf* | pe*)
++ # These are machine code file formats, not OSes
++ obj=$os
++ os=
++ ;;
+ *)
+ # No normalization, but not necessarily accepted, that comes below.
+ ;;
+@@ -1523,12 +1521,15 @@
+ # system, and we'll never get to this point.
+
+ kernel=
++obj=
+ case $cpu-$vendor in
+ score-*)
+- os=elf
++ os=
++ obj=elf
+ ;;
+ spu-*)
+- os=elf
++ os=
++ obj=elf
+ ;;
+ *-acorn)
+ os=riscix1.2
+@@ -1538,28 +1539,35 @@
+ os=gnu
+ ;;
+ arm*-semi)
+- os=aout
++ os=
++ obj=aout
+ ;;
+ c4x-* | tic4x-*)
+- os=coff
++ os=
++ obj=coff
+ ;;
+ c8051-*)
+- os=elf
++ os=
++ obj=elf
+ ;;
+ clipper-intergraph)
+ os=clix
+ ;;
+ hexagon-*)
+- os=elf
++ os=
++ obj=elf
+ ;;
+ tic54x-*)
+- os=coff
++ os=
++ obj=coff
+ ;;
+ tic55x-*)
+- os=coff
++ os=
++ obj=coff
+ ;;
+ tic6x-*)
+- os=coff
++ os=
++ obj=coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+@@ -1581,19 +1589,24 @@
+ os=sunos3
+ ;;
+ m68*-cisco)
+- os=aout
++ os=
++ obj=aout
+ ;;
+ mep-*)
+- os=elf
++ os=
++ obj=elf
+ ;;
+ mips*-cisco)
+- os=elf
++ os=
++ obj=elf
+ ;;
+- mips*-*)
+- os=elf
++ mips*-*|nanomips*-*)
++ os=
++ obj=elf
+ ;;
+ or32-*)
+- os=coff
++ os=
++ obj=coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=sysv3
+@@ -1602,7 +1615,8 @@
+ os=sunos4.1.1
+ ;;
+ pru-*)
+- os=elf
++ os=
++ obj=elf
+ ;;
+ *-be)
+ os=beos
+@@ -1683,10 +1697,12 @@
+ os=uxpv
+ ;;
+ *-rom68k)
+- os=coff
++ os=
++ obj=coff
+ ;;
+ *-*bug)
+- os=coff
++ os=
++ obj=coff
+ ;;
+ *-apple)
+ os=macos
+@@ -1704,10 +1720,11 @@
+
+ fi
+
+-# Now, validate our (potentially fixed-up) OS.
++# Now, validate our (potentially fixed-up) individual pieces (OS, OBJ).
+
-+ asyncio.run(
-+ run_testbed(
-+ simulator=context.simulator,
-+ verbose=context.verbose,
-+ args=test_args,
-+ )
-+ )
-+ else:
-+ print(f"Must specify test arguments (e.g., {sys.argv[0]} run -- test)")
-+ print()
-+ parser.print_help(sys.stderr)
-+ sys.exit(21)
-+ else:
-+ parser.print_help(sys.stderr)
-+ sys.exit(1)
+ case $os in
+ # Sometimes we do "kernel-libc", so those need to count as OSes.
+- musl* | newlib* | relibc* | uclibc*)
++ llvm* | musl* | newlib* | relibc* | uclibc*)
+ ;;
+ # Likewise for "kernel-abi"
+ eabi* | gnueabi*)
+@@ -1715,6 +1732,9 @@
+ # VxWorks passes extra cpu info in the 4th filed.
+ simlinux | simwindows | spe)
+ ;;
++ # See `case $cpu-$os` validation below
++ ghcjs)
++ ;;
+ # Now accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST end in a * to match a version number.
+@@ -1723,7 +1743,7 @@
+ | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
+ | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \
+ | hiux* | abug | nacl* | netware* | windows* \
+- | os9* | macos* | osx* | ios* \
++ | os9* | macos* | osx* | ios* | tvos* | watchos* \
+ | mpw* | magic* | mmixware* | mon960* | lnews* \
+ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
+ | aos* | aros* | cloudabi* | sortix* | twizzler* \
+@@ -1732,11 +1752,11 @@
+ | mirbsd* | netbsd* | dicos* | openedition* | ose* \
+ | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \
+ | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
+- | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
+- | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
++ | bosx* | nextstep* | cxux* | oabi* \
++ | ptx* | ecoff* | winnt* | domain* | vsta* \
+ | udi* | lites* | ieee* | go32* | aux* | hcos* \
+ | chorusrdb* | cegcc* | glidix* | serenity* \
+- | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
++ | cygwin* | msys* | moss* | proelf* | rtems* \
+ | midipix* | mingw32* | mingw64* | mint* \
+ | uxpv* | beos* | mpeix* | udk* | moxiebox* \
+ | interix* | uwin* | mks* | rhapsody* | darwin* \
+@@ -1748,49 +1768,119 @@
+ | skyos* | haiku* | rdos* | toppers* | drops* | es* \
+ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
+ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
+- | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr*)
++ | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \
++ | fiwix* | mlibc* | cos* | mbr* | ironclad* )
+ ;;
+ # This one is extra strict with allowed versions
+ sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ ;;
++ # This refers to builds using the UEFI calling convention
++ # (which depends on the architecture) and PE file format.
++ # Note that this is both a different calling convention and
++ # different file format than that of GNU-EFI
++ # (x86_64-w64-mingw32).
++ uefi)
++ ;;
+ none)
+ ;;
++ kernel* | msvc* )
++ # Restricted further below
++ ;;
++ '')
++ if test x"$obj" = x
++ then
++ echo "Invalid configuration '$1': Blank OS only allowed with explicit machine code file format" 1>&2
++ fi
++ ;;
+ *)
+- echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
++ echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2
++ exit 1
++ ;;
++esac
+
++case $obj in
++ aout* | coff* | elf* | pe*)
++ ;;
++ '')
++ # empty is fine
++ ;;
++ *)
++ echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2
++ exit 1
++ ;;
++esac
+
-+if __name__ == "__main__":
-+ main()
---- /dev/null
-+++ b/iOS/testbed/iOSTestbed.xcodeproj/project.pbxproj
-@@ -0,0 +1,580 @@
-+// !$*UTF8*$!
-+{
-+ archiveVersion = 1;
-+ classes = {
-+ };
-+ objectVersion = 56;
-+ objects = {
++# Here we handle the constraint that a (synthetic) cpu and os are
++# valid only in combination with each other and nowhere else.
++case $cpu-$os in
++ # The "javascript-unknown-ghcjs" triple is used by GHC; we
++ # accept it here in order to tolerate that, but reject any
++ # variations.
++ javascript-ghcjs)
++ ;;
++ javascript-* | *-ghcjs)
++ echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2
+ exit 1
+ ;;
+ esac
+
+ # As a final step for OS-related things, validate the OS-kernel combination
+ # (given a valid OS), if there is a kernel.
+-case $kernel-$os in
+- linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \
+- | linux-musl* | linux-relibc* | linux-uclibc* )
++case $kernel-$os-$obj in
++ linux-gnu*- | linux-android*- | linux-dietlibc*- | linux-llvm*- \
++ | linux-mlibc*- | linux-musl*- | linux-newlib*- \
++ | linux-relibc*- | linux-uclibc*- )
++ ;;
++ uclinux-uclibc*- )
+ ;;
+- uclinux-uclibc* )
++ managarm-mlibc*- | managarm-kernel*- )
+ ;;
+- -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* )
++ windows*-msvc*-)
++ ;;
++ -dietlibc*- | -llvm*- | -mlibc*- | -musl*- | -newlib*- | -relibc*- \
++ | -uclibc*- )
+ # These are just libc implementations, not actual OSes, and thus
+ # require a kernel.
+- echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
++ echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2
+ exit 1
+ ;;
+- kfreebsd*-gnu* | kopensolaris*-gnu*)
++ -kernel*- )
++ echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2
++ exit 1
+ ;;
+- vxworks-simlinux | vxworks-simwindows | vxworks-spe)
++ *-kernel*- )
++ echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2
++ exit 1
+ ;;
+- nto-qnx*)
++ *-msvc*- )
++ echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2
++ exit 1
+ ;;
+- os2-emx)
++ kfreebsd*-gnu*- | kopensolaris*-gnu*-)
+ ;;
+- *-eabi* | *-gnueabi*)
++ vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-)
+ ;;
+- -*)
++ nto-qnx*-)
++ ;;
++ os2-emx-)
++ ;;
++ *-eabi*- | *-gnueabi*-)
++ ;;
++ ios*-simulator- | tvos*-simulator- | watchos*-simulator- )
++ ;;
++ none--*)
++ # None (no kernel, i.e. freestanding / bare metal),
++ # can be paired with an machine code file format
++ ;;
++ -*-)
+ # Blank kernel with real OS is always fine.
+ ;;
+- *-*)
+- echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
++ --*)
++ # Blank kernel and OS with real machine code file format is always fine.
++ ;;
++ *-*-*)
++ echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2
+ exit 1
+ ;;
+ esac
+@@ -1873,7 +1963,7 @@
+ ;;
+ esac
+
+-echo "$cpu-$vendor-${kernel:+$kernel-}$os"
++echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}"
+ exit
+
+ # Local variables:
+diff --git a/configure b/configure
+index 4b71c4e00f8..72f19106f3d 100755
+--- a/configure
++++ b/configure
+@@ -660,6 +660,8 @@
+ DTRACE
+ TCLTK_LIBS
+ TCLTK_INCLUDES
++LIBFFI_LIB
++LIBFFI_LIBDIR
+ LIBFFI_INCLUDEDIR
+ PKG_CONFIG_LIBDIR
+ PKG_CONFIG_PATH
+@@ -736,10 +738,14 @@
+ LDFLAGS
+ CFLAGS
+ CC
++WATCHOS_DEPLOYMENT_TARGET
++TVOS_DEPLOYMENT_TARGET
++IPHONEOS_DEPLOYMENT_TARGET
+ EXPORT_MACOSX_DEPLOYMENT_TARGET
+ CONFIGURE_MACOSX_DEPLOYMENT_TARGET
+ _PYTHON_HOST_PLATFORM
+-MACHDEP
++APP_STORE_COMPLIANCE_PATCH
++INSTALLTARGETS
+ FRAMEWORKINSTALLAPPSPREFIX
+ FRAMEWORKUNIXTOOLSPREFIX
+ FRAMEWORKPYTHONW
+@@ -747,6 +753,8 @@
+ FRAMEWORKALTINSTALLFIRST
+ FRAMEWORKINSTALLLAST
+ FRAMEWORKINSTALLFIRST
++RESSRCDIR
++PYTHONFRAMEWORKINSTALLNAMEPREFIX
+ PYTHONFRAMEWORKINSTALLDIR
+ PYTHONFRAMEWORKPREFIX
+ PYTHONFRAMEWORKDIR
+@@ -756,6 +764,7 @@
+ LIPO_32BIT_FLAGS
+ ARCH_RUN_32BIT
+ UNIVERSALSDK
++MACHDEP
+ CONFIG_ARGS
+ SOVERSION
+ VERSION
+@@ -793,7 +802,6 @@
+ docdir
+ oldincludedir
+ includedir
+-runstatedir
+ localstatedir
+ sharedstatedir
+ sysconfdir
+@@ -820,6 +828,7 @@
+ with_universal_archs
+ with_framework_name
+ enable_framework
++with_app_store_compliance
+ with_cxx_main
+ with_suffix
+ enable_shared
+@@ -917,7 +926,6 @@
+ sysconfdir='${prefix}/etc'
+ sharedstatedir='${prefix}/com'
+ localstatedir='${prefix}/var'
+-runstatedir='${localstatedir}/run'
+ includedir='${prefix}/include'
+ oldincludedir='/usr/include'
+ docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+@@ -1170,15 +1178,6 @@
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+- -runstatedir | --runstatedir | --runstatedi | --runstated \
+- | --runstate | --runstat | --runsta | --runst | --runs \
+- | --run | --ru | --r)
+- ac_prev=runstatedir ;;
+- -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+- | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+- | --run=* | --ru=* | --r=*)
+- runstatedir=$ac_optarg ;;
+-
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+@@ -1316,7 +1315,7 @@
+ for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+- libdir localedir mandir runstatedir
++ libdir localedir mandir
+ do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+@@ -1469,7 +1468,6 @@
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+- --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+@@ -1542,6 +1540,10 @@
+ specify the name for the python framework on macOS
+ only valid when --enable-framework is set. see
+ Mac/README.rst (default is 'Python')
++ --with-app-store-compliance=[PATCH-FILE]
++ Enable any patches required for compiliance with app
++ stores. Optional PATCH-FILE specifies the custom
++ patch to apply.
+ --with-cxx-main[=COMPILER]
+ compile main() and link Python executable with C++
+ compiler specified in COMPILER (default is $CXX)
+@@ -3007,7 +3009,7 @@
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for python interpreter for cross build" >&5
+ $as_echo_n "checking for python interpreter for cross build... " >&6; }
+ if test -z "$PYTHON_FOR_BUILD"; then
+- for interp in python$PACKAGE_VERSION python3 python; do
++ for interp in $PYTHON_FOR_REGEN python$PACKAGE_VERSION python3 python; do
+ which $interp >/dev/null 2>&1 || continue
+ if $interp -c "import sys;sys.exit(not '.'.join(str(n) for n in sys.version_info[:2]) == '$PACKAGE_VERSION')"; then
+ break
+@@ -3025,6 +3027,8 @@
+ as_fn_error $? "Cross compiling required --host=HOST-TUPLE and --build=ARCH" "$LINENO" 5
+ else
+ PYTHON_FOR_BUILD='./$(BUILDPYTHON) -E'
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $interp" >&5
++$as_echo "$interp" >&6; }
+ fi
+
+
+@@ -3083,6 +3087,166 @@
+
+ CONFIG_ARGS="$ac_configure_args"
+
++# Set name for machine-dependent library files
+
-+/* Begin PBXBuildFile section */
-+ 607A66172B0EFA380010BFC8 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 607A66162B0EFA380010BFC8 /* AppDelegate.m */; };
-+ 607A66222B0EFA390010BFC8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607A66212B0EFA390010BFC8 /* Assets.xcassets */; };
-+ 607A66252B0EFA390010BFC8 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607A66232B0EFA390010BFC8 /* LaunchScreen.storyboard */; };
-+ 607A66282B0EFA390010BFC8 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 607A66272B0EFA390010BFC8 /* main.m */; };
-+ 607A66322B0EFA3A0010BFC8 /* iOSTestbedTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 607A66312B0EFA3A0010BFC8 /* iOSTestbedTests.m */; };
-+ 607A664C2B0EFC080010BFC8 /* Python.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 607A664A2B0EFB310010BFC8 /* Python.xcframework */; };
-+ 607A664D2B0EFC080010BFC8 /* Python.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 607A664A2B0EFB310010BFC8 /* Python.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
-+ 607A66502B0EFFE00010BFC8 /* Python.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 607A664A2B0EFB310010BFC8 /* Python.xcframework */; };
-+ 607A66512B0EFFE00010BFC8 /* Python.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 607A664A2B0EFB310010BFC8 /* Python.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
-+ 607A66582B0F079F0010BFC8 /* dylib-Info-template.plist in Resources */ = {isa = PBXBuildFile; fileRef = 607A66572B0F079F0010BFC8 /* dylib-Info-template.plist */; };
-+ 608619542CB77BA900F46182 /* app_packages in Resources */ = {isa = PBXBuildFile; fileRef = 608619532CB77BA900F46182 /* app_packages */; };
-+ 608619562CB7819B00F46182 /* app in Resources */ = {isa = PBXBuildFile; fileRef = 608619552CB7819B00F46182 /* app */; };
-+/* End PBXBuildFile section */
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking MACHDEP" >&5
++$as_echo_n "checking MACHDEP... " >&6; }
++if test -z "$MACHDEP"
++then
++ # avoid using uname for cross builds
++ if test "$cross_compiling" = yes; then
++ # ac_sys_system and ac_sys_release are used for setting
++ # a lot of different things including 'define_xopen_source'
++ # in the case statement below.
++ case "$host" in
++ *-*-linux-android*)
++ ac_sys_system=Linux-android
++ ;;
++ *-*-linux*)
++ ac_sys_system=Linux
++ ;;
++ *-*-cygwin*)
++ ac_sys_system=Cygwin
++ ;;
++ *-apple-ios*)
++ ac_sys_system=iOS
++ ;;
++ *-apple-tvos*)
++ ac_sys_system=tvOS
++ ;;
++ *-apple-watchos*)
++ ac_sys_system=watchOS
++ ;;
++ *-*-vxworks*)
++ ac_sys_system=VxWorks
++ ;;
++ *-*-emscripten)
++ ac_sys_system=Emscripten
++ ;;
++ *-*-wasi)
++ ac_sys_system=WASI
++ ;;
++ *)
++ # for now, limit cross builds to known configurations
++ MACHDEP="unknown"
++ as_fn_error $? "cross build not supported for $host" "$LINENO" 5
++ esac
++ ac_sys_release=
++ else
++ ac_sys_system=`uname -s`
++ if test "$ac_sys_system" = "AIX" \
++ -o "$ac_sys_system" = "UnixWare" -o "$ac_sys_system" = "OpenUNIX"; then
++ ac_sys_release=`uname -v`
++ else
++ ac_sys_release=`uname -r`
++ fi
++ fi
++ ac_md_system=`echo $ac_sys_system |
++ tr -d '/ ' | tr '[A-Z]' '[a-z]'`
++ ac_md_release=`echo $ac_sys_release |
++ tr -d '/ ' | sed 's/^[A-Z]\.//' | sed 's/\..*//'`
++ MACHDEP="$ac_md_system$ac_md_release"
+
-+/* Begin PBXContainerItemProxy section */
-+ 607A662E2B0EFA3A0010BFC8 /* PBXContainerItemProxy */ = {
-+ isa = PBXContainerItemProxy;
-+ containerPortal = 607A660A2B0EFA380010BFC8 /* Project object */;
-+ proxyType = 1;
-+ remoteGlobalIDString = 607A66112B0EFA380010BFC8;
-+ remoteInfo = iOSTestbed;
-+ };
-+/* End PBXContainerItemProxy section */
++ case $MACHDEP in
++ aix*) MACHDEP="aix";;
++ linux*) MACHDEP="linux";;
++ cygwin*) MACHDEP="cygwin";;
++ darwin*) MACHDEP="darwin";;
++ '') MACHDEP="unknown";;
++ esac
+
-+/* Begin PBXCopyFilesBuildPhase section */
-+ 607A664E2B0EFC080010BFC8 /* Embed Frameworks */ = {
-+ isa = PBXCopyFilesBuildPhase;
-+ buildActionMask = 2147483647;
-+ dstPath = "";
-+ dstSubfolderSpec = 10;
-+ files = (
-+ 607A664D2B0EFC080010BFC8 /* Python.xcframework in Embed Frameworks */,
-+ );
-+ name = "Embed Frameworks";
-+ runOnlyForDeploymentPostprocessing = 0;
-+ };
-+ 607A66522B0EFFE00010BFC8 /* Embed Frameworks */ = {
-+ isa = PBXCopyFilesBuildPhase;
-+ buildActionMask = 2147483647;
-+ dstPath = "";
-+ dstSubfolderSpec = 10;
-+ files = (
-+ 607A66512B0EFFE00010BFC8 /* Python.xcframework in Embed Frameworks */,
-+ );
-+ name = "Embed Frameworks";
-+ runOnlyForDeploymentPostprocessing = 0;
-+ };
-+/* End PBXCopyFilesBuildPhase section */
++ if test "$ac_sys_system" = "SunOS"; then
++ # For Solaris, there isn't an OS version specific macro defined
++ # in most compilers, so we define one here.
++ SUNOS_VERSION=`echo $ac_sys_release | sed -e 's!\.\(0-9\)$!.0\1!g' | tr -d '.'`
+
-+/* Begin PBXFileReference section */
-+ 607A66122B0EFA380010BFC8 /* iOSTestbed.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iOSTestbed.app; sourceTree = BUILT_PRODUCTS_DIR; };
-+ 607A66152B0EFA380010BFC8 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
-+ 607A66162B0EFA380010BFC8 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
-+ 607A66212B0EFA390010BFC8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
-+ 607A66242B0EFA390010BFC8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
-+ 607A66272B0EFA390010BFC8 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
-+ 607A662D2B0EFA3A0010BFC8 /* iOSTestbedTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iOSTestbedTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
-+ 607A66312B0EFA3A0010BFC8 /* iOSTestbedTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iOSTestbedTests.m; sourceTree = ""; };
-+ 607A664A2B0EFB310010BFC8 /* Python.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = Python.xcframework; sourceTree = ""; };
-+ 607A66572B0F079F0010BFC8 /* dylib-Info-template.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "dylib-Info-template.plist"; sourceTree = ""; };
-+ 607A66592B0F08600010BFC8 /* iOSTestbed-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "iOSTestbed-Info.plist"; sourceTree = ""; };
-+ 608619532CB77BA900F46182 /* app_packages */ = {isa = PBXFileReference; lastKnownFileType = folder; path = app_packages; sourceTree = ""; };
-+ 608619552CB7819B00F46182 /* app */ = {isa = PBXFileReference; lastKnownFileType = folder; path = app; sourceTree = ""; };
-+/* End PBXFileReference section */
++cat >>confdefs.h <<_ACEOF
++#define Py_SUNOS_VERSION $SUNOS_VERSION
++_ACEOF
+
-+/* Begin PBXFrameworksBuildPhase section */
-+ 607A660F2B0EFA380010BFC8 /* Frameworks */ = {
-+ isa = PBXFrameworksBuildPhase;
-+ buildActionMask = 2147483647;
-+ files = (
-+ 607A664C2B0EFC080010BFC8 /* Python.xcframework in Frameworks */,
-+ );
-+ runOnlyForDeploymentPostprocessing = 0;
-+ };
-+ 607A662A2B0EFA3A0010BFC8 /* Frameworks */ = {
-+ isa = PBXFrameworksBuildPhase;
-+ buildActionMask = 2147483647;
-+ files = (
-+ 607A66502B0EFFE00010BFC8 /* Python.xcframework in Frameworks */,
-+ );
-+ runOnlyForDeploymentPostprocessing = 0;
-+ };
-+/* End PBXFrameworksBuildPhase section */
++ fi
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$MACHDEP\"" >&5
++$as_echo "\"$MACHDEP\"" >&6; }
+
-+/* Begin PBXGroup section */
-+ 607A66092B0EFA380010BFC8 = {
-+ isa = PBXGroup;
-+ children = (
-+ 607A664A2B0EFB310010BFC8 /* Python.xcframework */,
-+ 607A66142B0EFA380010BFC8 /* iOSTestbed */,
-+ 607A66302B0EFA3A0010BFC8 /* iOSTestbedTests */,
-+ 607A66132B0EFA380010BFC8 /* Products */,
-+ 607A664F2B0EFFE00010BFC8 /* Frameworks */,
-+ );
-+ sourceTree = "";
-+ };
-+ 607A66132B0EFA380010BFC8 /* Products */ = {
-+ isa = PBXGroup;
-+ children = (
-+ 607A66122B0EFA380010BFC8 /* iOSTestbed.app */,
-+ 607A662D2B0EFA3A0010BFC8 /* iOSTestbedTests.xctest */,
-+ );
-+ name = Products;
-+ sourceTree = "";
-+ };
-+ 607A66142B0EFA380010BFC8 /* iOSTestbed */ = {
-+ isa = PBXGroup;
-+ children = (
-+ 608619552CB7819B00F46182 /* app */,
-+ 608619532CB77BA900F46182 /* app_packages */,
-+ 607A66592B0F08600010BFC8 /* iOSTestbed-Info.plist */,
-+ 607A66572B0F079F0010BFC8 /* dylib-Info-template.plist */,
-+ 607A66152B0EFA380010BFC8 /* AppDelegate.h */,
-+ 607A66162B0EFA380010BFC8 /* AppDelegate.m */,
-+ 607A66212B0EFA390010BFC8 /* Assets.xcassets */,
-+ 607A66232B0EFA390010BFC8 /* LaunchScreen.storyboard */,
-+ 607A66272B0EFA390010BFC8 /* main.m */,
-+ );
-+ path = iOSTestbed;
-+ sourceTree = "";
-+ };
-+ 607A66302B0EFA3A0010BFC8 /* iOSTestbedTests */ = {
-+ isa = PBXGroup;
-+ children = (
-+ 607A66312B0EFA3A0010BFC8 /* iOSTestbedTests.m */,
-+ );
-+ path = iOSTestbedTests;
-+ sourceTree = "";
-+ };
-+ 607A664F2B0EFFE00010BFC8 /* Frameworks */ = {
-+ isa = PBXGroup;
-+ children = (
-+ );
-+ name = Frameworks;
-+ sourceTree = "";
-+ };
-+/* End PBXGroup section */
++# On cross-compile builds, configure will look for a host-specific compiler by
++# prepending the user-provided host triple to the required binary name.
++#
++# On iOS/tvOS/watchOS, this results in binaries like "arm64-apple-ios13.0-simulator-gcc",
++# which isn't a binary that exists, and isn't very convenient, as it contains the
++# iOS version. As the default cross-compiler name won't exist, configure falls
++# back to gcc, which *definitely* won't work. We're providing wrapper scripts for
++# these tools; the binary names of these scripts are better defaults than "gcc".
++# This only requires that the user put the platform scripts folder (e.g.,
++# "iOS/Resources/bin") in their path, rather than defining platform-specific
++# names/paths for AR, CC, CPP, and CXX explicitly; and if the user forgets to
++# either put the platform scripts folder in the path, or specify CC etc,
++# configure will fail.
++if test -z "$AR"; then
++ case "$host" in
++ aarch64-apple-ios*-simulator) AR=arm64-apple-ios-simulator-ar ;;
++ aarch64-apple-ios*) AR=arm64-apple-ios-ar ;;
++ x86_64-apple-ios*-simulator) AR=x86_64-apple-ios-simulator-ar ;;
+
-+/* Begin PBXNativeTarget section */
-+ 607A66112B0EFA380010BFC8 /* iOSTestbed */ = {
-+ isa = PBXNativeTarget;
-+ buildConfigurationList = 607A66412B0EFA3A0010BFC8 /* Build configuration list for PBXNativeTarget "iOSTestbed" */;
-+ buildPhases = (
-+ 607A660E2B0EFA380010BFC8 /* Sources */,
-+ 607A660F2B0EFA380010BFC8 /* Frameworks */,
-+ 607A66102B0EFA380010BFC8 /* Resources */,
-+ 607A66552B0F061D0010BFC8 /* Install Target Specific Python Standard Library */,
-+ 607A66562B0F06200010BFC8 /* Prepare Python Binary Modules */,
-+ 607A664E2B0EFC080010BFC8 /* Embed Frameworks */,
-+ );
-+ buildRules = (
-+ );
-+ dependencies = (
-+ );
-+ name = iOSTestbed;
-+ productName = iOSTestbed;
-+ productReference = 607A66122B0EFA380010BFC8 /* iOSTestbed.app */;
-+ productType = "com.apple.product-type.application";
-+ };
-+ 607A662C2B0EFA3A0010BFC8 /* iOSTestbedTests */ = {
-+ isa = PBXNativeTarget;
-+ buildConfigurationList = 607A66442B0EFA3A0010BFC8 /* Build configuration list for PBXNativeTarget "iOSTestbedTests" */;
-+ buildPhases = (
-+ 607A66292B0EFA3A0010BFC8 /* Sources */,
-+ 607A662A2B0EFA3A0010BFC8 /* Frameworks */,
-+ 607A662B2B0EFA3A0010BFC8 /* Resources */,
-+ 607A66522B0EFFE00010BFC8 /* Embed Frameworks */,
-+ );
-+ buildRules = (
-+ );
-+ dependencies = (
-+ 607A662F2B0EFA3A0010BFC8 /* PBXTargetDependency */,
-+ );
-+ name = iOSTestbedTests;
-+ productName = iOSTestbedTests;
-+ productReference = 607A662D2B0EFA3A0010BFC8 /* iOSTestbedTests.xctest */;
-+ productType = "com.apple.product-type.bundle.unit-test";
-+ };
-+/* End PBXNativeTarget section */
++ aarch64-apple-tvos*-simulator) AR=arm64-apple-tvos-simulator-ar ;;
++ aarch64-apple-tvos*) AR=arm64-apple-tvos-ar ;;
++ x86_64-apple-tvos*-simulator) AR=x86_64-apple-tvos-simulator-ar ;;
+
-+/* Begin PBXProject section */
-+ 607A660A2B0EFA380010BFC8 /* Project object */ = {
-+ isa = PBXProject;
-+ attributes = {
-+ BuildIndependentTargetsInParallel = 1;
-+ LastUpgradeCheck = 1500;
-+ TargetAttributes = {
-+ 607A66112B0EFA380010BFC8 = {
-+ CreatedOnToolsVersion = 15.0.1;
-+ };
-+ 607A662C2B0EFA3A0010BFC8 = {
-+ CreatedOnToolsVersion = 15.0.1;
-+ TestTargetID = 607A66112B0EFA380010BFC8;
-+ };
-+ };
-+ };
-+ buildConfigurationList = 607A660D2B0EFA380010BFC8 /* Build configuration list for PBXProject "iOSTestbed" */;
-+ compatibilityVersion = "Xcode 14.0";
-+ developmentRegion = en;
-+ hasScannedForEncodings = 0;
-+ knownRegions = (
-+ en,
-+ Base,
-+ );
-+ mainGroup = 607A66092B0EFA380010BFC8;
-+ productRefGroup = 607A66132B0EFA380010BFC8 /* Products */;
-+ projectDirPath = "";
-+ projectRoot = "";
-+ targets = (
-+ 607A66112B0EFA380010BFC8 /* iOSTestbed */,
-+ 607A662C2B0EFA3A0010BFC8 /* iOSTestbedTests */,
-+ );
-+ };
-+/* End PBXProject section */
++ aarch64-apple-watchos*-simulator) AR=arm64-apple-watchos-simulator-ar ;;
++ aarch64-apple-watchos*) AR=arm64_32-apple-watchos-ar ;;
++ x86_64-apple-watchos*-simulator) AR=x86_64-apple-watchos-simulator-ar ;;
++ *)
++ esac
++fi
++if test -z "$CC"; then
++ case "$host" in
++ aarch64-apple-ios*-simulator) CC=arm64-apple-ios-simulator-clang ;;
++ aarch64-apple-ios*) CC=arm64-apple-ios-clang ;;
++ x86_64-apple-ios*-simulator) CC=x86_64-apple-ios-simulator-clang ;;
+
-+/* Begin PBXResourcesBuildPhase section */
-+ 607A66102B0EFA380010BFC8 /* Resources */ = {
-+ isa = PBXResourcesBuildPhase;
-+ buildActionMask = 2147483647;
-+ files = (
-+ 607A66252B0EFA390010BFC8 /* LaunchScreen.storyboard in Resources */,
-+ 607A66582B0F079F0010BFC8 /* dylib-Info-template.plist in Resources */,
-+ 608619562CB7819B00F46182 /* app in Resources */,
-+ 607A66222B0EFA390010BFC8 /* Assets.xcassets in Resources */,
-+ 608619542CB77BA900F46182 /* app_packages in Resources */,
-+ );
-+ runOnlyForDeploymentPostprocessing = 0;
-+ };
-+ 607A662B2B0EFA3A0010BFC8 /* Resources */ = {
-+ isa = PBXResourcesBuildPhase;
-+ buildActionMask = 2147483647;
-+ files = (
-+ );
-+ runOnlyForDeploymentPostprocessing = 0;
-+ };
-+/* End PBXResourcesBuildPhase section */
++ aarch64-apple-tvos*-simulator) CC=arm64-apple-tvos-simulator-clang ;;
++ aarch64-apple-tvos*) CC=arm64-apple-tvos-clang ;;
++ x86_64-apple-tvos*-simulator) CC=x86_64-apple-tvos-simulator-clang ;;
+
-+/* Begin PBXShellScriptBuildPhase section */
-+ 607A66552B0F061D0010BFC8 /* Install Target Specific Python Standard Library */ = {
-+ isa = PBXShellScriptBuildPhase;
-+ alwaysOutOfDate = 1;
-+ buildActionMask = 2147483647;
-+ files = (
-+ );
-+ inputFileListPaths = (
-+ );
-+ inputPaths = (
-+ );
-+ name = "Install Target Specific Python Standard Library";
-+ outputFileListPaths = (
-+ );
-+ outputPaths = (
-+ );
-+ runOnlyForDeploymentPostprocessing = 0;
-+ shellPath = /bin/sh;
-+ shellScript = "set -e\n\nmkdir -p \"$CODESIGNING_FOLDER_PATH/python/lib\"\nif [ \"$EFFECTIVE_PLATFORM_NAME\" = \"-iphonesimulator\" ]; then\n echo \"Installing Python modules for iOS Simulator\"\n rsync -au --delete \"$PROJECT_DIR/Python.xcframework/ios-arm64_x86_64-simulator/lib/\" \"$CODESIGNING_FOLDER_PATH/python/lib/\" \nelse\n echo \"Installing Python modules for iOS Device\"\n rsync -au --delete \"$PROJECT_DIR/Python.xcframework/ios-arm64/lib/\" \"$CODESIGNING_FOLDER_PATH/python/lib/\" \nfi\n";
-+ showEnvVarsInLog = 0;
-+ };
-+ 607A66562B0F06200010BFC8 /* Prepare Python Binary Modules */ = {
-+ isa = PBXShellScriptBuildPhase;
-+ alwaysOutOfDate = 1;
-+ buildActionMask = 2147483647;
-+ files = (
-+ );
-+ inputFileListPaths = (
-+ );
-+ inputPaths = (
-+ );
-+ name = "Prepare Python Binary Modules";
-+ outputFileListPaths = (
-+ );
-+ outputPaths = (
-+ );
-+ runOnlyForDeploymentPostprocessing = 0;
-+ shellPath = /bin/sh;
-+ shellScript = "set -e\n\ninstall_dylib () {\n INSTALL_BASE=$1\n FULL_EXT=$2\n\n # The name of the extension file\n EXT=$(basename \"$FULL_EXT\")\n # The location of the extension file, relative to the bundle\n RELATIVE_EXT=${FULL_EXT#$CODESIGNING_FOLDER_PATH/} \n # The path to the extension file, relative to the install base\n PYTHON_EXT=${RELATIVE_EXT/$INSTALL_BASE/}\n # The full dotted name of the extension module, constructed from the file path.\n FULL_MODULE_NAME=$(echo $PYTHON_EXT | cut -d \".\" -f 1 | tr \"/\" \".\"); \n # A bundle identifier; not actually used, but required by Xcode framework packaging\n FRAMEWORK_BUNDLE_ID=$(echo $PRODUCT_BUNDLE_IDENTIFIER.$FULL_MODULE_NAME | tr \"_\" \"-\")\n # The name of the framework folder.\n FRAMEWORK_FOLDER=\"Frameworks/$FULL_MODULE_NAME.framework\"\n\n # If the framework folder doesn't exist, create it.\n if [ ! -d \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER\" ]; then\n echo \"Creating framework for $RELATIVE_EXT\" \n mkdir -p \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER\"\n cp \"$CODESIGNING_FOLDER_PATH/dylib-Info-template.plist\" \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/Info.plist\"\n plutil -replace CFBundleExecutable -string \"$FULL_MODULE_NAME\" \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/Info.plist\"\n plutil -replace CFBundleIdentifier -string \"$FRAMEWORK_BUNDLE_ID\" \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/Info.plist\"\n fi\n \n echo \"Installing binary for $FRAMEWORK_FOLDER/$FULL_MODULE_NAME\" \n mv \"$FULL_EXT\" \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/$FULL_MODULE_NAME\"\n # Create a placeholder .fwork file where the .so was\n echo \"$FRAMEWORK_FOLDER/$FULL_MODULE_NAME\" > ${FULL_EXT%.so}.fwork\n # Create a back reference to the .so file location in the framework\n echo \"${RELATIVE_EXT%.so}.fwork\" > \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/$FULL_MODULE_NAME.origin\" \n}\n\nPYTHON_VER=$(ls -1 \"$CODESIGNING_FOLDER_PATH/python/lib\")\necho \"Install Python $PYTHON_VER standard library extension modules...\"\nfind \"$CODESIGNING_FOLDER_PATH/python/lib/$PYTHON_VER/lib-dynload\" -name \"*.so\" | while read FULL_EXT; do\n install_dylib python/lib/$PYTHON_VER/lib-dynload/ \"$FULL_EXT\"\ndone\necho \"Install app package extension modules...\"\nfind \"$CODESIGNING_FOLDER_PATH/app_packages\" -name \"*.so\" | while read FULL_EXT; do\n install_dylib app_packages/ \"$FULL_EXT\"\ndone\necho \"Install app extension modules...\"\nfind \"$CODESIGNING_FOLDER_PATH/app\" -name \"*.so\" | while read FULL_EXT; do\n install_dylib app/ \"$FULL_EXT\"\ndone\n\n# Clean up dylib template \nrm -f \"$CODESIGNING_FOLDER_PATH/dylib-Info-template.plist\"\necho \"Signing frameworks as $EXPANDED_CODE_SIGN_IDENTITY_NAME ($EXPANDED_CODE_SIGN_IDENTITY)...\"\nfind \"$CODESIGNING_FOLDER_PATH/Frameworks\" -name \"*.framework\" -exec /usr/bin/codesign --force --sign \"$EXPANDED_CODE_SIGN_IDENTITY\" ${OTHER_CODE_SIGN_FLAGS:-} -o runtime --timestamp=none --preserve-metadata=identifier,entitlements,flags --generate-entitlement-der \"{}\" \\; \n";
-+ showEnvVarsInLog = 0;
-+ };
-+/* End PBXShellScriptBuildPhase section */
++ aarch64-apple-watchos*-simulator) CC=arm64-apple-watchos-simulator-clang ;;
++ aarch64-apple-watchos*) CC=arm64_32-apple-watchos-clang ;;
++ x86_64-apple-watchos*-simulator) CC=x86_64-apple-watchos-simulator-clang ;;
++ *)
++ esac
++fi
++if test -z "$CPP"; then
++ case "$host" in
++ aarch64-apple-ios*-simulator) CPP=arm64-apple-ios-simulator-cpp ;;
++ aarch64-apple-ios*) CPP=arm64-apple-ios-cpp ;;
++ x86_64-apple-ios*-simulator) CPP=x86_64-apple-ios-simulator-cpp ;;
+
-+/* Begin PBXSourcesBuildPhase section */
-+ 607A660E2B0EFA380010BFC8 /* Sources */ = {
-+ isa = PBXSourcesBuildPhase;
-+ buildActionMask = 2147483647;
-+ files = (
-+ 607A66172B0EFA380010BFC8 /* AppDelegate.m in Sources */,
-+ 607A66282B0EFA390010BFC8 /* main.m in Sources */,
-+ );
-+ runOnlyForDeploymentPostprocessing = 0;
-+ };
-+ 607A66292B0EFA3A0010BFC8 /* Sources */ = {
-+ isa = PBXSourcesBuildPhase;
-+ buildActionMask = 2147483647;
-+ files = (
-+ 607A66322B0EFA3A0010BFC8 /* iOSTestbedTests.m in Sources */,
-+ );
-+ runOnlyForDeploymentPostprocessing = 0;
-+ };
-+/* End PBXSourcesBuildPhase section */
++ aarch64-apple-tvos*-simulator) CPP=arm64-apple-tvos-simulator-cpp ;;
++ aarch64-apple-tvos*) CPP=arm64-apple-tvos-cpp ;;
++ x86_64-apple-tvos*-simulator) CPP=x86_64-apple-tvos-simulator-cpp ;;
+
-+/* Begin PBXTargetDependency section */
-+ 607A662F2B0EFA3A0010BFC8 /* PBXTargetDependency */ = {
-+ isa = PBXTargetDependency;
-+ target = 607A66112B0EFA380010BFC8 /* iOSTestbed */;
-+ targetProxy = 607A662E2B0EFA3A0010BFC8 /* PBXContainerItemProxy */;
-+ };
-+/* End PBXTargetDependency section */
++ aarch64-apple-watchos*-simulator) CPP=arm64-apple-watchos-simulator-cpp ;;
++ aarch64-apple-watchos*) CPP=arm64_32-apple-watchos-cpp ;;
++ x86_64-apple-watchos*-simulator) CPP=x86_64-apple-watchos-simulator-cpp ;;
++ *)
++ esac
++fi
++if test -z "$CXX"; then
++ case "$host" in
++ aarch64-apple-ios*-simulator) CXX=arm64-apple-ios-simulator-clang++ ;;
++ aarch64-apple-ios*) CXX=arm64-apple-ios-clang++ ;;
++ x86_64-apple-ios*-simulator) CXX=x86_64-apple-ios-simulator-clang++ ;;
+
-+/* Begin PBXVariantGroup section */
-+ 607A66232B0EFA390010BFC8 /* LaunchScreen.storyboard */ = {
-+ isa = PBXVariantGroup;
-+ children = (
-+ 607A66242B0EFA390010BFC8 /* Base */,
-+ );
-+ name = LaunchScreen.storyboard;
-+ sourceTree = "";
-+ };
-+/* End PBXVariantGroup section */
++ aarch64-apple-tvos*-simulator) CXX=arm64-apple-tvos-simulator-clang++ ;;
++ aarch64-apple-tvos*) CXX=arm64-apple-tvos-clang++ ;;
++ x86_64-apple-tvos*-simulator) CXX=x86_64-apple-tvos-simulator-clang++ ;;
++
++ aarch64-apple-watchos*-simulator) CXX=arm64-apple-watchos-simulator-clang++ ;;
++ aarch64-apple-watchos*) CXX=arm64_32-apple-watchos-clang++ ;;
++ x86_64-apple-watchos*-simulator) CXX=x86_64-apple-watchos-simulator-clang++ ;;
++ *)
++ esac
++fi
++
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --enable-universalsdk" >&5
+ $as_echo_n "checking for --enable-universalsdk... " >&6; }
+ # Check whether --enable-universalsdk was given.
+@@ -3194,111 +3358,201 @@
+ enableval=$enable_framework;
+ case $enableval in
+ yes)
+- enableval=/Library/Frameworks
++ case $ac_sys_system in
++ Darwin) enableval=/Library/Frameworks ;;
++ iOS) enableval=Apple/iOS/Frameworks/\$\(MULTIARCH\) ;;
++ tvOS) enableval=Apple/tvOS/Frameworks/\$\(MULTIARCH\) ;;
++ watchOS) enableval=Apple/watchOS/Frameworks/\$\(MULTIARCH\) ;;
++ *) as_fn_error $? "Unknown platform for framework build" "$LINENO" 5
++ esac
+ esac
++
+ case $enableval in
+ no)
+- PYTHONFRAMEWORK=
+- PYTHONFRAMEWORKDIR=no-framework
+- PYTHONFRAMEWORKPREFIX=
+- PYTHONFRAMEWORKINSTALLDIR=
+- FRAMEWORKINSTALLFIRST=
+- FRAMEWORKINSTALLLAST=
+- FRAMEWORKALTINSTALLFIRST=
+- FRAMEWORKALTINSTALLLAST=
+- FRAMEWORKPYTHONW=
+- if test "x${prefix}" = "xNONE"; then
+- FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
+- else
+- FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
+- fi
+- enable_framework=
++ case $ac_sys_system in
++ iOS) as_fn_error $? "iOS builds must use --enable-framework" "$LINENO" 5 ;;
++ tvOS) as_fn_error $? "tvOS builds must use --enable-framework" "$LINENO" 5 ;;
++ watchOS) as_fn_error $? "watchOS builds must use --enable-framework" "$LINENO" 5 ;;
++ *)
++ PYTHONFRAMEWORK=
++ PYTHONFRAMEWORKDIR=no-framework
++ PYTHONFRAMEWORKPREFIX=
++ PYTHONFRAMEWORKINSTALLDIR=
++ PYTHONFRAMEWORKINSTALLNAMEPREFIX=
++ RESSRCDIR=
++ FRAMEWORKINSTALLFIRST=
++ FRAMEWORKINSTALLLAST=
++ FRAMEWORKALTINSTALLFIRST=
++ FRAMEWORKALTINSTALLLAST=
++ FRAMEWORKPYTHONW=
++ INSTALLTARGETS="commoninstall bininstall maninstall"
+
-+/* Begin XCBuildConfiguration section */
-+ 607A663F2B0EFA3A0010BFC8 /* Debug */ = {
-+ isa = XCBuildConfiguration;
-+ buildSettings = {
-+ ALWAYS_SEARCH_USER_PATHS = NO;
-+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
-+ CLANG_ANALYZER_NONNULL = YES;
-+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
-+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
-+ CLANG_ENABLE_MODULES = YES;
-+ CLANG_ENABLE_OBJC_ARC = YES;
-+ CLANG_ENABLE_OBJC_WEAK = YES;
-+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
-+ CLANG_WARN_BOOL_CONVERSION = YES;
-+ CLANG_WARN_COMMA = YES;
-+ CLANG_WARN_CONSTANT_CONVERSION = YES;
-+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
-+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
-+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
-+ CLANG_WARN_EMPTY_BODY = YES;
-+ CLANG_WARN_ENUM_CONVERSION = YES;
-+ CLANG_WARN_INFINITE_RECURSION = YES;
-+ CLANG_WARN_INT_CONVERSION = YES;
-+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
-+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
-+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
-+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
-+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
-+ CLANG_WARN_STRICT_PROTOTYPES = YES;
-+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
-+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
-+ CLANG_WARN_UNREACHABLE_CODE = YES;
-+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-+ COPY_PHASE_STRIP = NO;
-+ DEBUG_INFORMATION_FORMAT = dwarf;
-+ ENABLE_STRICT_OBJC_MSGSEND = YES;
-+ ENABLE_TESTABILITY = YES;
-+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
-+ GCC_C_LANGUAGE_STANDARD = gnu17;
-+ GCC_DYNAMIC_NO_PIC = NO;
-+ GCC_NO_COMMON_BLOCKS = YES;
-+ GCC_OPTIMIZATION_LEVEL = 0;
-+ GCC_PREPROCESSOR_DEFINITIONS = (
-+ "DEBUG=1",
-+ "$(inherited)",
-+ );
-+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
-+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
-+ GCC_WARN_UNDECLARED_SELECTOR = YES;
-+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
-+ GCC_WARN_UNUSED_FUNCTION = YES;
-+ GCC_WARN_UNUSED_VARIABLE = YES;
-+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
-+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
-+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
-+ MTL_FAST_MATH = YES;
-+ ONLY_ACTIVE_ARCH = YES;
-+ SDKROOT = iphoneos;
-+ };
-+ name = Debug;
-+ };
-+ 607A66402B0EFA3A0010BFC8 /* Release */ = {
-+ isa = XCBuildConfiguration;
-+ buildSettings = {
-+ ALWAYS_SEARCH_USER_PATHS = NO;
-+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
-+ CLANG_ANALYZER_NONNULL = YES;
-+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
-+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
-+ CLANG_ENABLE_MODULES = YES;
-+ CLANG_ENABLE_OBJC_ARC = YES;
-+ CLANG_ENABLE_OBJC_WEAK = YES;
-+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
-+ CLANG_WARN_BOOL_CONVERSION = YES;
-+ CLANG_WARN_COMMA = YES;
-+ CLANG_WARN_CONSTANT_CONVERSION = YES;
-+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
-+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
-+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
-+ CLANG_WARN_EMPTY_BODY = YES;
-+ CLANG_WARN_ENUM_CONVERSION = YES;
-+ CLANG_WARN_INFINITE_RECURSION = YES;
-+ CLANG_WARN_INT_CONVERSION = YES;
-+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
-+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
-+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
-+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
-+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
-+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
-+ CLANG_WARN_STRICT_PROTOTYPES = YES;
-+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
-+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
-+ CLANG_WARN_UNREACHABLE_CODE = YES;
-+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-+ COPY_PHASE_STRIP = NO;
-+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-+ ENABLE_NS_ASSERTIONS = NO;
-+ ENABLE_STRICT_OBJC_MSGSEND = YES;
-+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
-+ GCC_C_LANGUAGE_STANDARD = gnu17;
-+ GCC_NO_COMMON_BLOCKS = YES;
-+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
-+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
-+ GCC_WARN_UNDECLARED_SELECTOR = YES;
-+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
-+ GCC_WARN_UNUSED_FUNCTION = YES;
-+ GCC_WARN_UNUSED_VARIABLE = YES;
-+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
-+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
-+ MTL_ENABLE_DEBUG_INFO = NO;
-+ MTL_FAST_MATH = YES;
-+ SDKROOT = iphoneos;
-+ VALIDATE_PRODUCT = YES;
-+ };
-+ name = Release;
-+ };
-+ 607A66422B0EFA3A0010BFC8 /* Debug */ = {
-+ isa = XCBuildConfiguration;
-+ buildSettings = {
-+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
-+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
-+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;
-+ CODE_SIGN_STYLE = Automatic;
-+ CURRENT_PROJECT_VERSION = 1;
-+ DEVELOPMENT_TEAM = "";
-+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
-+ HEADER_SEARCH_PATHS = "\"$(BUILT_PRODUCTS_DIR)/Python.framework/Headers\"";
-+ INFOPLIST_FILE = "iOSTestbed/iOSTestbed-Info.plist";
-+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
-+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
-+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
-+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
-+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
-+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
-+ LD_RUNPATH_SEARCH_PATHS = (
-+ "$(inherited)",
-+ "@executable_path/Frameworks",
-+ );
-+ MARKETING_VERSION = 3.13.0a1;
-+ PRODUCT_BUNDLE_IDENTIFIER = org.python.iOSTestbed;
-+ PRODUCT_NAME = "$(TARGET_NAME)";
-+ SWIFT_EMIT_LOC_STRINGS = YES;
-+ TARGETED_DEVICE_FAMILY = "1,2";
-+ };
-+ name = Debug;
-+ };
-+ 607A66432B0EFA3A0010BFC8 /* Release */ = {
-+ isa = XCBuildConfiguration;
-+ buildSettings = {
-+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
-+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
-+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;
-+ CODE_SIGN_STYLE = Automatic;
-+ CURRENT_PROJECT_VERSION = 1;
-+ DEVELOPMENT_TEAM = "";
-+ ENABLE_TESTABILITY = YES;
-+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
-+ HEADER_SEARCH_PATHS = "\"$(BUILT_PRODUCTS_DIR)/Python.framework/Headers\"";
-+ INFOPLIST_FILE = "iOSTestbed/iOSTestbed-Info.plist";
-+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
-+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
-+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
-+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
-+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
-+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
-+ LD_RUNPATH_SEARCH_PATHS = (
-+ "$(inherited)",
-+ "@executable_path/Frameworks",
-+ );
-+ MARKETING_VERSION = 3.13.0a1;
-+ PRODUCT_BUNDLE_IDENTIFIER = org.python.iOSTestbed;
-+ PRODUCT_NAME = "$(TARGET_NAME)";
-+ SWIFT_EMIT_LOC_STRINGS = YES;
-+ TARGETED_DEVICE_FAMILY = "1,2";
-+ };
-+ name = Release;
-+ };
-+ 607A66452B0EFA3A0010BFC8 /* Debug */ = {
-+ isa = XCBuildConfiguration;
-+ buildSettings = {
-+ BUNDLE_LOADER = "$(TEST_HOST)";
-+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;
-+ CODE_SIGN_STYLE = Automatic;
-+ CURRENT_PROJECT_VERSION = 1;
-+ DEVELOPMENT_TEAM = 3HEZE76D99;
-+ GENERATE_INFOPLIST_FILE = YES;
-+ HEADER_SEARCH_PATHS = "\"$(BUILT_PRODUCTS_DIR)/Python.framework/Headers\"";
-+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
-+ MARKETING_VERSION = 1.0;
-+ PRODUCT_BUNDLE_IDENTIFIER = org.python.iOSTestbedTests;
-+ PRODUCT_NAME = "$(TARGET_NAME)";
-+ SWIFT_EMIT_LOC_STRINGS = NO;
-+ TARGETED_DEVICE_FAMILY = "1,2";
-+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/iOSTestbed.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/iOSTestbed";
-+ };
-+ name = Debug;
-+ };
-+ 607A66462B0EFA3A0010BFC8 /* Release */ = {
-+ isa = XCBuildConfiguration;
-+ buildSettings = {
-+ BUNDLE_LOADER = "$(TEST_HOST)";
-+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;
-+ CODE_SIGN_STYLE = Automatic;
-+ CURRENT_PROJECT_VERSION = 1;
-+ DEVELOPMENT_TEAM = 3HEZE76D99;
-+ GENERATE_INFOPLIST_FILE = YES;
-+ HEADER_SEARCH_PATHS = "\"$(BUILT_PRODUCTS_DIR)/Python.framework/Headers\"";
-+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
-+ MARKETING_VERSION = 1.0;
-+ PRODUCT_BUNDLE_IDENTIFIER = org.python.iOSTestbedTests;
-+ PRODUCT_NAME = "$(TARGET_NAME)";
-+ SWIFT_EMIT_LOC_STRINGS = NO;
-+ TARGETED_DEVICE_FAMILY = "1,2";
-+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/iOSTestbed.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/iOSTestbed";
-+ };
-+ name = Release;
-+ };
-+/* End XCBuildConfiguration section */
++ if test "x${prefix}" = "xNONE"; then
++ FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
++ else
++ FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
++ fi
++ enable_framework=
++ esac
+ ;;
+ *)
+ PYTHONFRAMEWORKPREFIX="${enableval}"
+ PYTHONFRAMEWORKINSTALLDIR=$PYTHONFRAMEWORKPREFIX/$PYTHONFRAMEWORKDIR
+- FRAMEWORKINSTALLFIRST="frameworkinstallstructure"
+- FRAMEWORKALTINSTALLFIRST="frameworkinstallstructure "
+- FRAMEWORKINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools"
+- FRAMEWORKALTINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkaltinstallunixtools"
+- FRAMEWORKPYTHONW="frameworkpythonw"
+- FRAMEWORKINSTALLAPPSPREFIX="/Applications"
+
+- if test "x${prefix}" = "xNONE" ; then
+- FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
++ case $ac_sys_system in #(
++ Darwin) :
++ FRAMEWORKINSTALLFIRST="frameworkinstallversionedstructure"
++ FRAMEWORKALTINSTALLFIRST="frameworkinstallversionedstructure "
++ FRAMEWORKINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools"
++ FRAMEWORKALTINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkaltinstallunixtools"
++ FRAMEWORKPYTHONW="frameworkpythonw"
++ FRAMEWORKINSTALLAPPSPREFIX="/Applications"
++ INSTALLTARGETS="commoninstall bininstall maninstall"
+
-+/* Begin XCConfigurationList section */
-+ 607A660D2B0EFA380010BFC8 /* Build configuration list for PBXProject "iOSTestbed" */ = {
-+ isa = XCConfigurationList;
-+ buildConfigurations = (
-+ 607A663F2B0EFA3A0010BFC8 /* Debug */,
-+ 607A66402B0EFA3A0010BFC8 /* Release */,
-+ );
-+ defaultConfigurationIsVisible = 0;
-+ defaultConfigurationName = Release;
-+ };
-+ 607A66412B0EFA3A0010BFC8 /* Build configuration list for PBXNativeTarget "iOSTestbed" */ = {
-+ isa = XCConfigurationList;
-+ buildConfigurations = (
-+ 607A66422B0EFA3A0010BFC8 /* Debug */,
-+ 607A66432B0EFA3A0010BFC8 /* Release */,
-+ );
-+ defaultConfigurationIsVisible = 0;
-+ defaultConfigurationName = Release;
-+ };
-+ 607A66442B0EFA3A0010BFC8 /* Build configuration list for PBXNativeTarget "iOSTestbedTests" */ = {
-+ isa = XCConfigurationList;
-+ buildConfigurations = (
-+ 607A66452B0EFA3A0010BFC8 /* Debug */,
-+ 607A66462B0EFA3A0010BFC8 /* Release */,
-+ );
-+ defaultConfigurationIsVisible = 0;
-+ defaultConfigurationName = Release;
-+ };
-+/* End XCConfigurationList section */
-+ };
-+ rootObject = 607A660A2B0EFA380010BFC8 /* Project object */;
-+}
---- /dev/null
-+++ b/iOS/testbed/iOSTestbed/AppDelegate.h
-@@ -0,0 +1,11 @@
-+//
-+// AppDelegate.h
-+// iOSTestbed
-+//
++ if test "x${prefix}" = "xNONE" ; then
++ FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
+
-+#import
++ else
++ FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
++ fi
+
+- else
+- FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
+- fi
++ case "${enableval}" in
++ /System*)
++ FRAMEWORKINSTALLAPPSPREFIX="/Applications"
++ if test "${prefix}" = "NONE" ; then
++ # See below
++ FRAMEWORKUNIXTOOLSPREFIX="/usr"
++ fi
++ ;;
+
-+@interface AppDelegate : UIResponder
++ /Library*)
++ FRAMEWORKINSTALLAPPSPREFIX="/Applications"
++ ;;
+
++ */Library/Frameworks)
++ MDIR="`dirname "${enableval}"`"
++ MDIR="`dirname "${MDIR}"`"
++ FRAMEWORKINSTALLAPPSPREFIX="${MDIR}/Applications"
+
-+@end
---- /dev/null
-+++ b/iOS/testbed/iOSTestbed/AppDelegate.m
-@@ -0,0 +1,19 @@
-+//
-+// AppDelegate.m
-+// iOSTestbed
-+//
++ if test "${prefix}" = "NONE"; then
++ # User hasn't specified the
++ # --prefix option, but wants to install
++ # the framework in a non-default location,
++ # ensure that the compatibility links get
++ # installed relative to that prefix as well
++ # instead of in /usr/local.
++ FRAMEWORKUNIXTOOLSPREFIX="${MDIR}"
++ fi
++ ;;
+
+- case "${enableval}" in
+- /System*)
+- FRAMEWORKINSTALLAPPSPREFIX="/Applications"
+- if test "${prefix}" = "NONE" ; then
+- # See below
+- FRAMEWORKUNIXTOOLSPREFIX="/usr"
+- fi
+- ;;
++ *)
++ FRAMEWORKINSTALLAPPSPREFIX="/Applications"
++ ;;
++ esac
+
+- /Library*)
+- FRAMEWORKINSTALLAPPSPREFIX="/Applications"
+- ;;
++ prefix=$PYTHONFRAMEWORKINSTALLDIR/Versions/$VERSION
++ PYTHONFRAMEWORKINSTALLNAMEPREFIX=${prefix}
++ RESSRCDIR=Mac/Resources/framework
+
-+#import "AppDelegate.h"
++ # Add files for Mac specific code to the list of output
++ # files:
++ ac_config_files="$ac_config_files Mac/Makefile"
+
-+@interface AppDelegate ()
++ ac_config_files="$ac_config_files Mac/PythonLauncher/Makefile"
+
-+@end
++ ac_config_files="$ac_config_files Mac/Resources/framework/Info.plist"
+
-+@implementation AppDelegate
++ ac_config_files="$ac_config_files Mac/Resources/app/Info.plist"
+
++ ;;
++ iOS) :
++ FRAMEWORKINSTALLFIRST="frameworkinstallunversionedstructure"
++ FRAMEWORKALTINSTALLFIRST="frameworkinstallunversionedstructure "
++ FRAMEWORKINSTALLLAST="frameworkinstallmobileheaders"
++ FRAMEWORKALTINSTALLLAST="frameworkinstallmobileheaders"
++ FRAMEWORKPYTHONW=
++ INSTALLTARGETS="libinstall inclinstall sharedinstall"
+
-+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
-+ return YES;
-+}
++ prefix=$PYTHONFRAMEWORKPREFIX
++ PYTHONFRAMEWORKINSTALLNAMEPREFIX="@rpath/$PYTHONFRAMEWORKDIR"
++ RESSRCDIR=Apple/iOS/Resources
+
-+@end
---- /dev/null
-+++ b/iOS/testbed/iOSTestbed/Assets.xcassets/AccentColor.colorset/Contents.json
-@@ -0,0 +1,11 @@
-+{
-+ "colors" : [
-+ {
-+ "idiom" : "universal"
-+ }
-+ ],
-+ "info" : {
-+ "author" : "xcode",
-+ "version" : 1
-+ }
-+}
---- /dev/null
-+++ b/iOS/testbed/iOSTestbed/Assets.xcassets/AppIcon.appiconset/Contents.json
-@@ -0,0 +1,13 @@
-+{
-+ "images" : [
-+ {
-+ "idiom" : "universal",
-+ "platform" : "ios",
-+ "size" : "1024x1024"
-+ }
-+ ],
-+ "info" : {
-+ "author" : "xcode",
-+ "version" : 1
-+ }
-+}
---- /dev/null
-+++ b/iOS/testbed/iOSTestbed/Assets.xcassets/Contents.json
-@@ -0,0 +1,6 @@
-+{
-+ "info" : {
-+ "author" : "xcode",
-+ "version" : 1
-+ }
-+}
---- /dev/null
-+++ b/iOS/testbed/iOSTestbed/Base.lproj/LaunchScreen.storyboard
-@@ -0,0 +1,9 @@
-+
-+
-+
-+
-+
-+
-+
-+
-+
---- /dev/null
-+++ b/iOS/testbed/iOSTestbed/app/README
-@@ -0,0 +1,7 @@
-+This folder can contain any Python application code.
++ ac_config_files="$ac_config_files Apple/iOS/Resources/Info.plist"
+
-+During the build, any binary modules found in this folder will be processed into
-+iOS Framework form.
++ ;;
++ tvOS) :
++ FRAMEWORKINSTALLFIRST="frameworkinstallunversionedstructure"
++ FRAMEWORKALTINSTALLFIRST="frameworkinstallunversionedstructure "
++ FRAMEWORKINSTALLLAST="frameworkinstallmobileheaders"
++ FRAMEWORKALTINSTALLLAST="frameworkinstallmobileheaders"
++ FRAMEWORKPYTHONW=
++ INSTALLTARGETS="libinstall inclinstall sharedinstall"
+
-+When the test suite runs, this folder will be on the PYTHONPATH, and will be the
-+working directory for the test suite.
---- /dev/null
-+++ b/iOS/testbed/iOSTestbed/app_packages/README
-@@ -0,0 +1,7 @@
-+This folder can be a target for installing any Python dependencies needed by the
-+test suite.
++ prefix=$PYTHONFRAMEWORKPREFIX
++ PYTHONFRAMEWORKINSTALLNAMEPREFIX="@rpath/$PYTHONFRAMEWORKDIR"
++ RESSRCDIR=Apple/tvOS/Resources
++
++ ac_config_files="$ac_config_files Apple/tvOS/Resources/Info.plist"
++
++ ;;
++ watchOS) :
++ FRAMEWORKINSTALLFIRST="frameworkinstallunversionedstructure"
++ FRAMEWORKALTINSTALLFIRST="frameworkinstallunversionedstructure "
++ FRAMEWORKINSTALLLAST="frameworkinstallmobileheaders"
++ FRAMEWORKALTINSTALLLAST="frameworkinstallmobileheaders"
++ FRAMEWORKPYTHONW=
++ INSTALLTARGETS="libinstall inclinstall sharedinstall"
++
++ prefix=$PYTHONFRAMEWORKPREFIX
++ PYTHONFRAMEWORKINSTALLNAMEPREFIX="@rpath/$PYTHONFRAMEWORKDIR"
++ RESSRCDIR=Apple/watchOS/Resources
++
++ ac_config_files="$ac_config_files Apple/watchOS/Resources/Info.plist"
++
++ ;;
++ *)
++ as_fn_error $? "Unknown platform for framework build" "$LINENO" 5
++ ;;
++ esac
++ esac
+
+- */Library/Frameworks)
+- MDIR="`dirname "${enableval}"`"
+- MDIR="`dirname "${MDIR}"`"
+- FRAMEWORKINSTALLAPPSPREFIX="${MDIR}/Applications"
+-
+- if test "${prefix}" = "NONE"; then
+- # User hasn't specified the
+- # --prefix option, but wants to install
+- # the framework in a non-default location,
+- # ensure that the compatibility links get
+- # installed relative to that prefix as well
+- # instead of in /usr/local.
+- FRAMEWORKUNIXTOOLSPREFIX="${MDIR}"
+- fi
+- ;;
++else
+
++ case $ac_sys_system in
++ iOS) as_fn_error $? "iOS builds must use --enable-framework" "$LINENO" 5 ;;
++ tvOS) as_fn_error $? "tvOS builds must use --enable-framework" "$LINENO" 5 ;;
++ watchOS) as_fn_error $? "watchOS builds must use --enable-framework" "$LINENO" 5 ;;
+ *)
+- FRAMEWORKINSTALLAPPSPREFIX="/Applications"
+- ;;
+- esac
++ PYTHONFRAMEWORK=
++ PYTHONFRAMEWORKDIR=no-framework
++ PYTHONFRAMEWORKPREFIX=
++ PYTHONFRAMEWORKINSTALLDIR=
++ PYTHONFRAMEWORKINSTALLNAMEPREFIX=
++ RESSRCDIR=
++ FRAMEWORKINSTALLFIRST=
++ FRAMEWORKINSTALLLAST=
++ FRAMEWORKALTINSTALLFIRST=
++ FRAMEWORKALTINSTALLLAST=
++ FRAMEWORKPYTHONW=
++ INSTALLTARGETS="commoninstall bininstall maninstall"
++ if test "x${prefix}" = "xNONE" ; then
++ FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
++ else
++ FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
++ fi
++ enable_framework=
++ esac
+
+- prefix=$PYTHONFRAMEWORKINSTALLDIR/Versions/$VERSION
++fi
+
+- # Add files for Mac specific code to the list of output
+- # files:
+- ac_config_files="$ac_config_files Mac/Makefile"
+
+- ac_config_files="$ac_config_files Mac/PythonLauncher/Makefile"
+
+- ac_config_files="$ac_config_files Mac/Resources/framework/Info.plist"
+
+- ac_config_files="$ac_config_files Mac/Resources/app/Info.plist"
+
+- esac
+
+-else
+
+- PYTHONFRAMEWORK=
+- PYTHONFRAMEWORKDIR=no-framework
+- PYTHONFRAMEWORKPREFIX=
+- PYTHONFRAMEWORKINSTALLDIR=
+- FRAMEWORKINSTALLFIRST=
+- FRAMEWORKINSTALLLAST=
+- FRAMEWORKALTINSTALLFIRST=
+- FRAMEWORKALTINSTALLLAST=
+- FRAMEWORKPYTHONW=
+- if test "x${prefix}" = "xNONE" ; then
+- FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
+- else
+- FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
+- fi
+- enable_framework=
+
+
+-fi
+
+
+
+@@ -3308,21 +3562,59 @@
+
+
+
++cat >>confdefs.h <<_ACEOF
++#define _PYTHONFRAMEWORK "${PYTHONFRAMEWORK}"
++_ACEOF
+
-+During the build, any binary modules found in this folder will be processed into
-+iOS Framework form.
+
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-app-store-compliance" >&5
++$as_echo_n "checking for --with-app-store-compliance... " >&6; }
+
-+When the test suite runs, this folder will be on the PYTHONPATH.
---- /dev/null
-+++ b/iOS/testbed/iOSTestbed/dylib-Info-template.plist
-@@ -0,0 +1,26 @@
-+
-+
-+
-+
-+ CFBundleDevelopmentRegion
-+ en
-+ CFBundleExecutable
-+
-+ CFBundleIdentifier
-+
-+ CFBundleInfoDictionaryVersion
-+ 6.0
-+ CFBundlePackageType
-+ APPL
-+ CFBundleShortVersionString
-+ 1.0
-+ CFBundleSupportedPlatforms
-+
-+ iPhoneOS
-+
-+ MinimumOSVersion
-+ 12.0
-+ CFBundleVersion
-+ 1
-+
-+
---- /dev/null
-+++ b/iOS/testbed/iOSTestbed/iOSTestbed-Info.plist
-@@ -0,0 +1,62 @@
-+
-+
-+
-+
-+ CFBundleDevelopmentRegion
-+ en
-+ CFBundleDisplayName
-+ ${PRODUCT_NAME}
-+ CFBundleExecutable
-+ ${EXECUTABLE_NAME}
-+ CFBundleIdentifier
-+ org.python.iOSTestbed
-+ CFBundleInfoDictionaryVersion
-+ 6.0
-+ CFBundleName
-+ ${PRODUCT_NAME}
-+ CFBundlePackageType
-+ APPL
-+ CFBundleShortVersionString
-+ 1.0
-+ CFBundleSignature
-+ ????
-+ CFBundleVersion
-+ 1
-+ LSRequiresIPhoneOS
-+
-+ UIRequiresFullScreen
-+
-+ UILaunchStoryboardName
-+ Launch Screen
-+ UISupportedInterfaceOrientations
-+
-+ UIInterfaceOrientationPortrait
-+ UIInterfaceOrientationLandscapeLeft
-+ UIInterfaceOrientationLandscapeRight
-+
-+ UISupportedInterfaceOrientations~ipad
-+
-+ UIInterfaceOrientationPortrait
-+ UIInterfaceOrientationPortraitUpsideDown
-+ UIInterfaceOrientationLandscapeLeft
-+ UIInterfaceOrientationLandscapeRight
-+
-+ TestArgs
-+
-+ test
-+ -uall
-+ -W
-+
-+
-+ UIApplicationSceneManifest
-+
-+ UIApplicationSupportsMultipleScenes
-+
-+ UISceneConfigurations
-+
-+
-+
-+
---- /dev/null
-+++ b/iOS/testbed/iOSTestbed/main.m
-@@ -0,0 +1,16 @@
-+//
-+// main.m
-+// iOSTestbed
-+//
++# Check whether --with-app_store_compliance was given.
++if test "${with_app_store_compliance+set}" = set; then :
++ withval=$with_app_store_compliance;
++ case "$withval" in
++ yes)
++ case $ac_sys_system in
++ Darwin|iOS|tvOS|watchOS)
++ # iOS/tvOS/watchOS is able to share the macOS patch
++ APP_STORE_COMPLIANCE_PATCH="Mac/Resources/app-store-compliance.patch"
++ ;;
++ *) as_fn_error $? "no default app store compliance patch available for $ac_sys_system" "$LINENO" 5 ;;
++ esac
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: applying default app store compliance patch" >&5
++$as_echo "applying default app store compliance patch" >&6; }
++ ;;
++ *)
++ APP_STORE_COMPLIANCE_PATCH="${withval}"
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: applying custom app store compliance patch" >&5
++$as_echo "applying custom app store compliance patch" >&6; }
++ ;;
++ esac
+
++else
+
++ case $ac_sys_system in
++ iOS|tvOS|watchOS)
++ # Always apply the compliance patch on iOS/tvOS/watchOS; we can use the macOS patch
++ APP_STORE_COMPLIANCE_PATCH="Mac/Resources/app-store-compliance.patch"
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: applying default app store compliance patch" >&5
++$as_echo "applying default app store compliance patch" >&6; }
++ ;;
++ *)
++ # No default app compliance patching on any other platform
++ APP_STORE_COMPLIANCE_PATCH=
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not patching for app store compliance" >&5
++$as_echo "not patching for app store compliance" >&6; }
++ ;;
++ esac
+
-+#import
-+#import "AppDelegate.h"
++fi
+
+
+
+-cat >>confdefs.h <<_ACEOF
+-#define _PYTHONFRAMEWORK "${PYTHONFRAMEWORK}"
+-_ACEOF
+
+
+-##AC_ARG_WITH(dyld,
+-## AS_HELP_STRING([--with-dyld],
+-## [use (OpenStep|Rhapsody) dynamic linker]))
+-##
+ # Set name for machine-dependent library files
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking MACHDEP" >&5
+@@ -3347,6 +3639,12 @@
+ *-*-vxworks*)
+ ac_sys_system=VxWorks
+ ;;
++ *-*-emscripten)
++ ac_sys_system=Emscripten
++ ;;
++ *-*-wasi)
++ ac_sys_system=WASI
++ ;;
+ *)
+ # for now, limit cross builds to known configurations
+ MACHDEP="unknown"
+@@ -3375,34 +3673,110 @@
+ darwin*) MACHDEP="darwin";;
+ '') MACHDEP="unknown";;
+ esac
+
-+int main(int argc, char * argv[]) {
-+ NSString * appDelegateClassName;
-+ @autoreleasepool {
-+ appDelegateClassName = NSStringFromClass([AppDelegate class]);
++ if test "$ac_sys_system" = "SunOS"; then
++ # For Solaris, there isn't an OS version specific macro defined
++ # in most compilers, so we define one here.
++ SUNOS_VERSION=`echo $ac_sys_release | sed -e 's!\.\(0-9\)$!.0\1!g' | tr -d '.'`
+
-+ return UIApplicationMain(argc, argv, nil, appDelegateClassName);
-+ }
-+}
---- /dev/null
-+++ b/iOS/testbed/iOSTestbedTests/iOSTestbedTests.m
-@@ -0,0 +1,160 @@
-+#import
-+#import
++cat >>confdefs.h <<_ACEOF
++#define Py_SUNOS_VERSION $SUNOS_VERSION
++_ACEOF
+
-+@interface iOSTestbedTests : XCTestCase
++ fi
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$MACHDEP\"" >&5
+ $as_echo "\"$MACHDEP\"" >&6; }
+
+-
+ if test "$cross_compiling" = yes; then
+ case "$host" in
+ *-*-linux*)
+ case "$host_cpu" in
+ arm*)
+- _host_cpu=arm
++ _host_ident=arm
+ ;;
+ *)
+- _host_cpu=$host_cpu
++ _host_ident=$host_cpu
+ esac
+ ;;
+ *-*-cygwin*)
+- _host_cpu=
++ _host_ident=
++ ;;
++ *-apple-ios*)
++ _host_os=`echo $host | cut -d '-' -f3`
++ _host_device=`echo $host | cut -d '-' -f4`
++ _host_device=${_host_device:=os}
+
-+@end
++ # IPHONEOS_DEPLOYMENT_TARGET is the minimum supported iOS version
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking iOS deployment target" >&5
++$as_echo_n "checking iOS deployment target... " >&6; }
++ IPHONEOS_DEPLOYMENT_TARGET=${_host_os:3}
++ IPHONEOS_DEPLOYMENT_TARGET=${IPHONEOS_DEPLOYMENT_TARGET:=13.0}
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $IPHONEOS_DEPLOYMENT_TARGET" >&5
++$as_echo "$IPHONEOS_DEPLOYMENT_TARGET" >&6; }
+
-+@implementation iOSTestbedTests
++ case "$host_cpu" in
++ aarch64)
++ _host_ident=${IPHONEOS_DEPLOYMENT_TARGET}-arm64-iphone${_host_device}
++ ;;
++ *)
++ _host_ident=${IPHONEOS_DEPLOYMENT_TARGET}-$host_cpu-iphone${_host_device}
++ ;;
++ esac
++ ;;
++ *-apple-tvos*)
++ _host_os=`echo $host | cut -d '-' -f3`
++ _host_device=`echo $host | cut -d '-' -f4`
++ _host_device=${_host_device:=os}
+
++ # TVOS_DEPLOYMENT_TARGET is the minimum supported tvOS version
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking tvOS deployment target" >&5
++$as_echo_n "checking tvOS deployment target... " >&6; }
++ TVOS_DEPLOYMENT_TARGET=${_host_os:4}
++ TVOS_DEPLOYMENT_TARGET=${TVOS_DEPLOYMENT_TARGET:=12.0}
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TVOS_DEPLOYMENT_TARGET" >&5
++$as_echo "$TVOS_DEPLOYMENT_TARGET" >&6; }
+
-+- (void)testPython {
-+ const char **argv;
-+ int exit_code;
-+ int failed;
-+ PyStatus status;
-+ PyPreConfig preconfig;
-+ PyConfig config;
-+ PyObject *sys_module;
-+ PyObject *sys_path_attr;
-+ NSArray *test_args;
-+ NSString *python_home;
-+ NSString *path;
-+ wchar_t *wtmp_str;
++ case "$host_cpu" in
++ aarch64)
++ _host_ident=${TVOS_DEPLOYMENT_TARGET}-arm64-appletv${_host_device}
++ ;;
++ *)
++ _host_ident=${TVOS_DEPLOYMENT_TARGET}-$host_cpu-appletv${_host_device}
++ ;;
++ esac
++ ;;
++ *-apple-watchos*)
++ _host_os=`echo $host | cut -d '-' -f3`
++ _host_device=`echo $host | cut -d '-' -f4`
++ _host_device=${_host_device:=os}
+
-+ NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
++ # WATCHOS_DEPLOYMENT_TARGET is the minimum supported watchOS version
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking watchOS deployment target" >&5
++$as_echo_n "checking watchOS deployment target... " >&6; }
++ WATCHOS_DEPLOYMENT_TARGET=${_host_os:7}
++ WATCHOS_DEPLOYMENT_TARGET=${WATCHOS_DEPLOYMENT_TARGET:=4.0}
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WATCHOS_DEPLOYMENT_TARGET" >&5
++$as_echo "$WATCHOS_DEPLOYMENT_TARGET" >&6; }
+
-+ // Set some other common environment indicators to disable color, as the
-+ // Xcode log can't display color. Stdout will report that it is *not* a
-+ // TTY.
-+ setenv("NO_COLOR", "1", true);
-+ setenv("PYTHON_COLORS", "0", true);
++ case "$host_cpu" in
++ aarch64)
++ _host_ident=${WATCHOS_DEPLOYMENT_TARGET}-arm64-watch${_host_device}
++ ;;
++ *)
++ _host_ident=${WATCHOS_DEPLOYMENT_TARGET}-$host_cpu-watch${_host_device}
++ ;;
++ esac
+ ;;
+ *-*-vxworks*)
+- _host_cpu=$host_cpu
++ _host_ident=$host_cpu
+ ;;
+ *)
+ # for now, limit cross builds to known configurations
+ MACHDEP="unknown"
+ as_fn_error $? "cross build not supported for $host" "$LINENO" 5
+ esac
+- _PYTHON_HOST_PLATFORM="$MACHDEP${_host_cpu:+-$_host_cpu}"
++ _PYTHON_HOST_PLATFORM="$MACHDEP${_host_ident:+-$_host_ident}"
+ fi
+
+ # Some systems cannot stand _XOPEN_SOURCE being defined at all; they
+@@ -3469,6 +3843,13 @@
+ define_xopen_source=no;;
+ Darwin/[12][0-9].*)
+ define_xopen_source=no;;
++ # On iOS/tvOS/watchOS, defining _POSIX_C_SOURCE also disables platform specific features.
++ iOS/*)
++ define_xopen_source=no;;
++ tvOS/*)
++ define_xopen_source=no;;
++ watchOS/*)
++ define_xopen_source=no;;
+ # On QNX 6.3.2, defining _XOPEN_SOURCE prevents netdb.h from
+ # defining NI_NUMERICHOST.
+ QNX/6.3.2)
+@@ -3531,6 +3912,12 @@
+ CONFIGURE_MACOSX_DEPLOYMENT_TARGET=
+ EXPORT_MACOSX_DEPLOYMENT_TARGET='#'
+
++# Record the value of IPHONEOS_DEPLOYMENT_TARGET / TVOS_DEPLOYMENT_TARGET /
++# WATCHOS_DEPLOYMENT_TARGET enforced by the selected host triple.
+
-+ // Arguments to pass into the test suite runner.
-+ // argv[0] must identify the process; any subsequent arg
-+ // will be handled as if it were an argument to `python -m test`
-+ test_args = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"TestArgs"];
-+ if (test_args == NULL) {
-+ NSLog(@"Unable to identify test arguments.");
-+ }
-+ argv = malloc(sizeof(char *) * ([test_args count] + 1));
-+ argv[0] = "iOSTestbed";
-+ for (int i = 1; i < [test_args count]; i++) {
-+ argv[i] = [[test_args objectAtIndex:i] UTF8String];
-+ }
-+ NSLog(@"Test command: %@", test_args);
+
-+ // Generate an isolated Python configuration.
-+ NSLog(@"Configuring isolated Python...");
-+ PyPreConfig_InitIsolatedConfig(&preconfig);
-+ PyConfig_InitIsolatedConfig(&config);
+
-+ // Configure the Python interpreter:
-+ // Enforce UTF-8 encoding for stderr, stdout, file-system encoding and locale.
-+ // See https://docs.python.org/3/library/os.html#python-utf-8-mode.
-+ preconfig.utf8_mode = 1;
-+ // Don't buffer stdio. We want output to appears in the log immediately
-+ config.buffered_stdio = 0;
-+ // Don't write bytecode; we can't modify the app bundle
-+ // after it has been signed.
-+ config.write_bytecode = 0;
-+ // Ensure that signal handlers are installed
-+ config.install_signal_handlers = 1;
-+ // Run the test module.
-+ config.run_module = Py_DecodeLocale([[test_args objectAtIndex:0] UTF8String], NULL);
-+ // For debugging - enable verbose mode.
-+ // config.verbose = 1;
+
-+ NSLog(@"Pre-initializing Python runtime...");
-+ status = Py_PreInitialize(&preconfig);
-+ if (PyStatus_Exception(status)) {
-+ XCTFail(@"Unable to pre-initialize Python interpreter: %s", status.err_msg);
-+ PyConfig_Clear(&config);
-+ return;
-+ }
+ # checks for alternative programs
+
+ # compiler flags are generated in two sets, BASECFLAGS and OPT. OPT is just
+@@ -3553,6 +3940,26 @@
+ CFLAGS=
+ fi
+
++case $ac_sys_system in #(
++ iOS) :
+
-+ // Set the home for the Python interpreter
-+ python_home = [NSString stringWithFormat:@"%@/python", resourcePath, nil];
-+ NSLog(@"PythonHome: %@", python_home);
-+ wtmp_str = Py_DecodeLocale([python_home UTF8String], NULL);
-+ status = PyConfig_SetString(&config, &config.home, wtmp_str);
-+ if (PyStatus_Exception(status)) {
-+ XCTFail(@"Unable to set PYTHONHOME: %s", status.err_msg);
-+ PyConfig_Clear(&config);
-+ return;
-+ }
-+ PyMem_RawFree(wtmp_str);
++ as_fn_append CFLAGS " -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET}"
++ as_fn_append LDFLAGS " -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET}"
++ ;; #(
++ tvOS) :
+
-+ // Read the site config
-+ status = PyConfig_Read(&config);
-+ if (PyStatus_Exception(status)) {
-+ XCTFail(@"Unable to read site config: %s", status.err_msg);
-+ PyConfig_Clear(&config);
-+ return;
-+ }
++ as_fn_append CFLAGS " -mtvos-version-min=${TVOS_DEPLOYMENT_TARGET}"
++ as_fn_append LDFLAGS " -mtvos-version-min=${TVOS_DEPLOYMENT_TARGET}"
++ ;; #(
++ watchOS) :
+
-+ NSLog(@"Configure argc/argv...");
-+ status = PyConfig_SetBytesArgv(&config, [test_args count], (char**) argv);
-+ if (PyStatus_Exception(status)) {
-+ XCTFail(@"Unable to configure argc/argv: %s", status.err_msg);
-+ PyConfig_Clear(&config);
-+ return;
-+ }
++ as_fn_append CFLAGS " -mwatchos-version-min=${WATCHOS_DEPLOYMENT_TARGET}"
++ as_fn_append LDFLAGS " -mwatchos-version-min=${WATCHOS_DEPLOYMENT_TARGET}"
++ ;; #(
++ *) :
++ ;;
++esac
+
-+ NSLog(@"Initializing Python runtime...");
-+ status = Py_InitializeFromConfig(&config);
-+ if (PyStatus_Exception(status)) {
-+ XCTFail(@"Unable to initialize Python interpreter: %s", status.err_msg);
-+ PyConfig_Clear(&config);
-+ return;
-+ }
+ if test "$ac_sys_system" = "Darwin"
+ then
+ # Compiler selection on MacOSX is more complicated than
+@@ -5365,7 +5772,42 @@
+ #elif defined(__gnu_hurd__)
+ i386-gnu
+ #elif defined(__APPLE__)
++# include "TargetConditionals.h"
++# if TARGET_OS_IOS
++# if TARGET_OS_SIMULATOR
++# if __x86_64__
++ x86_64-iphonesimulator
++# else
++ arm64-iphonesimulator
++# endif
++# else
++ arm64-iphoneos
++# endif
++# elif TARGET_OS_TV
++# if TARGET_OS_SIMULATOR
++# if __x86_64__
++ x86_64-appletvsimulator
++# else
++ arm64-appletvsimulator
++# endif
++# else
++ arm64-appletvos
++# endif
++# elif TARGET_OS_WATCH
++# if TARGET_OS_SIMULATOR
++# if __x86_64__
++ x86_64-watchsimulator
++# else
++ arm64-watchsimulator
++# endif
++# else
++ arm64_32-watchos
++# endif
++# elif TARGET_OS_OSX
+ darwin
++# else
++# error unknown Apple platform
++# endif
+ #elif defined(__VXWORKS__)
+ vxworks
+ #else
+@@ -5389,6 +5831,12 @@
+ case $ac_sys_system in #(
+ Darwin*) :
+ MULTIARCH="" ;; #(
++ iOS) :
++ MULTIARCH="" ;; #(
++ tvOS) :
++ MULTIARCH="" ;; #(
++ watchOS) :
++ MULTIARCH="" ;; #(
+ FreeBSD*) :
+ MULTIARCH="" ;; #(
+ *) :
+@@ -5396,8 +5844,6 @@
+ ;;
+ esac
+
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MULTIARCH" >&5
+-$as_echo "$MULTIARCH" >&6; }
+
+ if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then
+ if test x$PLATFORM_TRIPLET != x$MULTIARCH; then
+@@ -5407,6 +5853,16 @@
+ MULTIARCH=$PLATFORM_TRIPLET
+ fi
+
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MULTIARCH" >&5
++$as_echo "$MULTIARCH" >&6; }
+
-+ sys_module = PyImport_ImportModule("sys");
-+ if (sys_module == NULL) {
-+ XCTFail(@"Could not import sys module");
-+ return;
-+ }
++case $ac_sys_system in #(
++ iOS|tvOS|watchOS) :
++ SOABI_PLATFORM=`echo "$PLATFORM_TRIPLET" | cut -d '-' -f2` ;; #(
++ *) :
++ SOABI_PLATFORM=$PLATFORM_TRIPLET
++ ;;
++esac
+
+ if test x$MULTIARCH != x; then
+ MULTIARCH_CPPFLAGS="-DMULTIARCH=\\\"$MULTIARCH\\\""
+@@ -5953,17 +6409,25 @@
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking LDLIBRARY" >&5
+ $as_echo_n "checking LDLIBRARY... " >&6; }
+
+-# MacOSX framework builds need more magic. LDLIBRARY is the dynamic
++# Apple framework builds need more magic. LDLIBRARY is the dynamic
+ # library that we build, but we do not want to link against it (we
+ # will find it with a -framework option). For this reason there is an
+ # extra variable BLDLIBRARY against which Python and the extension
+ # modules are linked, BLDLIBRARY. This is normally the same as
+-# LDLIBRARY, but empty for MacOSX framework builds.
++# LDLIBRARY, but empty for MacOSX framework builds. iOS does the same,
++# but uses a non-versioned framework layout.
+ if test "$enable_framework"
+ then
+- LDLIBRARY='$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
+- RUNSHARED=DYLD_FRAMEWORK_PATH=`pwd`${DYLD_FRAMEWORK_PATH:+:${DYLD_FRAMEWORK_PATH}}
++ case $ac_sys_system in
++ Darwin)
++ LDLIBRARY='$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)';;
++ iOS|tvOS|watchOS)
++ LDLIBRARY='$(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK)';;
++ *)
++ as_fn_error $? "Unknown platform for framework build" "$LINENO" 5;;
++ esac
+ BLDLIBRARY=''
++ RUNSHARED=DYLD_FRAMEWORK_PATH=`pwd`${DYLD_FRAMEWORK_PATH:+:${DYLD_FRAMEWORK_PATH}}
+ else
+ BLDLIBRARY='$(LDLIBRARY)'
+ fi
+@@ -5976,64 +6440,67 @@
+
+ case $ac_sys_system in
+ CYGWIN*)
+- LDLIBRARY='libpython$(LDVERSION).dll.a'
+- DLLLIBRARY='libpython$(LDVERSION).dll'
+- ;;
++ LDLIBRARY='libpython$(LDVERSION).dll.a'
++ DLLLIBRARY='libpython$(LDVERSION).dll'
++ ;;
+ SunOS*)
+- LDLIBRARY='libpython$(LDVERSION).so'
+- BLDLIBRARY='-Wl,-R,$(LIBDIR) -L. -lpython$(LDVERSION)'
+- RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
+- INSTSONAME="$LDLIBRARY".$SOVERSION
+- if test "$with_pydebug" != yes
+- then
+- PY3LIBRARY=libpython3.so
+- fi
+- ;;
++ LDLIBRARY='libpython$(LDVERSION).so'
++ BLDLIBRARY='-Wl,-R,$(LIBDIR) -L. -lpython$(LDVERSION)'
++ RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
++ INSTSONAME="$LDLIBRARY".$SOVERSION
++ if test "$with_pydebug" != yes
++ then
++ PY3LIBRARY=libpython3.so
++ fi
++ ;;
+ Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|OpenBSD*|VxWorks*)
+- LDLIBRARY='libpython$(LDVERSION).so'
+- BLDLIBRARY='-L. -lpython$(LDVERSION)'
+- RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
+- INSTSONAME="$LDLIBRARY".$SOVERSION
+- if test "$with_pydebug" != yes
+- then
+- PY3LIBRARY=libpython3.so
+- fi
+- ;;
++ LDLIBRARY='libpython$(LDVERSION).so'
++ BLDLIBRARY='-L. -lpython$(LDVERSION)'
++ RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
++ INSTSONAME="$LDLIBRARY".$SOVERSION
++ if test "$with_pydebug" != yes
++ then
++ PY3LIBRARY=libpython3.so
++ fi
++ ;;
+ hp*|HP*)
+- case `uname -m` in
+- ia64)
+- LDLIBRARY='libpython$(LDVERSION).so'
+- ;;
+- *)
+- LDLIBRARY='libpython$(LDVERSION).sl'
+- ;;
+- esac
+- BLDLIBRARY='-Wl,+b,$(LIBDIR) -L. -lpython$(LDVERSION)'
+- RUNSHARED=SHLIB_PATH=`pwd`${SHLIB_PATH:+:${SHLIB_PATH}}
+- ;;
++ case `uname -m` in
++ ia64)
++ LDLIBRARY='libpython$(LDVERSION).so'
++ ;;
++ *)
++ LDLIBRARY='libpython$(LDVERSION).sl'
++ ;;
++ esac
++ BLDLIBRARY='-Wl,+b,$(LIBDIR) -L. -lpython$(LDVERSION)'
++ RUNSHARED=SHLIB_PATH=`pwd`${SHLIB_PATH:+:${SHLIB_PATH}}
++ ;;
+ Darwin*)
+- LDLIBRARY='libpython$(LDVERSION).dylib'
+- BLDLIBRARY='-L. -lpython$(LDVERSION)'
+- RUNSHARED=DYLD_LIBRARY_PATH=`pwd`${DYLD_LIBRARY_PATH:+:${DYLD_LIBRARY_PATH}}
+- ;;
++ LDLIBRARY='libpython$(LDVERSION).dylib'
++ BLDLIBRARY='-L. -lpython$(LDVERSION)'
++ RUNSHARED=DYLD_LIBRARY_PATH=`pwd`${DYLD_LIBRARY_PATH:+:${DYLD_LIBRARY_PATH}}
++ ;;
++ iOS|tvOS|watchOS)
++ LDLIBRARY='libpython$(LDVERSION).dylib'
++ ;;
+ AIX*)
+- LDLIBRARY='libpython$(LDVERSION).so'
+- RUNSHARED=LIBPATH=`pwd`${LIBPATH:+:${LIBPATH}}
+- ;;
++ LDLIBRARY='libpython$(LDVERSION).so'
++ RUNSHARED=LIBPATH=`pwd`${LIBPATH:+:${LIBPATH}}
++ ;;
+
+ esac
+ else # shared is disabled
+ PY_ENABLE_SHARED=0
+ case $ac_sys_system in
+ CYGWIN*)
+- BLDLIBRARY='$(LIBRARY)'
+- LDLIBRARY='libpython$(LDVERSION).dll.a'
+- ;;
++ BLDLIBRARY='$(LIBRARY)'
++ LDLIBRARY='libpython$(LDVERSION).dll.a'
++ ;;
+ esac
+ fi
+
+ if test "$cross_compiling" = yes; then
+- RUNSHARED=
++ RUNSHARED=
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LDLIBRARY" >&5
+@@ -6249,11 +6716,16 @@
+ fi
+
+ if test "$cross_compiling" = yes; then
+- case "$READELF" in
+- readelf|:)
+- as_fn_error $? "readelf for the host is required for cross builds" "$LINENO" 5
+- ;;
+- esac
++ case "$ac_sys_system" in
++ iOS|tvOS|watchOS) ;;
++ *)
++ case "$READELF" in
++ readelf|:)
++ as_fn_error $? "readelf for the host is required for cross builds" "$LINENO" 5
++ ;;
++ esac
++ ;;
++ esac
+ fi
+
+
+@@ -9787,6 +10259,11 @@
+ BLDSHARED="$LDSHARED"
+ fi
+ ;;
++ iOS/*|tvOS/*|watchOS/*)
++ LDSHARED='$(CC) -dynamiclib -F . -framework $(PYTHONFRAMEWORK)'
++ LDCXXSHARED='$(CXX) -dynamiclib -F . -framework $(PYTHONFRAMEWORK)'
++ BLDSHARED="$LDSHARED"
++ ;;
+ Linux*|GNU*|QNX*|VxWorks*)
+ LDSHARED='$(CC) -shared'
+ LDCXXSHARED='$(CXX) -shared';;
+@@ -9888,20 +10365,18 @@
+ Linux-android*) LINKFORSHARED="-pie -Xlinker -export-dynamic";;
+ Linux*|GNU*) LINKFORSHARED="-Xlinker -export-dynamic";;
+ # -u libsys_s pulls in all symbols in libsys
+- Darwin/*)
++ Darwin/*|iOS/*|tvOS/*|watchOS/*)
+ LINKFORSHARED="$extra_undefs -framework CoreFoundation"
+
+ # Issue #18075: the default maximum stack size (8MBytes) is too
+ # small for the default recursion limit. Increase the stack size
+ # to ensure that tests don't crash
+- stack_size="1000000" # 16 MB
+- if test "$with_ubsan" = "yes"
+- then
+- # Undefined behavior sanitizer requires an even deeper stack
+- stack_size="4000000" # 64 MB
+- fi
+-
+- LINKFORSHARED="-Wl,-stack_size,$stack_size $LINKFORSHARED"
++ stack_size="1000000" # 16 MB
++ if test "$with_ubsan" = "yes"
++ then
++ # Undefined behavior sanitizer requires an even deeper stack
++ stack_size="4000000" # 64 MB
++ fi
+
+
+ cat >>confdefs.h <<_ACEOF
+@@ -9909,11 +10384,17 @@
+ _ACEOF
+
+
+- if test "$enable_framework"
+- then
+- LINKFORSHARED="$LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
++ if test $ac_sys_system = "Darwin"; then
++ LINKFORSHARED="-Wl,-stack_size,$stack_size $LINKFORSHARED"
+
-+ sys_path_attr = PyObject_GetAttrString(sys_module, "path");
-+ if (sys_path_attr == NULL) {
-+ XCTFail(@"Could not access sys.path");
-+ return;
-+ }
++ if test "$enable_framework"; then
++ LINKFORSHARED="$LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
++ fi
++ LINKFORSHARED="$LINKFORSHARED"
++ elif test "$ac_sys_system" = "iOS" -o "$ac_sys_system" = "tvOS" -o "$ac_sys_system" = "watchOS"; then
++ LINKFORSHARED="-Wl,-stack_size,$stack_size $LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK)'
+ fi
+- LINKFORSHARED="$LINKFORSHARED";;
++ ;;
+ OpenUNIX*|UnixWare*) LINKFORSHARED="-Wl,-Bexport";;
+ SCO_SV*) LINKFORSHARED="-Wl,-Bexport";;
+ ReliantUNIX*) LINKFORSHARED="-W1 -Blargedynsym";;
+@@ -10796,7 +11277,7 @@
+ fi
+
+
+-if test "$ac_sys_system" = "Darwin"
++if test "$ac_sys_system" = "Darwin" -o "$ac_sys_system" = "iOS" -o "$ac_sys_system" = "tvOS" -o "$ac_sys_system" = "watchOS"
+ then
+ case "$with_system_ffi" in
+ "")
+@@ -10824,10 +11305,12 @@
+ if test "$with_system_ffi" = "yes" && test -n "$PKG_CONFIG"; then
+ LIBFFI_INCLUDEDIR="`"$PKG_CONFIG" libffi --cflags-only-I 2>/dev/null | sed -e 's/^-I//;s/ *$//'`"
+ else
+- LIBFFI_INCLUDEDIR=""
++ LIBFFI_INCLUDEDIR="${LIBFFI_INCLUDEDIR}"
+ fi
+
+
+
-+ // Add the app packages path
-+ path = [NSString stringWithFormat:@"%@/app_packages", resourcePath, nil];
-+ NSLog(@"App packages path: %@", path);
-+ wtmp_str = Py_DecodeLocale([path UTF8String], NULL);
-+ failed = PyList_Insert(sys_path_attr, 0, PyUnicode_FromString([path UTF8String]));
-+ if (failed) {
-+ XCTFail(@"Unable to add app packages to sys.path");
-+ return;
-+ }
-+ PyMem_RawFree(wtmp_str);
+
-+ path = [NSString stringWithFormat:@"%@/app", resourcePath, nil];
-+ NSLog(@"App path: %@", path);
-+ wtmp_str = Py_DecodeLocale([path UTF8String], NULL);
-+ failed = PyList_Insert(sys_path_attr, 0, PyUnicode_FromString([path UTF8String]));
-+ if (failed) {
-+ XCTFail(@"Unable to add app to sys.path");
-+ return;
-+ }
-+ PyMem_RawFree(wtmp_str);
+ # Check for use of the system libmpdec library
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-system-libmpdec" >&5
+ $as_echo_n "checking for --with-system-libmpdec... " >&6; }
+@@ -11952,18 +12435,18 @@
+
+ # checks for library functions
+ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \
+- clock confstr close_range copy_file_range ctermid dup3 execv explicit_bzero \
++ clock confstr close_range copy_file_range ctermid dup3 explicit_bzero \
+ explicit_memset faccessat fchmod fchmodat fchown fchownat \
+- fdwalk fexecve fdopendir fork fpathconf fstatat ftime ftruncate futimesat \
+- futimens futimes gai_strerror getentropy \
++ fdwalk fexecve fdopendir fpathconf fstatat ftime ftruncate futimesat \
++ futimens futimes gai_strerror \
+ getgrgid_r getgrnam_r \
+- getgrouplist getgroups getlogin getloadavg getpeername getpgid getpid \
++ getgrouplist getlogin getloadavg getpeername getpgid getpid \
+ getpriority getresuid getresgid getpwent getpwnam_r getpwuid_r getspnam getspent getsid getwd \
+ if_nameindex \
+ initgroups kill killpg lchown lockf linkat lstat lutimes mmap \
+ memrchr mbrtowc mkdirat mkfifo \
+ madvise mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \
+- posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \
++ posix_fallocate posix_fadvise pread preadv preadv2 \
+ pthread_condattr_setclock pthread_init pthread_kill pwrite pwritev pwritev2 \
+ readlink readlinkat readv realpath renameat \
+ sem_open sem_timedwait sem_clockwait sem_getvalue sem_unlink sendfile setegid seteuid \
+@@ -11971,7 +12454,7 @@
+ setlocale setregid setreuid setresuid setresgid setsid setpgid setpgrp setpriority setuid setvbuf \
+ sched_get_priority_max sched_setaffinity sched_setscheduler sched_setparam \
+ sched_rr_get_interval \
+- sigaction sigaltstack sigfillset siginterrupt sigpending sigrelse \
++ sigaction sigfillset siginterrupt sigpending sigrelse \
+ sigtimedwait sigwait sigwaitinfo snprintf splice strftime strlcpy strsignal symlinkat sync \
+ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \
+ truncate uname unlinkat utimensat utimes vfork waitid waitpid wait3 wait4 \
+@@ -12005,6 +12488,44 @@
+
+ fi
+
++# iOS/tvOS/watchOS define some system methods that can be linked (so they are
++# found by configure), but either raise a compilation error (because the
++# header definition prevents usage - autoconf doesn't use the headers), or
++# raise an error if used at runtime. Force these symbols off.
++if test "$ac_sys_system" != "iOS" -a "$ac_sys_system" != "tvOS" -a "$ac_sys_system" != "watchOS" ; then
++ for ac_func in getentropy getgroups system
++do :
++ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
++ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
++if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
++ cat >>confdefs.h <<_ACEOF
++#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
++_ACEOF
+
-+ // Ensure the working directory is the app folder.
-+ chdir([path UTF8String]);
++fi
++done
+
-+ // Start the test suite. Print a separator to differentiate Python startup logs from app logs
-+ NSLog(@"---------------------------------------------------------------------------");
++fi
+
-+ exit_code = Py_RunMain();
-+ XCTAssertEqual(exit_code, 0, @"Test suite did not pass");
++# tvOS/watchOS have some additional methods that can be found, but not used.
++if test "$ac_sys_system" != "tvOS" -a "$ac_sys_system" != "watchOS" ; then
++ for ac_func in \
++ execv fork posix_spawn posix_spawnp \
++ sigaltstack \
+
-+ NSLog(@"---------------------------------------------------------------------------");
++do :
++ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
++ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
++if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
++ cat >>confdefs.h <<_ACEOF
++#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
++_ACEOF
+
-+ Py_Finalize();
-+}
++fi
++done
+
++fi
+
-+@end
-diff --git a/pyconfig.h.in b/pyconfig.h.in
-index 57c84e5f8fa..b40023b5f61 100644
---- a/pyconfig.h.in
-+++ b/pyconfig.h.in
-@@ -1122,6 +1122,9 @@
- /* Define to 1 if you have the `sysconf' function. */
- #undef HAVE_SYSCONF
+ ac_fn_c_check_decl "$LINENO" "dirfd" "ac_cv_have_decl_dirfd" "#include
+ #include
+ "
+@@ -12956,9 +13477,10 @@
+ fi
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-+/* Define to 1 if you have the `system' function. */
-+#undef HAVE_SYSTEM
-+
- /* Define to 1 if you have the header file. */
- #undef HAVE_SYSEXITS_H
+-# check for openpty and forkpty
+-
+-for ac_func in openpty
++# check for openpty, login_tty, and forkpty
++# tvOS/watchOS have functions for tty, but can't use them
++if test "$ac_sys_system" != "tvOS" -a "$ac_sys_system" != "watchOS" ; then
++ for ac_func in openpty
+ do :
+ ac_fn_c_check_func "$LINENO" "openpty" "ac_cv_func_openpty"
+ if test "x$ac_cv_func_openpty" = xyes; then :
+@@ -13048,14 +13570,71 @@
+ LIBS="$LIBS -lbsd"
+ fi
-@@ -1699,4 +1702,3 @@
- #endif
++fi
- #endif /*Py_PYCONFIG_H*/
--
-diff --git a/setup.py b/setup.py
-index a39610a1c7c..09ea06965e9 100644
---- a/setup.py
-+++ b/setup.py
-@@ -84,6 +84,9 @@
- MS_WINDOWS = (HOST_PLATFORM == 'win32')
- CYGWIN = (HOST_PLATFORM == 'cygwin')
- MACOS = (HOST_PLATFORM == 'darwin')
-+IOS = HOST_PLATFORM.startswith('ios-')
-+TVOS = HOST_PLATFORM.startswith('tvos-')
-+WATCHOS = HOST_PLATFORM.startswith('watchos-')
- AIX = (HOST_PLATFORM.startswith('aix'))
- VXWORKS = ('vxworks' in HOST_PLATFORM)
- CC = os.environ.get("CC")
-@@ -163,16 +166,20 @@
- for var_name in make_vars:
- var = sysconfig.get_config_var(var_name)
- if var is not None:
-- m = re.search(r'--sysroot=([^"]\S*|"[^"]+")', var)
-- if m is not None:
-- sysroot = m.group(1).strip('"')
-- for subdir in subdirs:
-- if os.path.isabs(subdir):
-- subdir = subdir[1:]
-- path = os.path.join(sysroot, subdir)
-- if os.path.isdir(path):
-- dirs.append(path)
-- break
-+ for pattern in [
-+ r'-isysroot\s*([^"]\S*|"[^"]+")',
-+ r'--sysroot=([^"]\S*|"[^"]+")',
-+ ]:
-+ m = re.search(pattern, var)
-+ if m is not None:
-+ sysroot = m.group(1).strip('"')
-+ for subdir in subdirs:
-+ if os.path.isabs(subdir):
-+ subdir = subdir[1:]
-+ path = os.path.join(sysroot, subdir)
-+ if os.path.isdir(path):
-+ dirs.append(path)
-+ break
- return dirs
+ fi
++done
+
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing login_tty" >&5
++$as_echo_n "checking for library containing login_tty... " >&6; }
++if ${ac_cv_search_login_tty+:} false; then :
++ $as_echo_n "(cached) " >&6
++else
++ ac_func_search_save_LIBS=$LIBS
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
+
++/* Override any GCC internal prototype to avoid an error.
++ Use char because int might match the return type of a GCC
++ builtin and then its argument prototype would still apply. */
++#ifdef __cplusplus
++extern "C"
++#endif
++char login_tty ();
++int
++main ()
++{
++return login_tty ();
++ ;
++ return 0;
++}
++_ACEOF
++for ac_lib in '' util; do
++ if test -z "$ac_lib"; then
++ ac_res="none required"
++ else
++ ac_res=-l$ac_lib
++ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
++ fi
++ if ac_fn_c_try_link "$LINENO"; then :
++ ac_cv_search_login_tty=$ac_res
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext
++ if ${ac_cv_search_login_tty+:} false; then :
++ break
+ fi
+ done
++if ${ac_cv_search_login_tty+:} false; then :
+
+-for ac_func in forkpty
++else
++ ac_cv_search_login_tty=no
++fi
++rm conftest.$ac_ext
++LIBS=$ac_func_search_save_LIBS
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_login_tty" >&5
++$as_echo "$ac_cv_search_login_tty" >&6; }
++ac_res=$ac_cv_search_login_tty
++if test "$ac_res" != no; then :
++ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
++
++$as_echo "#define HAVE_LOGIN_TTY 1" >>confdefs.h
++
++
++fi
++
++ for ac_func in forkpty
+ do :
+ ac_fn_c_check_func "$LINENO" "forkpty" "ac_cv_func_forkpty"
+ if test "x$ac_cv_func_forkpty" = xyes; then :
+@@ -13145,13 +13724,12 @@
+ LIBS="$LIBS -lbsd"
+ fi
+-
+ fi
-@@ -1035,8 +1042,10 @@
- self.add(Extension('_csv', ['_csv.c']))
+-
+ fi
+ done
- # POSIX subprocess module helper.
-- self.add(Extension('_posixsubprocess', ['_posixsubprocess.c'],
-- extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
-+ # iOS/tvOS/watchOS doesn't have this.
-+ if not (IOS or TVOS or WATCHOS):
-+ self.add(Extension('_posixsubprocess', ['_posixsubprocess.c'],
-+ extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
++fi
- def detect_test_extensions(self):
- # Python C API test module
-@@ -1526,6 +1535,15 @@
- ],
- libraries=dblibs)
- break
-+
-+ # iOS, tvOS and watchOS have DBM in the system libraries.
-+ if IOS or TVOS or WATCHOS:
-+ dbmext = Extension('_dbm', ['_dbmmodule.c'],
-+ define_macros=[
-+ ('HAVE_NDBM_H',None),
-+ ],
-+ libraries=['dbm'])
-+
- if dbmext is not None:
- self.add(dbmext)
- else:
-@@ -1605,7 +1623,8 @@
- if sqlite_libfile:
- sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
+ # check for long file support functions
+ for ac_func in fseek64 fseeko fstatvfs ftell64 ftello statvfs
+@@ -13502,7 +14080,12 @@
+ done
-- if sqlite_incdir and sqlite_libdir:
-+ # iOS, tvOS and watchOS provide SQLITE as part of the system libraries.
-+ if (sqlite_incdir and sqlite_libdir) or IOS or TVOS or WATCHOS:
- sqlite_srcs = ['_sqlite/cache.c',
- '_sqlite/connection.c',
- '_sqlite/cursor.c',
-@@ -1638,7 +1657,7 @@
- # Only include the directory where sqlite was found if it does
- # not already exist in set include directories, otherwise you
- # can end up with a bad search path order.
-- if sqlite_incdir not in self.compiler.include_dirs:
-+ if sqlite_incdir and sqlite_incdir not in self.compiler.include_dirs:
- include_dirs.append(sqlite_incdir)
- # avoid a runtime library path for a system library dir
- if sqlite_libdir and sqlite_libdir[0] in self.lib_dirs:
-@@ -1721,6 +1740,9 @@
- self.missing.append('zlib')
- else:
- self.missing.append('zlib')
-+ elif IOS or TVOS or WATCHOS:
-+ # iOS/tvOS/watchOS include zlib in the system libraries.
-+ self.add(Extension('zlib', ['zlibmodule.c'], libraries=['z']))
- else:
- self.missing.append('zlib')
-@@ -2246,6 +2268,11 @@
- extra_compile_args.append('-DMACOSX')
- include_dirs.append('_ctypes/darwin')
+-for ac_func in clock_settime
++# On iOS, tvOS and watchOS, clock_settime can be linked (so it is found by
++# configure), but when used in an unprivileged process, it crashes rather than
++# returning an error. Force the symbol off.
++if test "$ac_sys_system" != "iOS" -a "$ac_sys_system" != "tvOS" -a "$ac_sys_system" != "watchOS"
++then
++ for ac_func in clock_settime
+ do :
+ ac_fn_c_check_func "$LINENO" "clock_settime" "ac_cv_func_clock_settime"
+ if test "x$ac_cv_func_clock_settime" = xyes; then :
+@@ -13512,7 +14095,7 @@
-+ elif IOS or TVOS or WATCHOS:
-+ sources.append('_ctypes/malloc_closure.c')
-+ extra_compile_args.append('-DUSING_MALLOC_CLOSURE_DOT_C')
-+ include_dirs.append('_ctypes/darwin')
-+
- elif HOST_PLATFORM == 'sunos5':
- # XXX This shouldn't be necessary; it appears that some
- # of the assembler code is non-PIC (i.e. it has relocations
-@@ -2275,7 +2302,8 @@
- libraries=['m']))
+ else
- ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR")
-- ffi_lib = None
-+ ffi_lib_dir = sysconfig.get_config_var("LIBFFI_LIBDIR")
-+ ffi_lib = sysconfig.get_config_var("LIBFFI_LIB")
+- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_settime in -lrt" >&5
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_settime in -lrt" >&5
+ $as_echo_n "checking for clock_settime in -lrt... " >&6; }
+ if ${ac_cv_lib_rt_clock_settime+:} false; then :
+ $as_echo_n "(cached) " >&6
+@@ -13550,7 +14133,7 @@
+ $as_echo "$ac_cv_lib_rt_clock_settime" >&6; }
+ if test "x$ac_cv_lib_rt_clock_settime" = xyes; then :
- ffi_inc_dirs = self.inc_dirs.copy()
- if MACOS:
-@@ -2304,6 +2332,7 @@
- for lib_name in ('ffi', 'ffi_pic'):
- if (self.compiler.find_library_file(self.lib_dirs, lib_name)):
- ffi_lib = lib_name
-+ self.use_system_libffi = True
- break
+- $as_echo "#define HAVE_CLOCK_SETTIME 1" >>confdefs.h
++ $as_echo "#define HAVE_CLOCK_SETTIME 1" >>confdefs.h
- if ffi_inc and ffi_lib:
-@@ -2317,7 +2346,8 @@
- ext.include_dirs.append(ffi_inc)
- ext.libraries.append(ffi_lib)
-- self.use_system_libffi = True
-+ if ffi_lib_dir:
-+ ext.library_dirs.append(ffi_lib_dir)
+ fi
+@@ -13559,6 +14142,7 @@
+ fi
+ done
- if sysconfig.get_config_var('HAVE_LIBDL'):
- # for dlopen, see bpo-32647
---- /dev/null
-+++ b/tvOS/README.rst
-@@ -0,0 +1,108 @@
-+=====================
-+Python on tvOS README
-+=====================
-+
-+:Authors:
-+ Russell Keith-Magee (2023-11)
-+
-+This document provides a quick overview of some tvOS specific features in the
-+Python distribution.
-+
-+Compilers for building on tvOS
-+==============================
-+
-+Building for tvOS requires the use of Apple's Xcode tooling. It is strongly
-+recommended that you use the most recent stable release of Xcode, on the
-+most recently released macOS.
-+
-+tvOS specific arguments to configure
-+===================================
-+
-+* ``--enable-framework[=DIR]``
-+
-+ This argument specifies the location where the Python.framework will
-+ be installed.
-+
-+* ``--with-framework-name=NAME``
-+
-+ Specify the name for the python framework, defaults to ``Python``.
-+
-+
-+Building and using Python on tvOS
-+=================================
-+
-+ABIs and Architectures
-+----------------------
-+
-+tvOS apps can be deployed on physical devices, and on the tvOS simulator.
-+Although the API used on these devices is identical, the ABI is different - you
-+need to link against different libraries for an tvOS device build
-+(``appletvos``) or an tvOS simulator build (``appletvsimulator``). Apple uses
-+the XCframework format to allow specifying a single dependency that supports
-+multiple ABIs. An XCframework is a wrapper around multiple ABI-specific
-+frameworks.
-+
-+tvOS can also support different CPU architectures within each ABI. At present,
-+there is only a single support ed architecture on physical devices - ARM64.
-+However, the *simulator* supports 2 architectures - ARM64 (for running on Apple
-+Silicon machines), and x86_64 (for running on older Intel-based machines.)
-+
-+To support multiple CPU architectures on a single platform, Apple uses a "fat
-+binary" format - a single physical file that contains support for multiple
-+architectures.
-+
-+How do I build Python for tvOS?
-+-------------------------------
-+
-+The Python build system will build a ``Python.framework`` that supports a
-+*single* ABI with a *single* architecture. If you want to use Python in an tvOS
-+project, you need to:
++fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for major" >&5
+ $as_echo_n "checking for major... " >&6; }
+@@ -13638,7 +14222,9 @@
+ else
+ if test "$cross_compiling" = yes; then :
+
+-if test "${enable_ipv6+set}" = set; then
++if test "$ac_sys_system" = "Linux-android" -o "$ac_sys_system" = "iOS" -o "$ac_sys_system" = "tvOS" -o "$ac_sys_system" = "watchOS"; then
++ ac_cv_buggy_getaddrinfo="no"
++elif test "${enable_ipv6+set}" = set; then
+ ac_cv_buggy_getaddrinfo="no -- configured with --(en|dis)able-ipv6"
+ else
+ ac_cv_buggy_getaddrinfo=yes
+@@ -15617,7 +16203,7 @@
+ $as_echo "$ABIFLAGS" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking SOABI" >&5
+ $as_echo_n "checking SOABI... " >&6; }
+-SOABI='cpython-'`echo $VERSION | tr -d .`${ABIFLAGS}${PLATFORM_TRIPLET:+-$PLATFORM_TRIPLET}
++SOABI='cpython-'`echo $VERSION | tr -d .`${ABIFLAGS}${SOABI_PLATFORM:+-$SOABI_PLATFORM}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SOABI" >&5
+ $as_echo "$SOABI" >&6; }
+
+@@ -15625,7 +16211,7 @@
+ if test "$Py_DEBUG" = 'true' -a "$with_trace_refs" != "yes"; then
+ # Similar to SOABI but remove "d" flag from ABIFLAGS
+
+- ALT_SOABI='cpython-'`echo $VERSION | tr -d .``echo $ABIFLAGS | tr -d d`${PLATFORM_TRIPLET:+-$PLATFORM_TRIPLET}
++ ALT_SOABI='cpython-'`echo $VERSION | tr -d .``echo $ABIFLAGS | tr -d d`${SOABI_PLATFORM:+-$SOABI_PLATFORM}
+
+ cat >>confdefs.h <<_ACEOF
+ #define ALT_SOABI "${ALT_SOABI}"
+@@ -16875,24 +17461,28 @@
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for device files" >&5
+ $as_echo "$as_me: checking for device files" >&6;}
+
+-if test "x$cross_compiling" = xyes; then
+- if test "${ac_cv_file__dev_ptmx+set}" != set; then
+- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptmx" >&5
++if test "$ac_sys_system" = "iOS" -o "$ac_sys_system" = "tvOS" -o "$ac_sys_system" = "watchOS" ; then
++ ac_cv_file__dev_ptmx=no
++ ac_cv_file__dev_ptc=no
++else
++ if test "x$cross_compiling" = xyes; then
++ if test "${ac_cv_file__dev_ptmx+set}" != set; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptmx" >&5
+ $as_echo_n "checking for /dev/ptmx... " >&6; }
+- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not set" >&5
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not set" >&5
+ $as_echo "not set" >&6; }
+- as_fn_error $? "set ac_cv_file__dev_ptmx to yes/no in your CONFIG_SITE file when cross compiling" "$LINENO" 5
+- fi
+- if test "${ac_cv_file__dev_ptc+set}" != set; then
+- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptc" >&5
++ as_fn_error $? "set ac_cv_file__dev_ptmx to yes/no in your CONFIG_SITE file when cross compiling" "$LINENO" 5
++ fi
++ if test "${ac_cv_file__dev_ptc+set}" != set; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptc" >&5
+ $as_echo_n "checking for /dev/ptc... " >&6; }
+- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not set" >&5
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not set" >&5
+ $as_echo "not set" >&6; }
+- as_fn_error $? "set ac_cv_file__dev_ptc to yes/no in your CONFIG_SITE file when cross compiling" "$LINENO" 5
++ as_fn_error $? "set ac_cv_file__dev_ptc to yes/no in your CONFIG_SITE file when cross compiling" "$LINENO" 5
++ fi
+ fi
+-fi
+
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptmx" >&5
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptmx" >&5
+ $as_echo_n "checking for /dev/ptmx... " >&6; }
+ if ${ac_cv_file__dev_ptmx+:} false; then :
+ $as_echo_n "(cached) " >&6
+@@ -16911,12 +17501,12 @@
+
+ fi
+
+-if test "x$ac_cv_file__dev_ptmx" = xyes; then
++ if test "x$ac_cv_file__dev_ptmx" = xyes; then
+
+ $as_echo "#define HAVE_DEV_PTMX 1" >>confdefs.h
+
+-fi
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptc" >&5
++ fi
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptc" >&5
+ $as_echo_n "checking for /dev/ptc... " >&6; }
+ if ${ac_cv_file__dev_ptc+:} false; then :
+ $as_echo_n "(cached) " >&6
+@@ -16935,10 +17525,11 @@
+
+ fi
+
+-if test "x$ac_cv_file__dev_ptc" = xyes; then
++ if test "x$ac_cv_file__dev_ptc" = xyes; then
+
+ $as_echo "#define HAVE_DEV_PTC 1" >>confdefs.h
+
++ fi
+ fi
+
+ if test $ac_sys_system = Darwin
+@@ -17382,7 +17973,15 @@
+ if test "${with_ensurepip+set}" = set; then :
+ withval=$with_ensurepip;
+ else
+- with_ensurepip=upgrade
+
-+1. Produce multiple ``Python.framework`` builds, one for each ABI and architecture;
-+2. Merge the binaries for each architecture on a given ABI into a single "fat" binary;
-+3. Merge the "fat" frameworks for each ABI into a single XCframework.
++ case $ac_sys_system in #(
++ iOS|tvOS|watchOS) :
++ with_ensurepip=no ;; #(
++ *) :
++ with_ensurepip=upgrade
++ ;;
++esac
+
-+tvOS builds of Python *must* be constructed as framework builds. To support this,
-+you must provide the ``--enable-framework`` flag when configuring the build.
+ fi
+
+ case $with_ensurepip in #(
+@@ -18765,6 +19364,9 @@
+ "Mac/PythonLauncher/Makefile") CONFIG_FILES="$CONFIG_FILES Mac/PythonLauncher/Makefile" ;;
+ "Mac/Resources/framework/Info.plist") CONFIG_FILES="$CONFIG_FILES Mac/Resources/framework/Info.plist" ;;
+ "Mac/Resources/app/Info.plist") CONFIG_FILES="$CONFIG_FILES Mac/Resources/app/Info.plist" ;;
++ "Apple/iOS/Resources/Info.plist") CONFIG_FILES="$CONFIG_FILES Apple/iOS/Resources/Info.plist" ;;
++ "Apple/tvOS/Resources/Info.plist") CONFIG_FILES="$CONFIG_FILES Apple/tvOS/Resources/Info.plist" ;;
++ "Apple/watchOS/Resources/Info.plist") CONFIG_FILES="$CONFIG_FILES Apple/watchOS/Resources/Info.plist" ;;
+ "Makefile.pre") CONFIG_FILES="$CONFIG_FILES Makefile.pre" ;;
+ "Misc/python.pc") CONFIG_FILES="$CONFIG_FILES Misc/python.pc" ;;
+ "Misc/python-embed.pc") CONFIG_FILES="$CONFIG_FILES Misc/python-embed.pc" ;;
+diff --git a/configure.ac b/configure.ac
+index ac3be3850a9..55301e3cb16 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -71,7 +71,7 @@
+ if test "$cross_compiling" = yes; then
+ AC_MSG_CHECKING([for python interpreter for cross build])
+ if test -z "$PYTHON_FOR_BUILD"; then
+- for interp in python$PACKAGE_VERSION python3 python; do
++ for interp in $PYTHON_FOR_REGEN python$PACKAGE_VERSION python3 python; do
+ which $interp >/dev/null 2>&1 || continue
+ if $interp -c "import sys;sys.exit(not '.'.join(str(n) for n in sys.version_info@<:@:2@:>@) == '$PACKAGE_VERSION')"; then
+ break
+@@ -88,6 +88,7 @@
+ AC_MSG_ERROR([Cross compiling required --host=HOST-TUPLE and --build=ARCH])
+ else
+ PYTHON_FOR_BUILD='./$(BUILDPYTHON) -E'
++ AC_MSG_RESULT($interp)
+ fi
+ AC_SUBST(PYTHON_FOR_BUILD)
+
+@@ -154,6 +155,161 @@
+ AC_SUBST(CONFIG_ARGS)
+ CONFIG_ARGS="$ac_configure_args"
+
++# Set name for machine-dependent library files
++AC_ARG_VAR([MACHDEP], [name for machine-dependent library files])
++AC_MSG_CHECKING([MACHDEP])
++if test -z "$MACHDEP"
++then
++ # avoid using uname for cross builds
++ if test "$cross_compiling" = yes; then
++ # ac_sys_system and ac_sys_release are used for setting
++ # a lot of different things including 'define_xopen_source'
++ # in the case statement below.
++ case "$host" in
++ *-*-linux-android*)
++ ac_sys_system=Linux-android
++ ;;
++ *-*-linux*)
++ ac_sys_system=Linux
++ ;;
++ *-*-cygwin*)
++ ac_sys_system=Cygwin
++ ;;
++ *-apple-ios*)
++ ac_sys_system=iOS
++ ;;
++ *-apple-tvos*)
++ ac_sys_system=tvOS
++ ;;
++ *-apple-watchos*)
++ ac_sys_system=watchOS
++ ;;
++ *-*-vxworks*)
++ ac_sys_system=VxWorks
++ ;;
++ *-*-emscripten)
++ ac_sys_system=Emscripten
++ ;;
++ *-*-wasi)
++ ac_sys_system=WASI
++ ;;
++ *)
++ # for now, limit cross builds to known configurations
++ MACHDEP="unknown"
++ AC_MSG_ERROR([cross build not supported for $host])
++ esac
++ ac_sys_release=
++ else
++ ac_sys_system=`uname -s`
++ if test "$ac_sys_system" = "AIX" \
++ -o "$ac_sys_system" = "UnixWare" -o "$ac_sys_system" = "OpenUNIX"; then
++ ac_sys_release=`uname -v`
++ else
++ ac_sys_release=`uname -r`
++ fi
++ fi
++ ac_md_system=`echo $ac_sys_system |
++ tr -d '[/ ]' | tr '[[A-Z]]' '[[a-z]]'`
++ ac_md_release=`echo $ac_sys_release |
++ tr -d '[/ ]' | sed 's/^[[A-Z]]\.//' | sed 's/\..*//'`
++ MACHDEP="$ac_md_system$ac_md_release"
+
-+The build also requires the use of cross-compilation. The commands for building
-+Python for tvOS will look somethign like::
++ case $MACHDEP in
++ aix*) MACHDEP="aix";;
++ linux*) MACHDEP="linux";;
++ cygwin*) MACHDEP="cygwin";;
++ darwin*) MACHDEP="darwin";;
++ '') MACHDEP="unknown";;
++ esac
+
-+ $ ./configure \
-+ --enable-framework=/path/to/install \
-+ --host=aarch64-apple-tvos \
-+ --build=aarch64-apple-darwin \
-+ --with-build-python=/path/to/python.exe
-+ $ make
-+ $ make install
++ if test "$ac_sys_system" = "SunOS"; then
++ # For Solaris, there isn't an OS version specific macro defined
++ # in most compilers, so we define one here.
++ SUNOS_VERSION=`echo $ac_sys_release | sed -e 's!\.\([0-9]\)$!.0\1!g' | tr -d '.'`
++ AC_DEFINE_UNQUOTED([Py_SUNOS_VERSION], [$SUNOS_VERSION],
++ [The version of SunOS/Solaris as reported by `uname -r' without the dot.])
++ fi
++fi
++AC_MSG_RESULT(["$MACHDEP"])
+
-+In this invocation:
++# On cross-compile builds, configure will look for a host-specific compiler by
++# prepending the user-provided host triple to the required binary name.
++#
++# On iOS/tvOS/watchOS, this results in binaries like "arm64-apple-ios13.0-simulator-gcc",
++# which isn't a binary that exists, and isn't very convenient, as it contains the
++# iOS version. As the default cross-compiler name won't exist, configure falls
++# back to gcc, which *definitely* won't work. We're providing wrapper scripts for
++# these tools; the binary names of these scripts are better defaults than "gcc".
++# This only requires that the user put the platform scripts folder (e.g.,
++# "iOS/Resources/bin") in their path, rather than defining platform-specific
++# names/paths for AR, CC, CPP, and CXX explicitly; and if the user forgets to
++# either put the platform scripts folder in the path, or specify CC etc,
++# configure will fail.
++if test -z "$AR"; then
++ case "$host" in
++ aarch64-apple-ios*-simulator) AR=arm64-apple-ios-simulator-ar ;;
++ aarch64-apple-ios*) AR=arm64-apple-ios-ar ;;
++ x86_64-apple-ios*-simulator) AR=x86_64-apple-ios-simulator-ar ;;
+
-+* ``/path/to/install`` is the location where the final Python.framework will be
-+ output.
++ aarch64-apple-tvos*-simulator) AR=arm64-apple-tvos-simulator-ar ;;
++ aarch64-apple-tvos*) AR=arm64-apple-tvos-ar ;;
++ x86_64-apple-tvos*-simulator) AR=x86_64-apple-tvos-simulator-ar ;;
+
-+* ``--host`` is the architecture and ABI that you want to build, in GNU compiler
-+ triple format. This will be one of:
++ aarch64-apple-watchos*-simulator) AR=arm64-apple-watchos-simulator-ar ;;
++ aarch64-apple-watchos*) AR=arm64_32-apple-watchos-ar ;;
++ x86_64-apple-watchos*-simulator) AR=x86_64-apple-watchos-simulator-ar ;;
++ *)
++ esac
++fi
++if test -z "$CC"; then
++ case "$host" in
++ aarch64-apple-ios*-simulator) CC=arm64-apple-ios-simulator-clang ;;
++ aarch64-apple-ios*) CC=arm64-apple-ios-clang ;;
++ x86_64-apple-ios*-simulator) CC=x86_64-apple-ios-simulator-clang ;;
+
-+ - ``aarch64-apple-tvos`` for ARM64 tvOS devices.
-+ - ``aarch64-apple-tvos-simulator`` for the tvOS simulator running on Apple
-+ Silicon devices.
-+ - ``x86_64-apple-tvos-simulator`` for the tvOS simulator running on Intel
-+ devices.
++ aarch64-apple-tvos*-simulator) CC=arm64-apple-tvos-simulator-clang ;;
++ aarch64-apple-tvos*) CC=arm64-apple-tvos-clang ;;
++ x86_64-apple-tvos*-simulator) CC=x86_64-apple-tvos-simulator-clang ;;
+
-+* ``--build`` is the GNU compiler triple for the machine that will be running
-+ the compiler. This is one of:
++ aarch64-apple-watchos*-simulator) CC=arm64-apple-watchos-simulator-clang ;;
++ aarch64-apple-watchos*) CC=arm64_32-apple-watchos-clang ;;
++ x86_64-apple-watchos*-simulator) CC=x86_64-apple-watchos-simulator-clang ;;
++ *)
++ esac
++fi
++if test -z "$CPP"; then
++ case "$host" in
++ aarch64-apple-ios*-simulator) CPP=arm64-apple-ios-simulator-cpp ;;
++ aarch64-apple-ios*) CPP=arm64-apple-ios-cpp ;;
++ x86_64-apple-ios*-simulator) CPP=x86_64-apple-ios-simulator-cpp ;;
+
-+ - ``aarch64-apple-darwin`` for Apple Silicon devices.
-+ - ``x86_64-apple-darwin`` for Intel devices.
++ aarch64-apple-tvos*-simulator) CPP=arm64-apple-tvos-simulator-cpp ;;
++ aarch64-apple-tvos*) CPP=arm64-apple-tvos-cpp ;;
++ x86_64-apple-tvos*-simulator) CPP=x86_64-apple-tvos-simulator-cpp ;;
+
-+* ``/path/to/python.exe`` is the path to a Python binary on the machine that
-+ will be running the compiler. This is needed because the Python compilation
-+ process involves running some Python code. On a normal desktop build of
-+ Python, you can compile a python interpreter and then use that interpreter to
-+ run Python code. However, the binaries produced for tvOS won't run on macOS, so
-+ you need to provide an external Python interpreter. This interpreter must be
-+ the version as the Python that is being compiled.
++ aarch64-apple-watchos*-simulator) CPP=arm64-apple-watchos-simulator-cpp ;;
++ aarch64-apple-watchos*) CPP=arm64_32-apple-watchos-cpp ;;
++ x86_64-apple-watchos*-simulator) CPP=x86_64-apple-watchos-simulator-cpp ;;
++ *)
++ esac
++fi
++if test -z "$CXX"; then
++ case "$host" in
++ aarch64-apple-ios*-simulator) CXX=arm64-apple-ios-simulator-clang++ ;;
++ aarch64-apple-ios*) CXX=arm64-apple-ios-clang++ ;;
++ x86_64-apple-ios*-simulator) CXX=x86_64-apple-ios-simulator-clang++ ;;
+
-+Using a framework-based Python on tvOS
-+======================================
---- /dev/null
-+++ b/tvOS/Resources/Info.plist.in
-@@ -0,0 +1,34 @@
-+
-+
-+
-+
-+ CFBundleDevelopmentRegion
-+ en
-+ CFBundleExecutable
-+ Python
-+ CFBundleGetInfoString
-+ Python Runtime and Library
-+ CFBundleIdentifier
-+ @PYTHONFRAMEWORKIDENTIFIER@
-+ CFBundleInfoDictionaryVersion
-+ 6.0
-+ CFBundleName
-+ Python
-+ CFBundlePackageType
-+ FMWK
-+ CFBundleShortVersionString
-+ %VERSION%
-+ CFBundleLongVersionString
-+ %VERSION%, (c) 2001-2024 Python Software Foundation.
-+ CFBundleSignature
-+ ????
-+ CFBundleVersion
-+ 1
-+ CFBundleSupportedPlatforms
-+
-+ tvOS
-+
-+ MinimumOSVersion
-+ @TVOS_DEPLOYMENT_TARGET@
-+
-+
---- /dev/null
-+++ b/tvOS/Resources/bin/arm64-apple-tvos-ar
-@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk appletvos${TVOS_SDK_VERSION} ar "$@"
---- /dev/null
-+++ b/tvOS/Resources/bin/arm64-apple-tvos-clang
-@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk appletvos${TVOS_SDK_VERSION} clang -target arm64-apple-tvos "$@"
---- /dev/null
-+++ b/tvOS/Resources/bin/arm64-apple-tvos-clang++
-@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk appletvos${TVOS_SDK_VERSION} clang++ -target arm64-apple-tvos "$@"
---- /dev/null
-+++ b/tvOS/Resources/bin/arm64-apple-tvos-cpp
-@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk appletvos${TVOS_SDK_VERSION} clang -target arm64-apple-tvos -E "$@"
---- /dev/null
-+++ b/tvOS/Resources/bin/arm64-apple-tvos-simulator-ar
-@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk appletvsimulator${TVOS_SDK_VERSION} ar "$@"
---- /dev/null
-+++ b/tvOS/Resources/bin/arm64-apple-tvos-simulator-clang
-@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk appletvsimulator${TVOS_SDK_VERSION} clang -target arm64-apple-tvos-simulator "$@"
---- /dev/null
-+++ b/tvOS/Resources/bin/arm64-apple-tvos-simulator-clang++
-@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk appletvsimulator${TVOS_SDK_VERSION} clang++ -target arm64-apple-tvos-simulator "$@"
---- /dev/null
-+++ b/tvOS/Resources/bin/arm64-apple-tvos-simulator-cpp
-@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk appletvsimulator${TVOS_SDK_VERSION} clang -target arm64-apple-tvos-simulator -E "$@"
---- /dev/null
-+++ b/tvOS/Resources/bin/x86_64-apple-tvos-simulator-ar
-@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk appletvsimulator${TVOS_SDK_VERSION} ar "$@"
---- /dev/null
-+++ b/tvOS/Resources/bin/x86_64-apple-tvos-simulator-clang
-@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk appletvsimulator${TVOS_SDK_VERSION} clang -target x86_64-apple-tvos-simulator "$@"
---- /dev/null
-+++ b/tvOS/Resources/bin/x86_64-apple-tvos-simulator-clang++
-@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk appletvsimulator${TVOS_SDK_VERSION} clang++ -target x86_64-apple-tvos-simulator "$@"
---- /dev/null
-+++ b/tvOS/Resources/bin/x86_64-apple-tvos-simulator-cpp
-@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk appletvsimulator${TVOS_SDK_VERSION} clang -target x86_64-apple-tvos-simulator -E "$@"
---- /dev/null
-+++ b/tvOS/Resources/dylib-Info-template.plist
-@@ -0,0 +1,26 @@
-+
-+
-+
-+
-+ CFBundleDevelopmentRegion
-+ en
-+ CFBundleExecutable
-+
-+ CFBundleIdentifier
-+
-+ CFBundleInfoDictionaryVersion
-+ 6.0
-+ CFBundlePackageType
-+ APPL
-+ CFBundleShortVersionString
-+ 1.0
-+ CFBundleSupportedPlatforms
-+
-+ tvOS
-+
-+ MinimumOSVersion
-+ 9.0
-+ CFBundleVersion
-+ 1
-+
-+
---- /dev/null
-+++ b/tvOS/Resources/pyconfig.h
-@@ -0,0 +1,7 @@
-+#ifdef __arm64__
-+#include "pyconfig-arm64.h"
-+#endif
++ aarch64-apple-tvos*-simulator) CXX=arm64-apple-tvos-simulator-clang++ ;;
++ aarch64-apple-tvos*) CXX=arm64-apple-tvos-clang++ ;;
++ x86_64-apple-tvos*-simulator) CXX=x86_64-apple-tvos-simulator-clang++ ;;
+
-+#ifdef __x86_64__
-+#include "pyconfig-x86_64.h"
-+#endif
---- /dev/null
-+++ b/watchOS/README.rst
-@@ -0,0 +1,108 @@
-+========================
-+Python on watchOS README
-+========================
++ aarch64-apple-watchos*-simulator) CXX=arm64-apple-watchos-simulator-clang++ ;;
++ aarch64-apple-watchos*) CXX=arm64_32-apple-watchos-clang++ ;;
++ x86_64-apple-watchos*-simulator) CXX=x86_64-apple-watchos-simulator-clang++ ;;
++ *)
++ esac
++fi
+
-+:Authors:
-+ Russell Keith-Magee (2023-11)
+ AC_MSG_CHECKING([for --enable-universalsdk])
+ AC_ARG_ENABLE(universalsdk,
+ AS_HELP_STRING([--enable-universalsdk@<:@=SDKDIR@:>@],
+@@ -263,123 +419,243 @@
+ [
+ case $enableval in
+ yes)
+- enableval=/Library/Frameworks
++ case $ac_sys_system in
++ Darwin) enableval=/Library/Frameworks ;;
++ iOS) enableval=Apple/iOS/Frameworks/\$\(MULTIARCH\) ;;
++ tvOS) enableval=Apple/tvOS/Frameworks/\$\(MULTIARCH\) ;;
++ watchOS) enableval=Apple/watchOS/Frameworks/\$\(MULTIARCH\) ;;
++ *) AC_MSG_ERROR([Unknown platform for framework build])
++ esac
+ esac
+
-+This document provides a quick overview of some watchOS specific features in the
-+Python distribution.
+ case $enableval in
+ no)
+- PYTHONFRAMEWORK=
+- PYTHONFRAMEWORKDIR=no-framework
+- PYTHONFRAMEWORKPREFIX=
+- PYTHONFRAMEWORKINSTALLDIR=
+- FRAMEWORKINSTALLFIRST=
+- FRAMEWORKINSTALLLAST=
+- FRAMEWORKALTINSTALLFIRST=
+- FRAMEWORKALTINSTALLLAST=
+- FRAMEWORKPYTHONW=
+- if test "x${prefix}" = "xNONE"; then
+- FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
+- else
+- FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
+- fi
+- enable_framework=
++ case $ac_sys_system in
++ iOS) AC_MSG_ERROR([iOS builds must use --enable-framework]) ;;
++ tvOS) AC_MSG_ERROR([tvOS builds must use --enable-framework]) ;;
++ watchOS) AC_MSG_ERROR([watchOS builds must use --enable-framework]) ;;
++ *)
++ PYTHONFRAMEWORK=
++ PYTHONFRAMEWORKDIR=no-framework
++ PYTHONFRAMEWORKPREFIX=
++ PYTHONFRAMEWORKINSTALLDIR=
++ PYTHONFRAMEWORKINSTALLNAMEPREFIX=
++ RESSRCDIR=
++ FRAMEWORKINSTALLFIRST=
++ FRAMEWORKINSTALLLAST=
++ FRAMEWORKALTINSTALLFIRST=
++ FRAMEWORKALTINSTALLLAST=
++ FRAMEWORKPYTHONW=
++ INSTALLTARGETS="commoninstall bininstall maninstall"
+
-+Compilers for building on watchOS
-+=================================
++ if test "x${prefix}" = "xNONE"; then
++ FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
++ else
++ FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
++ fi
++ enable_framework=
++ esac
+ ;;
+ *)
+ PYTHONFRAMEWORKPREFIX="${enableval}"
+ PYTHONFRAMEWORKINSTALLDIR=$PYTHONFRAMEWORKPREFIX/$PYTHONFRAMEWORKDIR
+- FRAMEWORKINSTALLFIRST="frameworkinstallstructure"
+- FRAMEWORKALTINSTALLFIRST="frameworkinstallstructure "
+- FRAMEWORKINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools"
+- FRAMEWORKALTINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkaltinstallunixtools"
+- FRAMEWORKPYTHONW="frameworkpythonw"
+- FRAMEWORKINSTALLAPPSPREFIX="/Applications"
+-
+- if test "x${prefix}" = "xNONE" ; then
+- FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
+
+- else
+- FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
+- fi
++ case $ac_sys_system in #(
++ Darwin) :
++ FRAMEWORKINSTALLFIRST="frameworkinstallversionedstructure"
++ FRAMEWORKALTINSTALLFIRST="frameworkinstallversionedstructure "
++ FRAMEWORKINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools"
++ FRAMEWORKALTINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkaltinstallunixtools"
++ FRAMEWORKPYTHONW="frameworkpythonw"
++ FRAMEWORKINSTALLAPPSPREFIX="/Applications"
++ INSTALLTARGETS="commoninstall bininstall maninstall"
+
-+Building for watchOS requires the use of Apple's Xcode tooling. It is strongly
-+recommended that you use the most recent stable release of Xcode, on the
-+most recently released macOS.
++ if test "x${prefix}" = "xNONE" ; then
++ FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
+
-+watchOS specific arguments to configure
-+=======================================
++ else
++ FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
++ fi
+
+- case "${enableval}" in
+- /System*)
+- FRAMEWORKINSTALLAPPSPREFIX="/Applications"
+- if test "${prefix}" = "NONE" ; then
+- # See below
+- FRAMEWORKUNIXTOOLSPREFIX="/usr"
+- fi
+- ;;
++ case "${enableval}" in
++ /System*)
++ FRAMEWORKINSTALLAPPSPREFIX="/Applications"
++ if test "${prefix}" = "NONE" ; then
++ # See below
++ FRAMEWORKUNIXTOOLSPREFIX="/usr"
++ fi
++ ;;
+
-+* ``--enable-framework[=DIR]``
++ /Library*)
++ FRAMEWORKINSTALLAPPSPREFIX="/Applications"
++ ;;
+
-+ This argument specifies the location where the Python.framework will
-+ be installed.
++ */Library/Frameworks)
++ MDIR="`dirname "${enableval}"`"
++ MDIR="`dirname "${MDIR}"`"
++ FRAMEWORKINSTALLAPPSPREFIX="${MDIR}/Applications"
+
-+* ``--with-framework-name=NAME``
++ if test "${prefix}" = "NONE"; then
++ # User hasn't specified the
++ # --prefix option, but wants to install
++ # the framework in a non-default location,
++ # ensure that the compatibility links get
++ # installed relative to that prefix as well
++ # instead of in /usr/local.
++ FRAMEWORKUNIXTOOLSPREFIX="${MDIR}"
++ fi
++ ;;
+
+- /Library*)
+- FRAMEWORKINSTALLAPPSPREFIX="/Applications"
+- ;;
+-
+- */Library/Frameworks)
+- MDIR="`dirname "${enableval}"`"
+- MDIR="`dirname "${MDIR}"`"
+- FRAMEWORKINSTALLAPPSPREFIX="${MDIR}/Applications"
+-
+- if test "${prefix}" = "NONE"; then
+- # User hasn't specified the
+- # --prefix option, but wants to install
+- # the framework in a non-default location,
+- # ensure that the compatibility links get
+- # installed relative to that prefix as well
+- # instead of in /usr/local.
+- FRAMEWORKUNIXTOOLSPREFIX="${MDIR}"
+- fi
+- ;;
++ *)
++ FRAMEWORKINSTALLAPPSPREFIX="/Applications"
++ ;;
++ esac
+
+- *)
+- FRAMEWORKINSTALLAPPSPREFIX="/Applications"
+- ;;
++ prefix=$PYTHONFRAMEWORKINSTALLDIR/Versions/$VERSION
++ PYTHONFRAMEWORKINSTALLNAMEPREFIX=${prefix}
++ RESSRCDIR=Mac/Resources/framework
+
-+ Specify the name for the python framework, defaults to ``Python``.
++ # Add files for Mac specific code to the list of output
++ # files:
++ AC_CONFIG_FILES([Mac/Makefile])
++ AC_CONFIG_FILES([Mac/PythonLauncher/Makefile])
++ AC_CONFIG_FILES([Mac/Resources/framework/Info.plist])
++ AC_CONFIG_FILES([Mac/Resources/app/Info.plist])
++ ;;
++ iOS) :
++ FRAMEWORKINSTALLFIRST="frameworkinstallunversionedstructure"
++ FRAMEWORKALTINSTALLFIRST="frameworkinstallunversionedstructure "
++ FRAMEWORKINSTALLLAST="frameworkinstallmobileheaders"
++ FRAMEWORKALTINSTALLLAST="frameworkinstallmobileheaders"
++ FRAMEWORKPYTHONW=
++ INSTALLTARGETS="libinstall inclinstall sharedinstall"
+
++ prefix=$PYTHONFRAMEWORKPREFIX
++ PYTHONFRAMEWORKINSTALLNAMEPREFIX="@rpath/$PYTHONFRAMEWORKDIR"
++ RESSRCDIR=Apple/iOS/Resources
+
-+Building and using Python on watchOS
-+====================================
++ AC_CONFIG_FILES([Apple/iOS/Resources/Info.plist])
++ ;;
++ tvOS) :
++ FRAMEWORKINSTALLFIRST="frameworkinstallunversionedstructure"
++ FRAMEWORKALTINSTALLFIRST="frameworkinstallunversionedstructure "
++ FRAMEWORKINSTALLLAST="frameworkinstallmobileheaders"
++ FRAMEWORKALTINSTALLLAST="frameworkinstallmobileheaders"
++ FRAMEWORKPYTHONW=
++ INSTALLTARGETS="libinstall inclinstall sharedinstall"
+
-+ABIs and Architectures
-+----------------------
++ prefix=$PYTHONFRAMEWORKPREFIX
++ PYTHONFRAMEWORKINSTALLNAMEPREFIX="@rpath/$PYTHONFRAMEWORKDIR"
++ RESSRCDIR=Apple/tvOS/Resources
+
-+watchOS apps can be deployed on physical devices, and on the watchOS simulator.
-+Although the API used on these devices is identical, the ABI is different - you
-+need to link against different libraries for an watchOS device build
-+(``watchos``) or an watchOS simulator build (``watchsimulator``). Apple uses the
-+XCframework format to allow specifying a single dependency that supports
-+multiple ABIs. An XCframework is a wrapper around multiple ABI-specific
-+frameworks.
++ AC_CONFIG_FILES([Apple/tvOS/Resources/Info.plist])
++ ;;
++ watchOS) :
++ FRAMEWORKINSTALLFIRST="frameworkinstallunversionedstructure"
++ FRAMEWORKALTINSTALLFIRST="frameworkinstallunversionedstructure "
++ FRAMEWORKINSTALLLAST="frameworkinstallmobileheaders"
++ FRAMEWORKALTINSTALLLAST="frameworkinstallmobileheaders"
++ FRAMEWORKPYTHONW=
++ INSTALLTARGETS="libinstall inclinstall sharedinstall"
+
-+watchOS can also support different CPU architectures within each ABI. At present,
-+there is only a single support ed architecture on physical devices - ARM64.
-+However, the *simulator* supports 2 architectures - ARM64 (for running on Apple
-+Silicon machines), and x86_64 (for running on older Intel-based machines.)
++ prefix=$PYTHONFRAMEWORKPREFIX
++ PYTHONFRAMEWORKINSTALLNAMEPREFIX="@rpath/$PYTHONFRAMEWORKDIR"
++ RESSRCDIR=Apple/watchOS/Resources
+
-+To support multiple CPU architectures on a single platform, Apple uses a "fat
-+binary" format - a single physical file that contains support for multiple
-+architectures.
++ AC_CONFIG_FILES([Apple/watchOS/Resources/Info.plist])
++ ;;
++ *)
++ AC_MSG_ERROR([Unknown platform for framework build])
++ ;;
++ esac
+ esac
+-
+- prefix=$PYTHONFRAMEWORKINSTALLDIR/Versions/$VERSION
+-
+- # Add files for Mac specific code to the list of output
+- # files:
+- AC_CONFIG_FILES(Mac/Makefile)
+- AC_CONFIG_FILES(Mac/PythonLauncher/Makefile)
+- AC_CONFIG_FILES(Mac/Resources/framework/Info.plist)
+- AC_CONFIG_FILES(Mac/Resources/app/Info.plist)
+- esac
+ ],[
+- PYTHONFRAMEWORK=
+- PYTHONFRAMEWORKDIR=no-framework
+- PYTHONFRAMEWORKPREFIX=
+- PYTHONFRAMEWORKINSTALLDIR=
+- FRAMEWORKINSTALLFIRST=
+- FRAMEWORKINSTALLLAST=
+- FRAMEWORKALTINSTALLFIRST=
+- FRAMEWORKALTINSTALLLAST=
+- FRAMEWORKPYTHONW=
+- if test "x${prefix}" = "xNONE" ; then
+- FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
+- else
+- FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
+- fi
+- enable_framework=
+-
++ case $ac_sys_system in
++ iOS) AC_MSG_ERROR([iOS builds must use --enable-framework]) ;;
++ tvOS) AC_MSG_ERROR([tvOS builds must use --enable-framework]) ;;
++ watchOS) AC_MSG_ERROR([watchOS builds must use --enable-framework]) ;;
++ *)
++ PYTHONFRAMEWORK=
++ PYTHONFRAMEWORKDIR=no-framework
++ PYTHONFRAMEWORKPREFIX=
++ PYTHONFRAMEWORKINSTALLDIR=
++ PYTHONFRAMEWORKINSTALLNAMEPREFIX=
++ RESSRCDIR=
++ FRAMEWORKINSTALLFIRST=
++ FRAMEWORKINSTALLLAST=
++ FRAMEWORKALTINSTALLFIRST=
++ FRAMEWORKALTINSTALLLAST=
++ FRAMEWORKPYTHONW=
++ INSTALLTARGETS="commoninstall bininstall maninstall"
++ if test "x${prefix}" = "xNONE" ; then
++ FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
++ else
++ FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
++ fi
++ enable_framework=
++ esac
+ ])
+-AC_SUBST(PYTHONFRAMEWORK)
+-AC_SUBST(PYTHONFRAMEWORKIDENTIFIER)
+-AC_SUBST(PYTHONFRAMEWORKDIR)
+-AC_SUBST(PYTHONFRAMEWORKPREFIX)
+-AC_SUBST(PYTHONFRAMEWORKINSTALLDIR)
+-AC_SUBST(FRAMEWORKINSTALLFIRST)
+-AC_SUBST(FRAMEWORKINSTALLLAST)
+-AC_SUBST(FRAMEWORKALTINSTALLFIRST)
+-AC_SUBST(FRAMEWORKALTINSTALLLAST)
+-AC_SUBST(FRAMEWORKPYTHONW)
+-AC_SUBST(FRAMEWORKUNIXTOOLSPREFIX)
+-AC_SUBST(FRAMEWORKINSTALLAPPSPREFIX)
++AC_SUBST([PYTHONFRAMEWORK])
++AC_SUBST([PYTHONFRAMEWORKIDENTIFIER])
++AC_SUBST([PYTHONFRAMEWORKDIR])
++AC_SUBST([PYTHONFRAMEWORKPREFIX])
++AC_SUBST([PYTHONFRAMEWORKINSTALLDIR])
++AC_SUBST([PYTHONFRAMEWORKINSTALLNAMEPREFIX])
++AC_SUBST([RESSRCDIR])
++AC_SUBST([FRAMEWORKINSTALLFIRST])
++AC_SUBST([FRAMEWORKINSTALLLAST])
++AC_SUBST([FRAMEWORKALTINSTALLFIRST])
++AC_SUBST([FRAMEWORKALTINSTALLLAST])
++AC_SUBST([FRAMEWORKPYTHONW])
++AC_SUBST([FRAMEWORKUNIXTOOLSPREFIX])
++AC_SUBST([FRAMEWORKINSTALLAPPSPREFIX])
++AC_SUBST([INSTALLTARGETS])
+
+ AC_DEFINE_UNQUOTED(_PYTHONFRAMEWORK, "${PYTHONFRAMEWORK}", [framework name])
+
+-##AC_ARG_WITH(dyld,
+-## AS_HELP_STRING([--with-dyld],
+-## [use (OpenStep|Rhapsody) dynamic linker]))
+-##
++dnl quadrigraphs "@<:@" and "@:>@" produce "[" and "]" in the output
++AC_MSG_CHECKING([for --with-app-store-compliance])
++AC_ARG_WITH(
++ [app_store_compliance],
++ [AS_HELP_STRING(
++ [--with-app-store-compliance=@<:@PATCH-FILE@:>@],
++ [Enable any patches required for compiliance with app stores.
++ Optional PATCH-FILE specifies the custom patch to apply.]
++ )],[
++ case "$withval" in
++ yes)
++ case $ac_sys_system in
++ Darwin|iOS|tvOS|watchOS)
++ # iOS/tvOS/watchOS is able to share the macOS patch
++ APP_STORE_COMPLIANCE_PATCH="Mac/Resources/app-store-compliance.patch"
++ ;;
++ *) AC_MSG_ERROR([no default app store compliance patch available for $ac_sys_system]) ;;
++ esac
++ AC_MSG_RESULT([applying default app store compliance patch])
++ ;;
++ *)
++ APP_STORE_COMPLIANCE_PATCH="${withval}"
++ AC_MSG_RESULT([applying custom app store compliance patch])
++ ;;
++ esac
++ ],[
++ case $ac_sys_system in
++ iOS|tvOS|watchOS)
++ # Always apply the compliance patch on iOS/tvOS/watchOS; we can use the macOS patch
++ APP_STORE_COMPLIANCE_PATCH="Mac/Resources/app-store-compliance.patch"
++ AC_MSG_RESULT([applying default app store compliance patch])
++ ;;
++ *)
++ # No default app compliance patching on any other platform
++ APP_STORE_COMPLIANCE_PATCH=
++ AC_MSG_RESULT([not patching for app store compliance])
++ ;;
++ esac
++])
++AC_SUBST([APP_STORE_COMPLIANCE_PATCH])
+
-+How do I build Python for watchOS?
-+-------------------------------
++AC_SUBST([_PYTHON_HOST_PLATFORM])
+
-+The Python build system will build a ``Python.framework`` that supports a
-+*single* ABI with a *single* architecture. If you want to use Python in an watchOS
-+project, you need to:
+ # Set name for machine-dependent library files
+ AC_ARG_VAR([MACHDEP], [name for machine-dependent library files])
+ AC_MSG_CHECKING(MACHDEP)
+@@ -403,6 +679,12 @@
+ *-*-vxworks*)
+ ac_sys_system=VxWorks
+ ;;
++ *-*-emscripten)
++ ac_sys_system=Emscripten
++ ;;
++ *-*-wasi)
++ ac_sys_system=WASI
++ ;;
+ *)
+ # for now, limit cross builds to known configurations
+ MACHDEP="unknown"
+@@ -431,33 +713,100 @@
+ darwin*) MACHDEP="darwin";;
+ '') MACHDEP="unknown";;
+ esac
+
-+1. Produce multiple ``Python.framework`` builds, one for each ABI and architecture;
-+2. Merge the binaries for each architecture on a given ABI into a single "fat" binary;
-+3. Merge the "fat" frameworks for each ABI into a single XCframework.
++ if test "$ac_sys_system" = "SunOS"; then
++ # For Solaris, there isn't an OS version specific macro defined
++ # in most compilers, so we define one here.
++ SUNOS_VERSION=`echo $ac_sys_release | sed -e 's!\.\([0-9]\)$!.0\1!g' | tr -d '.'`
++ AC_DEFINE_UNQUOTED([Py_SUNOS_VERSION], [$SUNOS_VERSION],
++ [The version of SunOS/Solaris as reported by `uname -r' without the dot.])
++ fi
+ fi
+ AC_MSG_RESULT("$MACHDEP")
+
+-AC_SUBST(_PYTHON_HOST_PLATFORM)
+ if test "$cross_compiling" = yes; then
+ case "$host" in
+ *-*-linux*)
+ case "$host_cpu" in
+ arm*)
+- _host_cpu=arm
++ _host_ident=arm
+ ;;
+ *)
+- _host_cpu=$host_cpu
++ _host_ident=$host_cpu
+ esac
+ ;;
+ *-*-cygwin*)
+- _host_cpu=
++ _host_ident=
++ ;;
++ *-apple-ios*)
++ _host_os=`echo $host | cut -d '-' -f3`
++ _host_device=`echo $host | cut -d '-' -f4`
++ _host_device=${_host_device:=os}
+
-+watchOS builds of Python *must* be constructed as framework builds. To support this,
-+you must provide the ``--enable-framework`` flag when configuring the build.
++ # IPHONEOS_DEPLOYMENT_TARGET is the minimum supported iOS version
++ AC_MSG_CHECKING([iOS deployment target])
++ IPHONEOS_DEPLOYMENT_TARGET=${_host_os:3}
++ IPHONEOS_DEPLOYMENT_TARGET=${IPHONEOS_DEPLOYMENT_TARGET:=13.0}
++ AC_MSG_RESULT([$IPHONEOS_DEPLOYMENT_TARGET])
+
-+The build also requires the use of cross-compilation. The commands for building
-+Python for watchOS will look somethign like::
++ case "$host_cpu" in
++ aarch64)
++ _host_ident=${IPHONEOS_DEPLOYMENT_TARGET}-arm64-iphone${_host_device}
++ ;;
++ *)
++ _host_ident=${IPHONEOS_DEPLOYMENT_TARGET}-$host_cpu-iphone${_host_device}
++ ;;
++ esac
++ ;;
++ *-apple-tvos*)
++ _host_os=`echo $host | cut -d '-' -f3`
++ _host_device=`echo $host | cut -d '-' -f4`
++ _host_device=${_host_device:=os}
+
-+ $ ./configure \
-+ --enable-framework=/path/to/install \
-+ --host=aarch64-apple-watchos \
-+ --build=aarch64-apple-darwin \
-+ --with-build-python=/path/to/python.exe
-+ $ make
-+ $ make install
++ # TVOS_DEPLOYMENT_TARGET is the minimum supported tvOS version
++ AC_MSG_CHECKING([tvOS deployment target])
++ TVOS_DEPLOYMENT_TARGET=${_host_os:4}
++ TVOS_DEPLOYMENT_TARGET=${TVOS_DEPLOYMENT_TARGET:=12.0}
++ AC_MSG_RESULT([$TVOS_DEPLOYMENT_TARGET])
+
-+In this invocation:
++ case "$host_cpu" in
++ aarch64)
++ _host_ident=${TVOS_DEPLOYMENT_TARGET}-arm64-appletv${_host_device}
++ ;;
++ *)
++ _host_ident=${TVOS_DEPLOYMENT_TARGET}-$host_cpu-appletv${_host_device}
++ ;;
++ esac
++ ;;
++ *-apple-watchos*)
++ _host_os=`echo $host | cut -d '-' -f3`
++ _host_device=`echo $host | cut -d '-' -f4`
++ _host_device=${_host_device:=os}
+
-+* ``/path/to/install`` is the location where the final Python.framework will be
-+ output.
++ # WATCHOS_DEPLOYMENT_TARGET is the minimum supported watchOS version
++ AC_MSG_CHECKING([watchOS deployment target])
++ WATCHOS_DEPLOYMENT_TARGET=${_host_os:7}
++ WATCHOS_DEPLOYMENT_TARGET=${WATCHOS_DEPLOYMENT_TARGET:=4.0}
++ AC_MSG_RESULT([$WATCHOS_DEPLOYMENT_TARGET])
+
-+* ``--host`` is the architecture and ABI that you want to build, in GNU compiler
-+ triple format. This will be one of:
++ case "$host_cpu" in
++ aarch64)
++ _host_ident=${WATCHOS_DEPLOYMENT_TARGET}-arm64-watch${_host_device}
++ ;;
++ *)
++ _host_ident=${WATCHOS_DEPLOYMENT_TARGET}-$host_cpu-watch${_host_device}
++ ;;
++ esac
+ ;;
+ *-*-vxworks*)
+- _host_cpu=$host_cpu
++ _host_ident=$host_cpu
+ ;;
+ *)
+ # for now, limit cross builds to known configurations
+ MACHDEP="unknown"
+ AC_MSG_ERROR([cross build not supported for $host])
+ esac
+- _PYTHON_HOST_PLATFORM="$MACHDEP${_host_cpu:+-$_host_cpu}"
++ _PYTHON_HOST_PLATFORM="$MACHDEP${_host_ident:+-$_host_ident}"
+ fi
+
+ # Some systems cannot stand _XOPEN_SOURCE being defined at all; they
+@@ -521,6 +870,13 @@
+ define_xopen_source=no;;
+ Darwin/@<:@[12]@:>@@<:@0-9@:>@.*)
+ define_xopen_source=no;;
++ # On iOS/tvOS/watchOS, defining _POSIX_C_SOURCE also disables platform specific features.
++ iOS/*)
++ define_xopen_source=no;;
++ tvOS/*)
++ define_xopen_source=no;;
++ watchOS/*)
++ define_xopen_source=no;;
+ # On QNX 6.3.2, defining _XOPEN_SOURCE prevents netdb.h from
+ # defining NI_NUMERICHOST.
+ QNX/6.3.2)
+@@ -577,6 +933,12 @@
+ CONFIGURE_MACOSX_DEPLOYMENT_TARGET=
+ EXPORT_MACOSX_DEPLOYMENT_TARGET='#'
+
++# Record the value of IPHONEOS_DEPLOYMENT_TARGET / TVOS_DEPLOYMENT_TARGET /
++# WATCHOS_DEPLOYMENT_TARGET enforced by the selected host triple.
++AC_SUBST([IPHONEOS_DEPLOYMENT_TARGET])
++AC_SUBST([TVOS_DEPLOYMENT_TARGET])
++AC_SUBST([WATCHOS_DEPLOYMENT_TARGET])
+
-+ - ``arm64_32-apple-watchos`` for ARM64-32 watchOS devices.
-+ - ``aarch64-apple-watchos-simulator`` for the watchOS simulator running on Apple
-+ Silicon devices.
-+ - ``x86_64-apple-watchos-simulator`` for the watchOS simulator running on Intel
-+ devices.
+ # checks for alternative programs
+
+ # compiler flags are generated in two sets, BASECFLAGS and OPT. OPT is just
+@@ -599,6 +961,20 @@
+ CFLAGS=
+ fi
+
++dnl Add the compiler flag for the iOS/tvOS/watchOS minimum supported OS version.
++AS_CASE([$ac_sys_system],
++ [iOS], [
++ AS_VAR_APPEND([CFLAGS], [" -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET}"])
++ AS_VAR_APPEND([LDFLAGS], [" -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET}"])
++ ],[tvOS], [
++ AS_VAR_APPEND([CFLAGS], [" -mtvos-version-min=${TVOS_DEPLOYMENT_TARGET}"])
++ AS_VAR_APPEND([LDFLAGS], [" -mtvos-version-min=${TVOS_DEPLOYMENT_TARGET}"])
++ ],[watchOS], [
++ AS_VAR_APPEND([CFLAGS], [" -mwatchos-version-min=${WATCHOS_DEPLOYMENT_TARGET}"])
++ AS_VAR_APPEND([LDFLAGS], [" -mwatchos-version-min=${WATCHOS_DEPLOYMENT_TARGET}"])
++ ],
++)
+
-+* ``--build`` is the GNU compiler triple for the machine that will be running
-+ the compiler. This is one of:
+ if test "$ac_sys_system" = "Darwin"
+ then
+ # Compiler selection on MacOSX is more complicated than
+@@ -855,7 +1231,42 @@
+ #elif defined(__gnu_hurd__)
+ i386-gnu
+ #elif defined(__APPLE__)
++# include "TargetConditionals.h"
++# if TARGET_OS_IOS
++# if TARGET_OS_SIMULATOR
++# if __x86_64__
++ x86_64-iphonesimulator
++# else
++ arm64-iphonesimulator
++# endif
++# else
++ arm64-iphoneos
++# endif
++# elif TARGET_OS_TV
++# if TARGET_OS_SIMULATOR
++# if __x86_64__
++ x86_64-appletvsimulator
++# else
++ arm64-appletvsimulator
++# endif
++# else
++ arm64-appletvos
++# endif
++# elif TARGET_OS_WATCH
++# if TARGET_OS_SIMULATOR
++# if __x86_64__
++ x86_64-watchsimulator
++# else
++ arm64-watchsimulator
++# endif
++# else
++ arm64_32-watchos
++# endif
++# elif TARGET_OS_OSX
+ darwin
++# else
++# error unknown Apple platform
++# endif
+ #elif defined(__VXWORKS__)
+ vxworks
+ #else
+@@ -872,14 +1283,24 @@
+ fi
+ rm -f conftest.c conftest.out
+
++dnl On some platforms, using a true "triplet" for MULTIARCH would be redundant.
++dnl For example, `arm64-apple-darwin` is redundant, because there isn't a
++dnl non-Apple Darwin. Including the CPU architecture can also be potentially
++dnl redundant - on macOS, for example, it's possible to do a single compile
++dnl pass that includes multiple architectures, so it would be misleading for
++dnl MULTIARCH (and thus the sysconfigdata module name) to include a single CPU
++dnl architecture. PLATFORM_TRIPLET will be a pair or single value for these
++dnl platforms.
+ AC_MSG_CHECKING([for multiarch])
+ AS_CASE([$ac_sys_system],
+ [Darwin*], [MULTIARCH=""],
++ [iOS], [MULTIARCH=""],
++ [tvOS], [MULTIARCH=""],
++ [watchOS], [MULTIARCH=""],
+ [FreeBSD*], [MULTIARCH=""],
+ [MULTIARCH=$($CC --print-multiarch 2>/dev/null)]
+ )
+ AC_SUBST([MULTIARCH])
+-AC_MSG_RESULT([$MULTIARCH])
+
+ if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then
+ if test x$PLATFORM_TRIPLET != x$MULTIARCH; then
+@@ -888,7 +1309,18 @@
+ elif test x$PLATFORM_TRIPLET != x && test x$MULTIARCH = x; then
+ MULTIARCH=$PLATFORM_TRIPLET
+ fi
+-AC_SUBST(PLATFORM_TRIPLET)
++AC_SUBST([PLATFORM_TRIPLET])
++AC_MSG_RESULT([$MULTIARCH])
+
-+ - ``aarch64-apple-darwin`` for Apple Silicon devices.
-+ - ``x86_64-apple-darwin`` for Intel devices.
++dnl Even if we *do* include the CPU architecture in the MULTIARCH value, some
++dnl platforms don't need the CPU architecture in the SOABI tag. These platforms
++dnl will have multiple sysconfig modules (one for each CPU architecture), but
++dnl use a single "fat" binary at runtime. SOABI_PLATFORM is the component of
++dnl the PLATFORM_TRIPLET that will be used in binary module extensions.
++AS_CASE([$ac_sys_system],
++ [iOS|tvOS|watchOS], [SOABI_PLATFORM=`echo "$PLATFORM_TRIPLET" | cut -d '-' -f2`],
++ [SOABI_PLATFORM=$PLATFORM_TRIPLET]
++)
+
+ if test x$MULTIARCH != x; then
+ MULTIARCH_CPPFLAGS="-DMULTIARCH=\\\"$MULTIARCH\\\""
+@@ -1115,17 +1547,25 @@
+
+ AC_MSG_CHECKING(LDLIBRARY)
+
+-# MacOSX framework builds need more magic. LDLIBRARY is the dynamic
++# Apple framework builds need more magic. LDLIBRARY is the dynamic
+ # library that we build, but we do not want to link against it (we
+ # will find it with a -framework option). For this reason there is an
+ # extra variable BLDLIBRARY against which Python and the extension
+ # modules are linked, BLDLIBRARY. This is normally the same as
+-# LDLIBRARY, but empty for MacOSX framework builds.
++# LDLIBRARY, but empty for MacOSX framework builds. iOS does the same,
++# but uses a non-versioned framework layout.
+ if test "$enable_framework"
+ then
+- LDLIBRARY='$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
+- RUNSHARED=DYLD_FRAMEWORK_PATH=`pwd`${DYLD_FRAMEWORK_PATH:+:${DYLD_FRAMEWORK_PATH}}
++ case $ac_sys_system in
++ Darwin)
++ LDLIBRARY='$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)';;
++ iOS|tvOS|watchOS)
++ LDLIBRARY='$(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK)';;
++ *)
++ AC_MSG_ERROR([Unknown platform for framework build]);;
++ esac
+ BLDLIBRARY=''
++ RUNSHARED=DYLD_FRAMEWORK_PATH=`pwd`${DYLD_FRAMEWORK_PATH:+:${DYLD_FRAMEWORK_PATH}}
+ else
+ BLDLIBRARY='$(LDLIBRARY)'
+ fi
+@@ -1136,64 +1576,67 @@
+ AC_DEFINE(Py_ENABLE_SHARED, 1, [Defined if Python is built as a shared library.])
+ case $ac_sys_system in
+ CYGWIN*)
+- LDLIBRARY='libpython$(LDVERSION).dll.a'
+- DLLLIBRARY='libpython$(LDVERSION).dll'
+- ;;
++ LDLIBRARY='libpython$(LDVERSION).dll.a'
++ DLLLIBRARY='libpython$(LDVERSION).dll'
++ ;;
+ SunOS*)
+- LDLIBRARY='libpython$(LDVERSION).so'
+- BLDLIBRARY='-Wl,-R,$(LIBDIR) -L. -lpython$(LDVERSION)'
+- RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
+- INSTSONAME="$LDLIBRARY".$SOVERSION
+- if test "$with_pydebug" != yes
+- then
+- PY3LIBRARY=libpython3.so
+- fi
+- ;;
++ LDLIBRARY='libpython$(LDVERSION).so'
++ BLDLIBRARY='-Wl,-R,$(LIBDIR) -L. -lpython$(LDVERSION)'
++ RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
++ INSTSONAME="$LDLIBRARY".$SOVERSION
++ if test "$with_pydebug" != yes
++ then
++ PY3LIBRARY=libpython3.so
++ fi
++ ;;
+ Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|OpenBSD*|VxWorks*)
+- LDLIBRARY='libpython$(LDVERSION).so'
+- BLDLIBRARY='-L. -lpython$(LDVERSION)'
+- RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
+- INSTSONAME="$LDLIBRARY".$SOVERSION
+- if test "$with_pydebug" != yes
+- then
+- PY3LIBRARY=libpython3.so
+- fi
+- ;;
++ LDLIBRARY='libpython$(LDVERSION).so'
++ BLDLIBRARY='-L. -lpython$(LDVERSION)'
++ RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
++ INSTSONAME="$LDLIBRARY".$SOVERSION
++ if test "$with_pydebug" != yes
++ then
++ PY3LIBRARY=libpython3.so
++ fi
++ ;;
+ hp*|HP*)
+- case `uname -m` in
+- ia64)
+- LDLIBRARY='libpython$(LDVERSION).so'
+- ;;
+- *)
+- LDLIBRARY='libpython$(LDVERSION).sl'
+- ;;
+- esac
+- BLDLIBRARY='-Wl,+b,$(LIBDIR) -L. -lpython$(LDVERSION)'
+- RUNSHARED=SHLIB_PATH=`pwd`${SHLIB_PATH:+:${SHLIB_PATH}}
+- ;;
++ case `uname -m` in
++ ia64)
++ LDLIBRARY='libpython$(LDVERSION).so'
++ ;;
++ *)
++ LDLIBRARY='libpython$(LDVERSION).sl'
++ ;;
++ esac
++ BLDLIBRARY='-Wl,+b,$(LIBDIR) -L. -lpython$(LDVERSION)'
++ RUNSHARED=SHLIB_PATH=`pwd`${SHLIB_PATH:+:${SHLIB_PATH}}
++ ;;
+ Darwin*)
+- LDLIBRARY='libpython$(LDVERSION).dylib'
+- BLDLIBRARY='-L. -lpython$(LDVERSION)'
+- RUNSHARED=DYLD_LIBRARY_PATH=`pwd`${DYLD_LIBRARY_PATH:+:${DYLD_LIBRARY_PATH}}
+- ;;
++ LDLIBRARY='libpython$(LDVERSION).dylib'
++ BLDLIBRARY='-L. -lpython$(LDVERSION)'
++ RUNSHARED=DYLD_LIBRARY_PATH=`pwd`${DYLD_LIBRARY_PATH:+:${DYLD_LIBRARY_PATH}}
++ ;;
++ iOS|tvOS|watchOS)
++ LDLIBRARY='libpython$(LDVERSION).dylib'
++ ;;
+ AIX*)
+- LDLIBRARY='libpython$(LDVERSION).so'
+- RUNSHARED=LIBPATH=`pwd`${LIBPATH:+:${LIBPATH}}
+- ;;
++ LDLIBRARY='libpython$(LDVERSION).so'
++ RUNSHARED=LIBPATH=`pwd`${LIBPATH:+:${LIBPATH}}
++ ;;
+
+ esac
+ else # shared is disabled
+ PY_ENABLE_SHARED=0
+ case $ac_sys_system in
+ CYGWIN*)
+- BLDLIBRARY='$(LIBRARY)'
+- LDLIBRARY='libpython$(LDVERSION).dll.a'
+- ;;
++ BLDLIBRARY='$(LIBRARY)'
++ LDLIBRARY='libpython$(LDVERSION).dll.a'
++ ;;
+ esac
+ fi
+
+ if test "$cross_compiling" = yes; then
+- RUNSHARED=
++ RUNSHARED=
+ fi
+
+ AC_MSG_RESULT($LDLIBRARY)
+@@ -1210,11 +1653,16 @@
+
+ AC_CHECK_TOOLS([READELF], [readelf], [:])
+ if test "$cross_compiling" = yes; then
+- case "$READELF" in
+- readelf|:)
+- AC_MSG_ERROR([readelf for the host is required for cross builds])
+- ;;
+- esac
++ case "$ac_sys_system" in
++ iOS|tvOS|watchOS) ;;
++ *)
++ case "$READELF" in
++ readelf|:)
++ AC_MSG_ERROR([readelf for the host is required for cross builds])
++ ;;
++ esac
++ ;;
++ esac
+ fi
+ AC_SUBST(READELF)
+
+@@ -2712,6 +3160,11 @@
+ BLDSHARED="$LDSHARED"
+ fi
+ ;;
++ iOS/*|tvOS/*|watchOS/*)
++ LDSHARED='$(CC) -dynamiclib -F . -framework $(PYTHONFRAMEWORK)'
++ LDCXXSHARED='$(CXX) -dynamiclib -F . -framework $(PYTHONFRAMEWORK)'
++ BLDSHARED="$LDSHARED"
++ ;;
+ Linux*|GNU*|QNX*|VxWorks*)
+ LDSHARED='$(CC) -shared'
+ LDCXXSHARED='$(CXX) -shared';;
+@@ -2809,30 +3262,34 @@
+ Linux-android*) LINKFORSHARED="-pie -Xlinker -export-dynamic";;
+ Linux*|GNU*) LINKFORSHARED="-Xlinker -export-dynamic";;
+ # -u libsys_s pulls in all symbols in libsys
+- Darwin/*)
++ Darwin/*|iOS/*|tvOS/*|watchOS/*)
+ LINKFORSHARED="$extra_undefs -framework CoreFoundation"
+
+ # Issue #18075: the default maximum stack size (8MBytes) is too
+ # small for the default recursion limit. Increase the stack size
+ # to ensure that tests don't crash
+- stack_size="1000000" # 16 MB
+- if test "$with_ubsan" = "yes"
+- then
+- # Undefined behavior sanitizer requires an even deeper stack
+- stack_size="4000000" # 64 MB
+- fi
++ stack_size="1000000" # 16 MB
++ if test "$with_ubsan" = "yes"
++ then
++ # Undefined behavior sanitizer requires an even deeper stack
++ stack_size="4000000" # 64 MB
++ fi
+
+- LINKFORSHARED="-Wl,-stack_size,$stack_size $LINKFORSHARED"
++ AC_DEFINE_UNQUOTED([THREAD_STACK_SIZE],
++ [0x$stack_size],
++ [Custom thread stack size depending on chosen sanitizer runtimes.])
+
+- AC_DEFINE_UNQUOTED(THREAD_STACK_SIZE,
+- 0x$stack_size,
+- [Custom thread stack size depending on chosen sanitizer runtimes.])
++ if test $ac_sys_system = "Darwin"; then
++ LINKFORSHARED="-Wl,-stack_size,$stack_size $LINKFORSHARED"
+
+- if test "$enable_framework"
+- then
+- LINKFORSHARED="$LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
++ if test "$enable_framework"; then
++ LINKFORSHARED="$LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
++ fi
++ LINKFORSHARED="$LINKFORSHARED"
++ elif test "$ac_sys_system" = "iOS" -o "$ac_sys_system" = "tvOS" -o "$ac_sys_system" = "watchOS"; then
++ LINKFORSHARED="-Wl,-stack_size,$stack_size $LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK)'
+ fi
+- LINKFORSHARED="$LINKFORSHARED";;
++ ;;
+ OpenUNIX*|UnixWare*) LINKFORSHARED="-Wl,-Bexport";;
+ SCO_SV*) LINKFORSHARED="-Wl,-Bexport";;
+ ReliantUNIX*) LINKFORSHARED="-W1 -Blargedynsym";;
+@@ -3104,7 +3561,7 @@
+ AC_ARG_WITH(system_ffi,
+ AS_HELP_STRING([--with-system-ffi], [build _ctypes module using an installed ffi library, see Doc/library/ctypes.rst (default is system-dependent)]),,,)
+
+-if test "$ac_sys_system" = "Darwin"
++if test "$ac_sys_system" = "Darwin" -o "$ac_sys_system" = "iOS" -o "$ac_sys_system" = "tvOS" -o "$ac_sys_system" = "watchOS"
+ then
+ case "$with_system_ffi" in
+ "")
+@@ -3129,9 +3586,11 @@
+ if test "$with_system_ffi" = "yes" && test -n "$PKG_CONFIG"; then
+ LIBFFI_INCLUDEDIR="`"$PKG_CONFIG" libffi --cflags-only-I 2>/dev/null | sed -e 's/^-I//;s/ *$//'`"
+ else
+- LIBFFI_INCLUDEDIR=""
++ LIBFFI_INCLUDEDIR="${LIBFFI_INCLUDEDIR}"
+ fi
+ AC_SUBST(LIBFFI_INCLUDEDIR)
++AC_SUBST(LIBFFI_LIBDIR)
++AC_SUBST(LIBFFI_LIB)
+
+ # Check for use of the system libmpdec library
+ AC_MSG_CHECKING(for --with-system-libmpdec)
+@@ -3708,18 +4167,18 @@
+
+ # checks for library functions
+ AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \
+- clock confstr close_range copy_file_range ctermid dup3 execv explicit_bzero \
++ clock confstr close_range copy_file_range ctermid dup3 explicit_bzero \
+ explicit_memset faccessat fchmod fchmodat fchown fchownat \
+- fdwalk fexecve fdopendir fork fpathconf fstatat ftime ftruncate futimesat \
+- futimens futimes gai_strerror getentropy \
++ fdwalk fexecve fdopendir fpathconf fstatat ftime ftruncate futimesat \
++ futimens futimes gai_strerror \
+ getgrgid_r getgrnam_r \
+- getgrouplist getgroups getlogin getloadavg getpeername getpgid getpid \
++ getgrouplist getlogin getloadavg getpeername getpgid getpid \
+ getpriority getresuid getresgid getpwent getpwnam_r getpwuid_r getspnam getspent getsid getwd \
+ if_nameindex \
+ initgroups kill killpg lchown lockf linkat lstat lutimes mmap \
+ memrchr mbrtowc mkdirat mkfifo \
+ madvise mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \
+- posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \
++ posix_fallocate posix_fadvise pread preadv preadv2 \
+ pthread_condattr_setclock pthread_init pthread_kill pwrite pwritev pwritev2 \
+ readlink readlinkat readv realpath renameat \
+ sem_open sem_timedwait sem_clockwait sem_getvalue sem_unlink sendfile setegid seteuid \
+@@ -3727,7 +4186,7 @@
+ setlocale setregid setreuid setresuid setresgid setsid setpgid setpgrp setpriority setuid setvbuf \
+ sched_get_priority_max sched_setaffinity sched_setscheduler sched_setparam \
+ sched_rr_get_interval \
+- sigaction sigaltstack sigfillset siginterrupt sigpending sigrelse \
++ sigaction sigfillset siginterrupt sigpending sigrelse \
+ sigtimedwait sigwait sigwaitinfo snprintf splice strftime strlcpy strsignal symlinkat sync \
+ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \
+ truncate uname unlinkat utimensat utimes vfork waitid waitpid wait3 wait4 \
+@@ -3740,6 +4199,22 @@
+ AC_CHECK_FUNCS(lchmod)
+ fi
+
++# iOS/tvOS/watchOS define some system methods that can be linked (so they are
++# found by configure), but either raise a compilation error (because the
++# header definition prevents usage - autoconf doesn't use the headers), or
++# raise an error if used at runtime. Force these symbols off.
++if test "$ac_sys_system" != "iOS" -a "$ac_sys_system" != "tvOS" -a "$ac_sys_system" != "watchOS" ; then
++ AC_CHECK_FUNCS([ getentropy getgroups system ])
++fi
+
-+* ``/path/to/python.exe`` is the path to a Python binary on the machine that
-+ will be running the compiler. This is needed because the Python compilation
-+ process involves running some Python code. On a normal desktop build of
-+ Python, you can compile a python interpreter and then use that interpreter to
-+ run Python code. However, the binaries produced for watchOS won't run on macOS, so
-+ you need to provide an external Python interpreter. This interpreter must be
-+ the version as the Python that is being compiled.
++# tvOS/watchOS have some additional methods that can be found, but not used.
++if test "$ac_sys_system" != "tvOS" -a "$ac_sys_system" != "watchOS" ; then
++ AC_CHECK_FUNCS([ \
++ execv fork posix_spawn posix_spawnp \
++ sigaltstack \
++ ])
++fi
+
-+Using a framework-based Python on watchOS
-+======================================
---- /dev/null
-+++ b/watchOS/Resources/Info.plist.in
-@@ -0,0 +1,34 @@
-+
-+
-+
-+
-+ CFBundleDevelopmentRegion
-+ en
-+ CFBundleExecutable
-+ Python
-+ CFBundleGetInfoString
-+ Python Runtime and Library
-+ CFBundleIdentifier
-+ @PYTHONFRAMEWORKIDENTIFIER@
-+ CFBundleInfoDictionaryVersion
-+ 6.0
-+ CFBundleName
-+ Python
-+ CFBundlePackageType
-+ FMWK
-+ CFBundleShortVersionString
-+ %VERSION%
-+ CFBundleLongVersionString
-+ %VERSION%, (c) 2001-2023 Python Software Foundation.
-+ CFBundleSignature
-+ ????
-+ CFBundleVersion
-+ %VERSION%
-+ CFBundleSupportedPlatforms
-+
-+ watchOS
-+
-+ MinimumOSVersion
-+ @WATCHOS_DEPLOYMENT_TARGET@
-+
-+
+ AC_CHECK_DECL(dirfd,
+ AC_DEFINE(HAVE_DIRFD, 1,
+ Define if you have the 'dirfd' function or macro.), ,
+@@ -4025,20 +4500,23 @@
+ [AC_MSG_RESULT(no)
+ ])
+
+-# check for openpty and forkpty
+-
+-AC_CHECK_FUNCS(openpty,,
+- AC_CHECK_LIB(util,openpty,
+- [AC_DEFINE(HAVE_OPENPTY) LIBS="$LIBS -lutil"],
+- AC_CHECK_LIB(bsd,openpty, [AC_DEFINE(HAVE_OPENPTY) LIBS="$LIBS -lbsd"])
+- )
+-)
+-AC_CHECK_FUNCS(forkpty,,
+- AC_CHECK_LIB(util,forkpty,
+- [AC_DEFINE(HAVE_FORKPTY) LIBS="$LIBS -lutil"],
+- AC_CHECK_LIB(bsd,forkpty, [AC_DEFINE(HAVE_FORKPTY) LIBS="$LIBS -lbsd"])
+- )
+-)
++# check for openpty, login_tty, and forkpty
++# tvOS/watchOS have functions for tty, but can't use them
++if test "$ac_sys_system" != "tvOS" -a "$ac_sys_system" != "watchOS" ; then
++ AC_CHECK_FUNCS([openpty], [],
++ [AC_CHECK_LIB([util], [openpty],
++ [AC_DEFINE([HAVE_OPENPTY]) LIBS="$LIBS -lutil"],
++ [AC_CHECK_LIB([bsd], [openpty],
++ [AC_DEFINE([HAVE_OPENPTY]) LIBS="$LIBS -lbsd"])])])
++ AC_SEARCH_LIBS([login_tty], [util],
++ [AC_DEFINE([HAVE_LOGIN_TTY], [1], [Define to 1 if you have the `login_tty' function.])]
++ )
++ AC_CHECK_FUNCS([forkpty], [],
++ [AC_CHECK_LIB([util], [forkpty],
++ [AC_DEFINE([HAVE_FORKPTY]) LIBS="$LIBS -lutil"],
++ [AC_CHECK_LIB([bsd], [forkpty],
++ [AC_DEFINE([HAVE_FORKPTY]) LIBS="$LIBS -lbsd"])])])
++fi
+
+ # check for long file support functions
+ AC_CHECK_FUNCS(fseek64 fseeko fstatvfs ftell64 ftello statvfs)
+@@ -4087,11 +4565,17 @@
+ ])
+ ])
+
+-AC_CHECK_FUNCS(clock_settime, [], [
+- AC_CHECK_LIB(rt, clock_settime, [
+- AC_DEFINE(HAVE_CLOCK_SETTIME, 1)
+- ])
+-])
++# On iOS, tvOS and watchOS, clock_settime can be linked (so it is found by
++# configure), but when used in an unprivileged process, it crashes rather than
++# returning an error. Force the symbol off.
++if test "$ac_sys_system" != "iOS" -a "$ac_sys_system" != "tvOS" -a "$ac_sys_system" != "watchOS"
++then
++ AC_CHECK_FUNCS([clock_settime], [], [
++ AC_CHECK_LIB([rt], [clock_settime], [
++ AC_DEFINE([HAVE_CLOCK_SETTIME], [1])
++ ])
++ ])
++fi
+
+ AC_MSG_CHECKING(for major, minor, and makedev)
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+@@ -4221,7 +4705,9 @@
+ [ac_cv_buggy_getaddrinfo=no],
+ [ac_cv_buggy_getaddrinfo=yes],
+ [
+-if test "${enable_ipv6+set}" = set; then
++if test "$ac_sys_system" = "Linux-android" -o "$ac_sys_system" = "iOS" -o "$ac_sys_system" = "tvOS" -o "$ac_sys_system" = "watchOS"; then
++ ac_cv_buggy_getaddrinfo="no"
++elif test "${enable_ipv6+set}" = set; then
+ ac_cv_buggy_getaddrinfo="no -- configured with --(en|dis)able-ipv6"
+ else
+ ac_cv_buggy_getaddrinfo=yes
+@@ -4821,19 +5307,19 @@
+ #
+ # In Python 3.2 and older, --with-wide-unicode added a 'u' flag.
+ # In Python 3.7 and older, --with-pymalloc added a 'm' flag.
+-AC_SUBST(SOABI)
+-AC_MSG_CHECKING(ABIFLAGS)
+-AC_MSG_RESULT($ABIFLAGS)
+-AC_MSG_CHECKING(SOABI)
+-SOABI='cpython-'`echo $VERSION | tr -d .`${ABIFLAGS}${PLATFORM_TRIPLET:+-$PLATFORM_TRIPLET}
+-AC_MSG_RESULT($SOABI)
++AC_SUBST([SOABI])
++AC_MSG_CHECKING([ABIFLAGS])
++AC_MSG_RESULT([$ABIFLAGS])
++AC_MSG_CHECKING([SOABI])
++SOABI='cpython-'`echo $VERSION | tr -d .`${ABIFLAGS}${SOABI_PLATFORM:+-$SOABI_PLATFORM}
++AC_MSG_RESULT([$SOABI])
+
+ # Release and debug (Py_DEBUG) ABI are compatible, but not Py_TRACE_REFS ABI
+ if test "$Py_DEBUG" = 'true' -a "$with_trace_refs" != "yes"; then
+ # Similar to SOABI but remove "d" flag from ABIFLAGS
+- AC_SUBST(ALT_SOABI)
+- ALT_SOABI='cpython-'`echo $VERSION | tr -d .``echo $ABIFLAGS | tr -d d`${PLATFORM_TRIPLET:+-$PLATFORM_TRIPLET}
+- AC_DEFINE_UNQUOTED(ALT_SOABI, "${ALT_SOABI}",
++ AC_SUBST([ALT_SOABI])
++ ALT_SOABI='cpython-'`echo $VERSION | tr -d .``echo $ABIFLAGS | tr -d d`${SOABI_PLATFORM:+-$SOABI_PLATFORM}
++ AC_DEFINE_UNQUOTED([ALT_SOABI], ["${ALT_SOABI}"],
+ [Alternative SOABI used in debug build to load C extensions built in release mode])
+ fi
+
+@@ -5399,28 +5885,35 @@
+ AC_MSG_NOTICE([checking for device files])
+
+ dnl NOTE: Inform user how to proceed with files when cross compiling.
+-if test "x$cross_compiling" = xyes; then
+- if test "${ac_cv_file__dev_ptmx+set}" != set; then
+- AC_MSG_CHECKING([for /dev/ptmx])
+- AC_MSG_RESULT([not set])
+- AC_MSG_ERROR([set ac_cv_file__dev_ptmx to yes/no in your CONFIG_SITE file when cross compiling])
+- fi
+- if test "${ac_cv_file__dev_ptc+set}" != set; then
+- AC_MSG_CHECKING([for /dev/ptc])
+- AC_MSG_RESULT([not set])
+- AC_MSG_ERROR([set ac_cv_file__dev_ptc to yes/no in your CONFIG_SITE file when cross compiling])
++dnl iOS cross-compile builds are predictable; they won't ever
++dnl have /dev/ptmx or /dev/ptc, so we can set them explicitly.
++if test "$ac_sys_system" = "iOS" -o "$ac_sys_system" = "tvOS" -o "$ac_sys_system" = "watchOS" ; then
++ ac_cv_file__dev_ptmx=no
++ ac_cv_file__dev_ptc=no
++else
++ if test "x$cross_compiling" = xyes; then
++ if test "${ac_cv_file__dev_ptmx+set}" != set; then
++ AC_MSG_CHECKING([for /dev/ptmx])
++ AC_MSG_RESULT([not set])
++ AC_MSG_ERROR([set ac_cv_file__dev_ptmx to yes/no in your CONFIG_SITE file when cross compiling])
++ fi
++ if test "${ac_cv_file__dev_ptc+set}" != set; then
++ AC_MSG_CHECKING([for /dev/ptc])
++ AC_MSG_RESULT([not set])
++ AC_MSG_ERROR([set ac_cv_file__dev_ptc to yes/no in your CONFIG_SITE file when cross compiling])
++ fi
+ fi
+-fi
+
+-AC_CHECK_FILE(/dev/ptmx, [], [])
+-if test "x$ac_cv_file__dev_ptmx" = xyes; then
+- AC_DEFINE(HAVE_DEV_PTMX, 1,
+- [Define to 1 if you have the /dev/ptmx device file.])
+-fi
+-AC_CHECK_FILE(/dev/ptc, [], [])
+-if test "x$ac_cv_file__dev_ptc" = xyes; then
+- AC_DEFINE(HAVE_DEV_PTC, 1,
+- [Define to 1 if you have the /dev/ptc device file.])
++ AC_CHECK_FILE([/dev/ptmx], [], [])
++ if test "x$ac_cv_file__dev_ptmx" = xyes; then
++ AC_DEFINE([HAVE_DEV_PTMX], [1],
++ [Define to 1 if you have the /dev/ptmx device file.])
++ fi
++ AC_CHECK_FILE([/dev/ptc], [], [])
++ if test "x$ac_cv_file__dev_ptc" = xyes; then
++ AC_DEFINE([HAVE_DEV_PTC], [1],
++ [Define to 1 if you have the /dev/ptc device file.])
++ fi
+ fi
+
+ if test $ac_sys_system = Darwin
+@@ -5713,7 +6206,12 @@
+ [AS_HELP_STRING([--with-ensurepip@<:@=install|upgrade|no@:>@],
+ ["install" or "upgrade" using bundled pip (default is upgrade)])],
+ [],
+- [with_ensurepip=upgrade])
++ [
++ AS_CASE([$ac_sys_system],
++ [iOS|tvOS|watchOS], [with_ensurepip=no],
++ [with_ensurepip=upgrade]
++ )
++ ])
+ AS_CASE($with_ensurepip,
+ [yes|upgrade],[ENSUREPIP=upgrade],
+ [install],[ENSUREPIP=install],
--- /dev/null
-+++ b/watchOS/Resources/bin/arm64-apple-watchos-simulator-ar
++++ b/iOS/Resources/bin/arm64-apple-ios-ar
@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk watchsimulator${WATCHOS_SDK_VERSION} ar "$@"
++#!/bin/sh
++xcrun --sdk iphoneos${IOS_SDK_VERSION} ar "$@"
--- /dev/null
-+++ b/watchOS/Resources/bin/arm64-apple-watchos-simulator-clang
++++ b/iOS/Resources/bin/arm64-apple-ios-clang
@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk watchsimulator${WATCHOS_SDK_VERSION} clang -target arm64-apple-watchos-simulator "$@"
++#!/bin/sh
++xcrun --sdk iphoneos${IOS_SDK_VERSION} clang -target arm64-apple-ios${IPHONEOS_DEPLOYMENT_TARGET} "$@"
--- /dev/null
-+++ b/watchOS/Resources/bin/arm64-apple-watchos-simulator-clang++
++++ b/iOS/Resources/bin/arm64-apple-ios-clang++
@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk watchsimulator${WATCHOS_SDK_VERSION} clang++ -target arm64-apple-watchos-simulator "$@"
++#!/bin/sh
++xcrun --sdk iphoneos${IOS_SDK_VERSION} clang++ -target arm64-apple-ios${IPHONEOS_DEPLOYMENT_TARGET} "$@"
--- /dev/null
-+++ b/watchOS/Resources/bin/arm64-apple-watchos-simulator-cpp
++++ b/iOS/Resources/bin/arm64-apple-ios-cpp
@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk watchsimulator clang -target arm64-apple-watchos-simulator -E "$@"
++#!/bin/sh
++xcrun --sdk iphoneos${IOS_SDK_VERSION} clang -target arm64-apple-ios${IPHONEOS_DEPLOYMENT_TARGET} -E "$@"
--- /dev/null
-+++ b/watchOS/Resources/bin/arm64_32-apple-watchos-ar
++++ b/iOS/Resources/bin/arm64-apple-ios-simulator-ar
@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk watchos${WATCHOS_SDK_VERSION} ar "$@"
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} ar "$@"
--- /dev/null
-+++ b/watchOS/Resources/bin/arm64_32-apple-watchos-clang
++++ b/iOS/Resources/bin/arm64-apple-ios-simulator-clang
@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk watchos${WATCHOS_SDK_VERSION} clang -target arm64_32-apple-watchos "$@"
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} clang -target arm64-apple-ios${IPHONEOS_DEPLOYMENT_TARGET}-simulator "$@"
--- /dev/null
-+++ b/watchOS/Resources/bin/arm64_32-apple-watchos-clang++
++++ b/iOS/Resources/bin/arm64-apple-ios-simulator-clang++
@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk watchos${WATCHOS_SDK_VERSION} clang++ -target arm64_32-apple-watchos "$@"
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} clang++ -target arm64-apple-ios${IPHONEOS_DEPLOYMENT_TARGET}-simulator "$@"
--- /dev/null
-+++ b/watchOS/Resources/bin/arm64_32-apple-watchos-cpp
++++ b/iOS/Resources/bin/arm64-apple-ios-simulator-cpp
@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk watchos${WATCHOS_SDK_VERSION} clang -target arm64_32-apple-watchos -E "$@"
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} clang -target arm64-apple-ios${IPHONEOS_DEPLOYMENT_TARGET}-simulator -E "$@"
--- /dev/null
-+++ b/watchOS/Resources/bin/x86_64-apple-watchos-simulator-ar
++++ b/iOS/Resources/bin/arm64-apple-ios-simulator-strip
@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk watchsimulator${WATCHOS_SDK_VERSION} ar "$@"
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} strip -arch arm64 "$@"
--- /dev/null
-+++ b/watchOS/Resources/bin/x86_64-apple-watchos-simulator-clang
++++ b/iOS/Resources/bin/arm64-apple-ios-strip
@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk watchsimulator${WATCHOS_SDK_VERSION} clang -target x86_64-apple-watchos-simulator "$@"
++#!/bin/sh
++xcrun --sdk iphoneos${IOS_SDK_VERSION} strip -arch arm64 "$@"
--- /dev/null
-+++ b/watchOS/Resources/bin/x86_64-apple-watchos-simulator-clang++
++++ b/iOS/Resources/bin/x86_64-apple-ios-simulator-ar
@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk watchsimulator${WATCHOS_SDK_VERSION} clang++ -target x86_64-apple-watchos-simulator "$@"
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} ar "$@"
--- /dev/null
-+++ b/watchOS/Resources/bin/x86_64-apple-watchos-simulator-cpp
++++ b/iOS/Resources/bin/x86_64-apple-ios-simulator-clang
@@ -0,0 +1,2 @@
-+#!/bin/bash
-+xcrun --sdk watchsimulator${WATCHOS_SDK_VERSION} clang -target x86_64-apple-watchos-simulator -E "$@"
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} clang -target x86_64-apple-ios${IPHONEOS_DEPLOYMENT_TARGET}-simulator "$@"
--- /dev/null
-+++ b/watchOS/Resources/dylib-Info-template.plist
-@@ -0,0 +1,26 @@
-+
-+
-+
-+
-+ CFBundleDevelopmentRegion
-+ en
-+ CFBundleExecutable
-+
-+ CFBundleIdentifier
-+
-+ CFBundleInfoDictionaryVersion
-+ 6.0
-+ CFBundlePackageType
-+ APPL
-+ CFBundleShortVersionString
-+ 1.0
-+ CFBundleSupportedPlatforms
-+
-+ watchOS
-+
-+ MinimumOSVersion
-+ 4.0
-+ CFBundleVersion
-+ 1
-+
-+
++++ b/iOS/Resources/bin/x86_64-apple-ios-simulator-clang++
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} clang++ -target x86_64-apple-ios${IPHONEOS_DEPLOYMENT_TARGET}-simulator "$@"
--- /dev/null
-+++ b/watchOS/Resources/pyconfig.h
-@@ -0,0 +1,11 @@
-+#ifdef __arm64__
-+# ifdef __LP64__
-+#include "pyconfig-arm64.h"
-+# else
-+#include "pyconfig-arm64_32.h"
-+# endif
-+#endif
++++ b/iOS/Resources/bin/x86_64-apple-ios-simulator-cpp
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} clang -target x86_64-apple-ios${IPHONEOS_DEPLOYMENT_TARGET}-simulator -E "$@"
+--- /dev/null
++++ b/iOS/Resources/bin/x86_64-apple-ios-simulator-strip
+@@ -0,0 +1,2 @@
++#!/bin/sh
++xcrun --sdk iphonesimulator${IOS_SDK_VERSION} strip -arch x86_64 "$@"
+diff --git a/pyconfig.h.in b/pyconfig.h.in
+index 57c84e5f8fa..b40023b5f61 100644
+--- a/pyconfig.h.in
++++ b/pyconfig.h.in
+@@ -1122,6 +1122,9 @@
+ /* Define to 1 if you have the `sysconf' function. */
+ #undef HAVE_SYSCONF
+
++/* Define to 1 if you have the `system' function. */
++#undef HAVE_SYSTEM
+
-+#ifdef __x86_64__
-+#include "pyconfig-x86_64.h"
-+#endif
+ /* Define to 1 if you have the header file. */
+ #undef HAVE_SYSEXITS_H
+
+@@ -1699,4 +1702,3 @@
+ #endif
+
+ #endif /*Py_PYCONFIG_H*/
+-
+diff --git a/setup.py b/setup.py
+index a39610a1c7c..09ea06965e9 100644
+--- a/setup.py
++++ b/setup.py
+@@ -84,6 +84,9 @@
+ MS_WINDOWS = (HOST_PLATFORM == 'win32')
+ CYGWIN = (HOST_PLATFORM == 'cygwin')
+ MACOS = (HOST_PLATFORM == 'darwin')
++IOS = HOST_PLATFORM.startswith('ios-')
++TVOS = HOST_PLATFORM.startswith('tvos-')
++WATCHOS = HOST_PLATFORM.startswith('watchos-')
+ AIX = (HOST_PLATFORM.startswith('aix'))
+ VXWORKS = ('vxworks' in HOST_PLATFORM)
+ CC = os.environ.get("CC")
+@@ -163,16 +166,20 @@
+ for var_name in make_vars:
+ var = sysconfig.get_config_var(var_name)
+ if var is not None:
+- m = re.search(r'--sysroot=([^"]\S*|"[^"]+")', var)
+- if m is not None:
+- sysroot = m.group(1).strip('"')
+- for subdir in subdirs:
+- if os.path.isabs(subdir):
+- subdir = subdir[1:]
+- path = os.path.join(sysroot, subdir)
+- if os.path.isdir(path):
+- dirs.append(path)
+- break
++ for pattern in [
++ r'-isysroot\s*([^"]\S*|"[^"]+")',
++ r'--sysroot=([^"]\S*|"[^"]+")',
++ ]:
++ m = re.search(pattern, var)
++ if m is not None:
++ sysroot = m.group(1).strip('"')
++ for subdir in subdirs:
++ if os.path.isabs(subdir):
++ subdir = subdir[1:]
++ path = os.path.join(sysroot, subdir)
++ if os.path.isdir(path):
++ dirs.append(path)
++ break
+ return dirs
+
+
+@@ -1035,8 +1042,10 @@
+ self.add(Extension('_csv', ['_csv.c']))
+
+ # POSIX subprocess module helper.
+- self.add(Extension('_posixsubprocess', ['_posixsubprocess.c'],
+- extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
++ # iOS/tvOS/watchOS doesn't have this.
++ if not (IOS or TVOS or WATCHOS):
++ self.add(Extension('_posixsubprocess', ['_posixsubprocess.c'],
++ extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
+
+ def detect_test_extensions(self):
+ # Python C API test module
+@@ -1526,6 +1535,15 @@
+ ],
+ libraries=dblibs)
+ break
++
++ # iOS, tvOS and watchOS have DBM in the system libraries.
++ if IOS or TVOS or WATCHOS:
++ dbmext = Extension('_dbm', ['_dbmmodule.c'],
++ define_macros=[
++ ('HAVE_NDBM_H',None),
++ ],
++ libraries=['dbm'])
++
+ if dbmext is not None:
+ self.add(dbmext)
+ else:
+@@ -1605,7 +1623,8 @@
+ if sqlite_libfile:
+ sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
+
+- if sqlite_incdir and sqlite_libdir:
++ # iOS, tvOS and watchOS provide SQLITE as part of the system libraries.
++ if (sqlite_incdir and sqlite_libdir) or IOS or TVOS or WATCHOS:
+ sqlite_srcs = ['_sqlite/cache.c',
+ '_sqlite/connection.c',
+ '_sqlite/cursor.c',
+@@ -1638,7 +1657,7 @@
+ # Only include the directory where sqlite was found if it does
+ # not already exist in set include directories, otherwise you
+ # can end up with a bad search path order.
+- if sqlite_incdir not in self.compiler.include_dirs:
++ if sqlite_incdir and sqlite_incdir not in self.compiler.include_dirs:
+ include_dirs.append(sqlite_incdir)
+ # avoid a runtime library path for a system library dir
+ if sqlite_libdir and sqlite_libdir[0] in self.lib_dirs:
+@@ -1721,6 +1740,9 @@
+ self.missing.append('zlib')
+ else:
+ self.missing.append('zlib')
++ elif IOS or TVOS or WATCHOS:
++ # iOS/tvOS/watchOS include zlib in the system libraries.
++ self.add(Extension('zlib', ['zlibmodule.c'], libraries=['z']))
+ else:
+ self.missing.append('zlib')
+
+@@ -2246,6 +2268,11 @@
+ extra_compile_args.append('-DMACOSX')
+ include_dirs.append('_ctypes/darwin')
+
++ elif IOS or TVOS or WATCHOS:
++ sources.append('_ctypes/malloc_closure.c')
++ extra_compile_args.append('-DUSING_MALLOC_CLOSURE_DOT_C')
++ include_dirs.append('_ctypes/darwin')
++
+ elif HOST_PLATFORM == 'sunos5':
+ # XXX This shouldn't be necessary; it appears that some
+ # of the assembler code is non-PIC (i.e. it has relocations
+@@ -2275,7 +2302,8 @@
+ libraries=['m']))
+
+ ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR")
+- ffi_lib = None
++ ffi_lib_dir = sysconfig.get_config_var("LIBFFI_LIBDIR")
++ ffi_lib = sysconfig.get_config_var("LIBFFI_LIB")
+
+ ffi_inc_dirs = self.inc_dirs.copy()
+ if MACOS:
+@@ -2304,6 +2332,7 @@
+ for lib_name in ('ffi', 'ffi_pic'):
+ if (self.compiler.find_library_file(self.lib_dirs, lib_name)):
+ ffi_lib = lib_name
++ self.use_system_libffi = True
+ break
+
+ if ffi_inc and ffi_lib:
+@@ -2317,7 +2346,8 @@
+
+ ext.include_dirs.append(ffi_inc)
+ ext.libraries.append(ffi_lib)
+- self.use_system_libffi = True
++ if ffi_lib_dir:
++ ext.library_dirs.append(ffi_lib_dir)
+
+ if sysconfig.get_config_var('HAVE_LIBDL'):
+ # for dlopen, see bpo-32647
diff --git a/patch/Python/_cross_target.py.tmpl b/patch/Python/_cross_target.py.tmpl
index 5f822e2..6b75958 100644
--- a/patch/Python/_cross_target.py.tmpl
+++ b/patch/Python/_cross_target.py.tmpl
@@ -12,6 +12,8 @@ import sysconfig
sys.cross_compiling = True
sys.platform = "{{platform}}"
sys.implementation._multiarch = "{{arch}}-{{sdk}}"
+sys.base_prefix = sysconfig.get_config_var("prefix")
+sys.base_exec_prefix = sysconfig.get_config_var("prefix")
###########################################################################
# subprocess module patches
@@ -74,5 +76,10 @@ def cross_get_sysconfigdata_name():
sysconfig.get_platform = cross_get_platform
sysconfig._get_sysconfigdata_name = cross_get_sysconfigdata_name
+# Ensure module-level values cached at time of import are updated.
+sysconfig._BASE_PREFIX = sys.base_prefix
+sysconfig._BASE_EXEC_PREFIX = sys.base_exec_prefix
+
# Force sysconfig data to be loaded (and cached).
-sysconfig._init_config_vars()
+sysconfig._CONFIG_VARS = None
+sysconfig.get_config_vars()
diff --git a/tests/test_cross_env.py b/tests/test_cross_env.py
new file mode 100644
index 0000000..24b9045
--- /dev/null
+++ b/tests/test_cross_env.py
@@ -0,0 +1,98 @@
+import os
+import platform
+import sys
+import sysconfig
+from pathlib import Path
+
+import pytest
+
+# To run these tests, the following three environment variables must be set,
+# reflecting the cross-platform environment that is in effect.'
+PYTHON_CROSS_PLATFORM = os.getenv("PYTHON_CROSS_PLATFORM", "unknown")
+PYTHON_CROSS_SLICE = os.getenv("PYTHON_CROSS_SLICE", "unknown")
+PYTHON_CROSS_MULTIARCH = os.getenv("PYTHON_CROSS_MULTIARCH", "unknown")
+
+# Determine some file system anchor points for the tests
+# Assumes that the tests are run in a virtual environment named
+# `cross-venv`,
+VENV_PREFIX = os.getenv("VIRTUAL_ENV", Path(__file__).parent.parent / "cross-venv")
+default_support_base = (
+ f"support/{sys.version_info.major}.{sys.version_info.minor}/{PYTHON_CROSS_PLATFORM}"
+)
+SUPPORT_PREFIX = (
+ Path(__file__).parent.parent
+ / os.getenv("PYTHON_SUPPORT_BASE", default_support_base)
+ / "Python.xcframework"
+ / PYTHON_CROSS_SLICE
+)
+
+
+###########################################################################
+# sys
+###########################################################################
+
+
+def test_sys_platform():
+ assert sys.platform == PYTHON_CROSS_PLATFORM.lower()
+
+
+def test_sys_cross_compiling():
+ assert sys.cross_compiling
+
+
+def test_sys_multiarch():
+ assert sys.implementation._multiarch == PYTHON_CROSS_MULTIARCH
+
+
+def test_sys_base_prefix():
+ assert Path(sys.base_prefix) == SUPPORT_PREFIX
+
+
+def test_sys_base_exec_prefix():
+ assert Path(sys.base_exec_prefix) == SUPPORT_PREFIX
+
+
+###########################################################################
+# platform
+###########################################################################
+
+
+def test_platform_system():
+ assert platform.system() == PYTHON_CROSS_PLATFORM
+
+
+###########################################################################
+# sysconfig
+###########################################################################
+
+
+def test_sysconfig_get_platform():
+ parts = sysconfig.get_platform().split("-", 2)
+ assert parts[0] == PYTHON_CROSS_PLATFORM.lower()
+ assert parts[2] == PYTHON_CROSS_MULTIARCH
+
+
+def test_sysconfig_get_sysconfigdata_name():
+ parts = sysconfig._get_sysconfigdata_name().split("_", 4)
+ assert parts[3] == PYTHON_CROSS_PLATFORM.lower()
+ assert parts[4] == PYTHON_CROSS_MULTIARCH
+
+
+@pytest.mark.parametrize(
+ "name, prefix",
+ [
+ # Paths that should be relative to the support folder
+ ("stdlib", SUPPORT_PREFIX),
+ ("include", SUPPORT_PREFIX),
+ ("platinclude", SUPPORT_PREFIX),
+ ("stdlib", SUPPORT_PREFIX),
+ # paths that should be relative to the venv
+ ("platstdlib", VENV_PREFIX),
+ ("purelib", VENV_PREFIX),
+ ("platlib", VENV_PREFIX),
+ ("scripts", VENV_PREFIX),
+ ("data", VENV_PREFIX),
+ ],
+)
+def test_sysconfig_get_paths(name, prefix):
+ assert sysconfig.get_paths()[name].startswith(str(prefix))