From 4f9b8b3bcaa9b4f3621cabe1e67079d6fb40f8c2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 13 Aug 2025 00:05:32 +0000 Subject: [PATCH 1/2] chore: Generate build artifacts for 3.3.3 release --- build_artifacts/v3/v3.3/v3.3.3/Dockerfile | 218 +++++++++++++++ build_artifacts/v3/v3.3/v3.3.3/cpu.env.in | 66 +++++ .../v3/v3.3/v3.3.3/cpu.pinned_env.in | 7 + .../code_editor_machine_settings.json | 4 + .../code_editor_user_settings.json | 3 + .../dirs/etc/code-editor/extensions.txt | 4 + .../v3/v3.3/v3.3.3/dirs/etc/conda/.condarc | 6 + .../dirs/etc/jupyter/jupyter_server_config.py | 28 ++ .../v3.3.3/dirs/etc/patches/apply_patches.sh | 37 +++ .../etc/patches/smus/0001-sparkmagic.patch | 10 + .../0002-sparkmagic-override-info-table.patch | 24 ++ .../smus/0004-fix-boto3-endpoints.patch | 12 + .../sagemaker-inference-server/__init__.py | 3 + .../dirs/etc/sagemaker-inference-server/serve | 2 + .../etc/sagemaker-inference-server/serve.py | 25 ++ .../tornado_server/__init__.py | 12 + .../tornado_server/async_handler.py | 76 ++++++ .../tornado_server/server.py | 127 +++++++++ .../tornado_server/stream_handler.py | 59 ++++ .../tornado_server/sync_handler.py | 77 ++++++ .../utils/__init__.py | 1 + .../utils/environment.py | 59 ++++ .../utils/exception.py | 21 ++ .../utils/logger.py | 43 +++ .../v3.3.3/dirs/etc/sagemaker-ui/git_clone.sh | 62 +++++ .../dirs/etc/sagemaker-ui/git_config.sh | 9 + .../jupyter/lab/settings/overrides.json | 5 + .../jupyter/lab/settings/page_config.json | 14 + .../jupyter/server/jupyter_server_config.py | 30 +++ .../python3_kernel_launcher.sh | 51 ++++ .../sagemaker-ui/kernels/python3/kernel.json | 14 + .../etc/sagemaker-ui/libmgmt/install-lib.sh | 18 ++ .../etc/sagemaker-ui/network_validation.sh | 181 +++++++++++++ .../sagemaker-ui/sagemaker_ui_post_startup.sh | 253 ++++++++++++++++++ .../etc/sagemaker-ui/set_code_editor_theme.sh | 23 ++ .../workflows/docker-compose.yaml | 77 ++++++ .../etc/sagemaker-ui/workflows/healthcheck.sh | 34 +++ ...akerWorkflowsOperator-1.0-py3-none-any.whl | Bin 0 -> 23090 bytes ...n_sagemaker_studio-1.0.15-py3-none-any.whl | Bin 0 -> 2331059 bytes .../workflows/requirements/requirements.txt | 5 + .../etc/sagemaker-ui/workflows/sample_dag.py | 18 ++ .../workflows/sm-spark-cli-install.sh | 9 + .../sagemaker-ui/workflows/sm_init_script.sh | 24 ++ .../workflows/start-workflows-container.sh | 202 ++++++++++++++ .../sagemaker-ui/workflows/startup/startup.sh | 1 + .../workflows/stop-workflows-container.sh | 12 + .../sagemaker-ui/workflows/workflow_client.py | 114 ++++++++ .../etc/sagemaker/sm_pysdk_default_config.py | 122 +++++++++ .../conf.d/supervisord-code-editor.conf | 12 + .../supervisor/conf.d/supervisord-common.conf | 18 ++ .../conf.d/supervisord-jupyter-lab.conf | 11 + .../supervisord-sagemaker-ui-code-editor.conf | 28 ++ .../supervisord-sagemaker-ui-default.conf | 27 ++ .../conf.d/supervisord-sagemaker-ui.conf | 35 +++ .../etc/supervisor/conf.d/supervisord.conf | 27 ++ .../dirs/usr/local/bin/entrypoint-code-editor | 16 ++ .../usr/local/bin/entrypoint-jupyter-server | 25 ++ .../bin/entrypoint-sagemaker-ui-code-editor | 16 ++ .../entrypoint-sagemaker-ui-jupyter-server | 26 ++ .../dirs/usr/local/bin/merge-settings-util.py | 22 ++ .../dirs/usr/local/bin/restart-jupyter-server | 6 + .../bin/restart-sagemaker-ui-jupyter-server | 6 + .../dirs/usr/local/bin/start-code-editor | 84 ++++++ .../dirs/usr/local/bin/start-jupyter-server | 43 +++ .../local/bin/start-sagemaker-ui-code-editor | 107 ++++++++ .../bin/start-sagemaker-ui-jupyter-server | 52 ++++ .../v3/v3.3/v3.3.3/gpu.arg_based_env.in | 6 + build_artifacts/v3/v3.3/v3.3.3/gpu.env.in | 66 +++++ .../v3/v3.3/v3.3.3/gpu.pinned_env.in | 6 + .../v3/v3.3/v3.3.3/patch_glue_pyspark.json | 15 ++ .../v3/v3.3/v3.3.3/patch_glue_spark.json | 15 ++ .../v3/v3.3/v3.3.3/source-version.txt | 1 + 72 files changed, 2872 insertions(+) create mode 100644 build_artifacts/v3/v3.3/v3.3.3/Dockerfile create mode 100644 build_artifacts/v3/v3.3/v3.3.3/cpu.env.in create mode 100644 build_artifacts/v3/v3.3/v3.3.3/cpu.pinned_env.in create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/code-editor/code_editor_machine_settings.json create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/code-editor/code_editor_user_settings.json create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/code-editor/extensions.txt create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/conda/.condarc create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/jupyter/jupyter_server_config.py create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/patches/apply_patches.sh create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/patches/smus/0001-sparkmagic.patch create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/patches/smus/0002-sparkmagic-override-info-table.patch create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/patches/smus/0004-fix-boto3-endpoints.patch create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/__init__.py create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/serve create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/serve.py create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/__init__.py create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/async_handler.py create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/server.py create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/stream_handler.py create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/sync_handler.py create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/utils/__init__.py create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/utils/environment.py create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/utils/exception.py create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/utils/logger.py create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/git_clone.sh create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/git_config.sh create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/jupyter/lab/settings/overrides.json create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/jupyter/lab/settings/page_config.json create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/jupyter/server/jupyter_server_config.py create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/kernels/kernel_launchers/python3_kernel_launcher.sh create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/kernels/python3/kernel.json create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/libmgmt/install-lib.sh create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/network_validation.sh create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/sagemaker_ui_post_startup.sh create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/set_code_editor_theme.sh create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/docker-compose.yaml create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/healthcheck.sh create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/plugins/amzn_SagemakerWorkflowsOperator-1.0-py3-none-any.whl create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/plugins/amzn_sagemaker_studio-1.0.15-py3-none-any.whl create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/requirements/requirements.txt create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/sample_dag.py create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/sm-spark-cli-install.sh create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/sm_init_script.sh create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/start-workflows-container.sh create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/startup/startup.sh create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/stop-workflows-container.sh create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/workflow_client.py create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker/sm_pysdk_default_config.py create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-code-editor.conf create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-common.conf create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-jupyter-lab.conf create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-sagemaker-ui-code-editor.conf create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-sagemaker-ui-default.conf create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-sagemaker-ui.conf create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord.conf create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/entrypoint-code-editor create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/entrypoint-jupyter-server create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/entrypoint-sagemaker-ui-code-editor create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/entrypoint-sagemaker-ui-jupyter-server create mode 100644 build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/merge-settings-util.py create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/restart-jupyter-server create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/restart-sagemaker-ui-jupyter-server create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/start-code-editor create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/start-jupyter-server create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/start-sagemaker-ui-code-editor create mode 100755 build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/start-sagemaker-ui-jupyter-server create mode 100644 build_artifacts/v3/v3.3/v3.3.3/gpu.arg_based_env.in create mode 100644 build_artifacts/v3/v3.3/v3.3.3/gpu.env.in create mode 100644 build_artifacts/v3/v3.3/v3.3.3/gpu.pinned_env.in create mode 100644 build_artifacts/v3/v3.3/v3.3.3/patch_glue_pyspark.json create mode 100644 build_artifacts/v3/v3.3/v3.3.3/patch_glue_spark.json create mode 100644 build_artifacts/v3/v3.3/v3.3.3/source-version.txt diff --git a/build_artifacts/v3/v3.3/v3.3.3/Dockerfile b/build_artifacts/v3/v3.3/v3.3.3/Dockerfile new file mode 100644 index 000000000..66349557a --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/Dockerfile @@ -0,0 +1,218 @@ +ARG TAG_FOR_BASE_MICROMAMBA_IMAGE +FROM mambaorg/micromamba:$TAG_FOR_BASE_MICROMAMBA_IMAGE + +ARG CUDA_MAJOR_MINOR_VERSION='' +ARG ENV_IN_FILENAME +ARG PINNED_ENV_IN_FILENAME +ARG ARG_BASED_ENV_IN_FILENAME +ARG IMAGE_VERSION +LABEL "org.amazon.sagemaker-distribution.image.version"=$IMAGE_VERSION + +ARG AMZN_BASE="/opt/amazon/sagemaker" +ARG DB_ROOT_DIR="/opt/db" +ARG DIRECTORY_TREE_STAGE_DIR="${AMZN_BASE}/dir-staging" + +ARG NB_USER="sagemaker-user" +ARG NB_UID=1000 +ARG NB_GID=100 + +# https://www.openssl.org/source/ +ARG FIPS_VALIDATED_SSL=3.0.8 +ARG MIN_REQUIRED_MICROMAMBA_VERSION=1.5.11 + +ENV SAGEMAKER_LOGGING_DIR="/var/log/sagemaker/" +ENV STUDIO_LOGGING_DIR="/var/log/studio/" +ENV EDITOR="nano" +ENV IMAGE_VERSION=$IMAGE_VERSION +ENV PINNED_MICROMAMBA_MINOR_VERSION="1.5.*" +ENV SAGEMAKER_RECOVERY_MODE_HOME=/tmp/sagemaker-recovery-mode-home + +USER root +# Upgrade micromamba to the latest patch version in the pinned minor version range, if applicable +RUN CURRENT_MICROMAMBA_VERSION=$(micromamba --version) && \ + echo "Current micromamba version: $CURRENT_MICROMAMBA_VERSION" && \ + if [[ "$CURRENT_MICROMAMBA_VERSION" == $PINNED_MICROMAMBA_MINOR_VERSION ]]; then \ + echo "Upgrading micromamba to the latest $PINNED_MICROMAMBA_MINOR_VERSION version..." && \ + micromamba self-update -c conda-forge --version "$MIN_REQUIRED_MICROMAMBA_VERSION" && \ + micromamba clean --all --yes --force-pkgs-dirs; \ + else \ + echo "Micromamba is already at version $CURRENT_MICROMAMBA_VERSION (outside $PINNED_MICROMAMBA_MINOR_VERSION). No upgrade performed."; \ + fi + +RUN usermod "--login=${NB_USER}" "--home=/home/${NB_USER}" --move-home "-u ${NB_UID}" "${MAMBA_USER}" && \ + groupmod "--new-name=${NB_USER}" --non-unique "-g ${NB_GID}" "${MAMBA_USER}" && \ + # Update the expected value of MAMBA_USER for the + # _entrypoint.sh consistency check. + echo "${NB_USER}" > "/etc/arg_mamba_user" && \ + : +ENV MAMBA_USER=$NB_USER +ENV USER=$NB_USER + +RUN apt-get update && apt-get upgrade -y && \ + apt-get install -y --no-install-recommends sudo gettext-base wget curl unzip git rsync build-essential openssh-client nano cron less mandoc jq ca-certificates gnupg && \ + # We just install tzdata below but leave default time zone as UTC. This helps packages like Pandas to function correctly. + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata krb5-user libkrb5-dev libsasl2-dev libsasl2-modules && \ + chmod g+w /etc/passwd && \ + echo "ALL ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \ + touch /etc/krb5.conf.lock && chown ${NB_USER}:${MAMBA_USER} /etc/krb5.conf* && \ + # Note that we do NOT run `rm -rf /var/lib/apt/lists/*` here. If we did, anyone building on top of our images will + # not be able to run any `apt-get install` commands and that would hamper customizability of the images. + curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \ + unzip awscliv2.zip && \ + sudo ./aws/install && \ + rm -rf aws awscliv2.zip && \ + : && \ + echo "source /usr/local/bin/_activate_current_env.sh" | tee --append /etc/profile && \ +# CodeEditor - create server, user data dirs + mkdir -p /opt/amazon/sagemaker/sagemaker-code-editor-server-data /opt/amazon/sagemaker/sagemaker-code-editor-user-data \ + && chown $MAMBA_USER:$MAMBA_USER /opt/amazon/sagemaker/sagemaker-code-editor-server-data /opt/amazon/sagemaker/sagemaker-code-editor-user-data && \ +# create dir to store user data files + mkdir -p /opt/amazon/sagemaker/user-data \ + && chown $MAMBA_USER:$MAMBA_USER /opt/amazon/sagemaker/user-data && \ +# Merge in OS directory tree contents. + mkdir -p ${DIRECTORY_TREE_STAGE_DIR} +COPY dirs/ ${DIRECTORY_TREE_STAGE_DIR}/ +RUN rsync -a ${DIRECTORY_TREE_STAGE_DIR}/ / && \ + rm -rf ${DIRECTORY_TREE_STAGE_DIR} && \ +# CodeEditor - download the extensions + mkdir -p /etc/code-editor/extensions && \ + while IFS= read -r url || [ -n "$url" ]; do \ + echo "Downloading extension from ${url}..." && \ + wget --no-check-certificate -P /etc/code-editor/extensions "${url}"; \ + done < /etc/code-editor/extensions.txt + +USER $MAMBA_USER +COPY --chown=$MAMBA_USER:$MAMBA_USER $ENV_IN_FILENAME *.in /tmp/ +COPY --chown=$MAMBA_USER:$MAMBA_USER $PINNED_ENV_IN_FILENAME *.in /tmp/ + +ARG MAMBA_DOCKERFILE_ACTIVATE=1 +ARG CONDA_OVERRIDE_CUDA=$CUDA_MAJOR_MINOR_VERSION + +# Make sure that $ENV_IN_FILENAME and $PINNED_ENV_IN_FILENAME has a newline at the end before the `tee` command runs. +# Otherwise, nasty things will happen. +RUN if [[ -z $ARG_BASED_ENV_IN_FILENAME ]] ; \ + then echo 'No ARG_BASED_ENV_IN_FILENAME passed' ; \ + else envsubst < /tmp/$ARG_BASED_ENV_IN_FILENAME | tee --append /tmp/$ENV_IN_FILENAME ; \ + fi && \ + # Enforce dependencies are all installed from conda-forge + micromamba install -y --name base --file /tmp/$ENV_IN_FILENAME --file /tmp/$PINNED_ENV_IN_FILENAME && \ + mkdir -p $SAGEMAKER_RECOVERY_MODE_HOME && \ + chown $MAMBA_USER:$MAMBA_USER $SAGEMAKER_RECOVERY_MODE_HOME && \ + SUPERVISOR_VERSION="supervisor==4.2.5" && \ + JUPYTERLAB_VERSION="jupyterlab==4.4.3" && \ + SAGEMAKER_JUPYTERLAB_VERSION="sagemaker-jupyterlab-extension==0.4.2" && \ + echo "Installing in sagemaker-recovery-mode micromamba environment: $JUPYTERLAB_VERSION $SAGEMAKER_JUPYTERLAB_VERSION" && \ + micromamba create --prefix /opt/conda/envs/sagemaker-recovery-mode && \ + micromamba install -c conda-forge --prefix /opt/conda/envs/sagemaker-recovery-mode -y $JUPYTERLAB_VERSION $SAGEMAKER_JUPYTERLAB_VERSION $SUPERVISOR_VERSION && \ + micromamba clean --all --yes --force-pkgs-dirs && \ + rm -rf /tmp/*.in && \ + sudo ln -s $(which python3) /usr/bin/python && \ + # Update npm version + npm i -g npm && \ + # Enforce to use `conda-forge` as only channel, by removing `defaults` + conda config --remove channels defaults && \ + micromamba config append channels conda-forge --env && \ + # Configure CodeEditor - Install extensions and set preferences + extensionloc=/opt/amazon/sagemaker/sagemaker-code-editor-server-data/extensions && mkdir -p "${extensionloc}" \ + # Loop through all vsix files in /etc/code-editor/extensions and install them + && for ext in /etc/code-editor/extensions/*.vsix; do \ + echo "Installing extension ${ext}..."; \ + sagemaker-code-editor --install-extension "${ext}" --extensions-dir "${extensionloc}" --server-data-dir /opt/amazon/sagemaker/sagemaker-code-editor-server-data --user-data-dir /opt/amazon/sagemaker/sagemaker-code-editor-user-data; \ + done \ + # Copy the settings + && cp /etc/code-editor/code_editor_machine_settings.json /opt/amazon/sagemaker/sagemaker-code-editor-server-data/data/Machine/settings.json && \ + cp /etc/code-editor/code_editor_user_settings.json /opt/amazon/sagemaker/sagemaker-code-editor-server-data/data/User/settings.json && \ + # Install glue kernels, and move to shared directory + # Also patching base kernel so Studio background code doesn't start session silently + install-glue-kernels && \ + SITE_PACKAGES=$(pip show aws-glue-sessions | grep Location | awk '{print $2}') && \ + jupyter-kernelspec install $SITE_PACKAGES/aws_glue_interactive_sessions_kernel/glue_pyspark --user && \ + jupyter-kernelspec install $SITE_PACKAGES/aws_glue_interactive_sessions_kernel/glue_spark --user && \ + mv /home/sagemaker-user/.local/share/jupyter/kernels/glue_pyspark /opt/conda/share/jupyter/kernels && \ + mv /home/sagemaker-user/.local/share/jupyter/kernels/glue_spark /opt/conda/share/jupyter/kernels && \ + sed -i '/if not store_history and (/i\ if "sm_analytics_runtime_check" in code:\n return await self._complete_cell()\n' \ + "$SITE_PACKAGES/aws_glue_interactive_sessions_kernel/glue_kernel_base/BaseKernel.py" && \ + # Install FIPS Provider for OpenSSL, on top of existing OpenSSL installation + # v3.0.8 is latest FIPS validated provider, so this is the one we install + # But we need to run tests against the installed version. + # see https://github.com/openssl/openssl/blob/master/README-FIPS.md https://www.openssl.org/source/ + INSTALLED_SSL=$(micromamba list | grep openssl | tr -s ' ' | cut -d ' ' -f 3 | head -n 1) && \ + # download source code for installed, and FIPS validated openssl versions + curl -L https://github.com/openssl/openssl/releases/download/openssl-$FIPS_VALIDATED_SSL/openssl-$FIPS_VALIDATED_SSL.tar.gz > openssl-$FIPS_VALIDATED_SSL.tar.gz && \ + curl -L https://github.com/openssl/openssl/releases/download/openssl-$INSTALLED_SSL/openssl-$INSTALLED_SSL.tar.gz > openssl-$INSTALLED_SSL.tar.gz && \ + tar -xf openssl-$FIPS_VALIDATED_SSL.tar.gz && tar -xf openssl-$INSTALLED_SSL.tar.gz && cd openssl-$FIPS_VALIDATED_SSL && \ + # Configure both versions to enable FIPS and build + ./Configure enable-fips --prefix=/opt/conda --openssldir=/opt/conda/ssl && make && \ + cd ../openssl-$INSTALLED_SSL && \ + ./Configure enable-fips --prefix=/opt/conda --openssldir=/opt/conda/ssl && make && \ + # Copy validated provider to installed version for testing + cp ../openssl-$FIPS_VALIDATED_SSL/providers/fips.so providers/. && \ + cp ../openssl-$FIPS_VALIDATED_SSL/providers/fipsmodule.cnf providers/. && \ + make tests && cd ../openssl-$FIPS_VALIDATED_SSL && \ + # After tests pass, install FIPS provider and remove source code + make install_fips && cd .. && rm -rf ./openssl-* && \ +# Create new config file with fips-enabled. Then user can override OPENSSL_CONF to enable FIPS +# e.g. export OPENSSL_CONF=/opt/conda/ssl/openssl-fips.cnf + cp /opt/conda/ssl/openssl.cnf /opt/conda/ssl/openssl-fips.cnf && \ + sed -i "s:# .include fipsmodule.cnf:.include /opt/conda/ssl/fipsmodule.cnf:" /opt/conda/ssl/openssl-fips.cnf && \ + sed -i 's:# fips = fips_sect:fips = fips_sect:' /opt/conda/ssl/openssl-fips.cnf && \ +# Install Kerberos. +# Make sure no dependency is added/updated + pip install "krb5>=0.5.1,<0.6" && \ + pip show krb5 | grep Require | xargs -i sh -c '[ $(echo {} | cut -d: -f2 | wc -w) -eq 0 ] ' && \ +# https://stackoverflow.com/questions/122327 + SYSTEM_PYTHON_PATH=$(python3 -c "from __future__ import print_function;import sysconfig; print(sysconfig.get_paths().get('purelib'))") && \ + # Remove SparkRKernel as it's not supported \ + jupyter-kernelspec remove -f -y sparkrkernel && \ + # Patch Sparkmagic lib to support Custom Certificates \ + # https://github.com/jupyter-incubator/sparkmagic/pull/435/files \ + cp -a ${SYSTEM_PYTHON_PATH}/sagemaker_studio_analytics_extension/patches/configuration.py ${SYSTEM_PYTHON_PATH}/sparkmagic/utils/ && \ + cp -a ${SYSTEM_PYTHON_PATH}/sagemaker_studio_analytics_extension/patches/reliablehttpclient.py ${SYSTEM_PYTHON_PATH}/sparkmagic/livyclientlib/reliablehttpclient.py && \ + sed -i 's= "python"= "/opt/conda/bin/python"=g' /opt/conda/share/jupyter/kernels/pysparkkernel/kernel.json /opt/conda/share/jupyter/kernels/sparkkernel/kernel.json && \ + sed -i 's="Spark"="SparkMagic Spark"=g' /opt/conda/share/jupyter/kernels/sparkkernel/kernel.json && \ + sed -i 's="PySpark"="SparkMagic PySpark"=g' /opt/conda/share/jupyter/kernels/pysparkkernel/kernel.json && \ + # Configure RTC - disable jupyter_collaboration by default + jupyter labextension disable @jupyter/collaboration-extension && \ + # Disable docprovider-extension for v3 and above images + jupyter labextension disable @jupyter/docprovider-extension + +# Patch glue kernels to use kernel wrapper +COPY patch_glue_pyspark.json /opt/conda/share/jupyter/kernels/glue_pyspark/kernel.json +COPY patch_glue_spark.json /opt/conda/share/jupyter/kernels/glue_spark/kernel.json + +USER root + +# Create logging directories for supervisor +RUN mkdir -p $SAGEMAKER_LOGGING_DIR && \ + chmod a+rw $SAGEMAKER_LOGGING_DIR && \ + mkdir -p ${STUDIO_LOGGING_DIR} && \ + chown ${NB_USER}:${MAMBA_USER} ${STUDIO_LOGGING_DIR} && \ + # Create sagemaker pysdk admin default config directory + mkdir -p /etc/xdg/sagemaker && \ + chmod a+rw /etc/xdg/sagemaker && \ + # Clean up CodeEditor artifacts + rm -rf /etc/code-editor && \ + # Create supervisord runtime directory + mkdir -p /var/run/supervisord && \ + chmod a+rw /var/run/supervisord && \ + # Create root directory for DB + # Create logging directories for supervisor + mkdir -p $DB_ROOT_DIR && \ + chmod a+rw $DB_ROOT_DIR && \ + HOME_DIR="/home/${NB_USER}/licenses" \ + && mkdir -p ${HOME_DIR} \ + && curl -o ${HOME_DIR}/oss_compliance.zip https://aws-dlinfra-utilities.s3.amazonaws.com/oss_compliance.zip \ + && unzip ${HOME_DIR}/oss_compliance.zip -d ${HOME_DIR}/ \ + && cp ${HOME_DIR}/oss_compliance/test/testOSSCompliance /usr/local/bin/testOSSCompliance \ + && chmod +x /usr/local/bin/testOSSCompliance \ + && chmod +x ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh \ + && ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh ${HOME_DIR} python \ + && rm -rf ${HOME_DIR}/oss_compliance* + +# Explicitly disable BuildKit for SM Studio Docker functionality +ENV DOCKER_BUILDKIT=0 +ENV PATH="/etc/sagemaker-inference-server:/opt/conda/bin:/opt/conda/condabin:$PATH" +WORKDIR "/home/${NB_USER}" +ENV SHELL=/bin/bash +ENV OPENSSL_MODULES=/opt/conda/lib64/ossl-modules/ +USER $MAMBA_USER diff --git a/build_artifacts/v3/v3.3/v3.3.3/cpu.env.in b/build_artifacts/v3/v3.3/v3.3.3/cpu.env.in new file mode 100644 index 000000000..14c4e0945 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/cpu.env.in @@ -0,0 +1,66 @@ +# This file is auto-generated. +conda-forge::s3fs[version='>=2024.12.0,<2024.13.0'] +conda-forge::seaborn[version='>=0.13.2,<0.14.0'] +conda-forge::jupyter-activity-monitor-extension[version='>=0.3.2,<0.4.0'] +conda-forge::mlflow[version='>=2.22.0,<2.23.0'] +conda-forge::sagemaker-mlflow[version='>=0.1.0,<0.2.0'] +conda-forge::langchain-aws[version='>=0.2.19,<0.3.0'] +conda-forge::jupyter-collaboration[version='>=3.1.0,<3.2.0'] +conda-forge::sagemaker-code-editor[version='>=1.6.2,<1.7.0'] +conda-forge::amazon_sagemaker_sql_editor[version='>=0.1.18,<0.2.0'] +conda-forge::amazon-sagemaker-sql-magic[version='>=0.1.4,<0.2.0'] +conda-forge::amazon-sagemaker-jupyter-ai-q-developer[version='>=1.2.7,<1.3.0'] +conda-forge::amazon-q-developer-jupyterlab-ext[version='>=3.4.8,<3.5.0'] +conda-forge::langchain[version='>=0.3.26,<0.4.0'] +conda-forge::fastapi[version='>=0.115.14,<0.116.0'] +conda-forge::uvicorn[version='>=0.35.0,<0.36.0'] +conda-forge::pytorch[version='>=2.6.0,<2.7.0'] +conda-forge::tensorflow[version='>=2.18.0,<2.19.0'] +conda-forge::python[version='>=3.12.9,<3.13.0'] +conda-forge::pip[version='>=25.1.1,<25.2.0'] +conda-forge::torchvision[version='>=0.21.0,<0.22.0'] +conda-forge::numpy[version='>=1.26.4,<1.27.0'] +conda-forge::pandas[version='>=2.2.3,<2.3.0'] +conda-forge::scikit-learn[version='>=1.6.1,<1.7.0'] +conda-forge::jinja2[version='>=3.1.6,<3.2.0'] +conda-forge::matplotlib-base[version='>=3.10.3,<3.11.0'] +conda-forge::sagemaker-headless-execution-driver[version='>=0.0.13,<0.1.0'] +conda-forge::ipython[version='>=8.37.0,<8.38.0'] +conda-forge::scipy[version='>=1.15.2,<1.16.0'] +conda-forge::keras[version='>=3.10.0,<3.11.0'] +conda-forge::py-xgboost-cpu[version='>=2.1.4,<2.2.0'] +conda-forge::jupyterlab[version='>=4.4.4,<4.5.0'] +conda-forge::ipywidgets[version='>=8.1.7,<8.2.0'] +conda-forge::conda[version='>=25.5.1,<25.6.0'] +conda-forge::boto3[version='>=1.37.1,<1.38.0'] +conda-forge::sagemaker-python-sdk[version='>=2.245.0,<2.246.0'] +conda-forge::supervisor[version='>=4.2.5,<4.3.0'] +conda-forge::autogluon[version='>=1.3.1,<1.4.0'] +conda-forge::aws-glue-sessions[version='>=1.0.9,<1.1.0'] +conda-forge::sagemaker-kernel-wrapper[version='>=0.0.5,<0.1.0'] +conda-forge::jupyter-ai[version='>=2.31.5,<2.32.0'] +conda-forge::jupyter-scheduler[version='>=2.11.0,<2.12.0'] +conda-forge::jupyter-lsp[version='>=2.2.5,<2.3.0'] +conda-forge::jupyterlab-lsp[version='>=5.0.3,<5.1.0'] +conda-forge::python-lsp-server[version='>=1.13.0,<1.14.0'] +conda-forge::jupyterlab-git[version='>=0.51.2,<0.52.0'] +conda-forge::notebook[version='>=7.4.4,<7.5.0'] +conda-forge::altair[version='>=5.5.0,<5.6.0'] +conda-forge::sagemaker-studio-analytics-extension[version='>=0.2.0,<0.3.0'] +conda-forge::jupyter-dash[version='>=0.4.2,<0.5.0'] +conda-forge::sagemaker-jupyterlab-extension[version='>=0.5.0,<0.6.0'] +conda-forge::sagemaker-jupyterlab-emr-extension[version='>=0.4.0,<0.5.0'] +conda-forge::amazon-sagemaker-jupyter-scheduler[version='>=3.1.15,<3.2.0'] +conda-forge::jupyter-server-proxy[version='>=4.4.0,<4.5.0'] +conda-forge::pyhive[version='>=0.7.0,<0.8.0'] +conda-forge::python-gssapi[version='>=1.9.0,<1.10.0'] +conda-forge::tf-keras[version='>=2.18.0,<2.19.0'] +conda-forge::git-remote-codecommit[version='>=1.16,<1.17.0'] +conda-forge::docker-cli[version='>=27.5.1,<27.6.0'] +conda-forge::aioboto3[version='>=14.1.0,<14.2.0'] +conda-forge::sagemaker-studio-cli[version='>=1.0.6,<1.1.0'] +conda-forge::sagemaker-studio[version='>=1.0.16,<1.1.0'] +conda-forge::sagemaker-studio-dataengineering-sessions[version='>=1.1.2,<1.2.0'] +conda-forge::sagemaker-studio-dataengineering-extensions[version='>=1.1.2,<1.2.0'] +conda-forge::amzn-sagemaker-aiops-jupyterlab-extension[version='>=1.0.4,<1.1.0'] +conda-forge::aws-s3-access-grants-boto3-plugin[version='>=1.2.0,<1.3.0'] diff --git a/build_artifacts/v3/v3.3/v3.3.3/cpu.pinned_env.in b/build_artifacts/v3/v3.3/v3.3.3/cpu.pinned_env.in new file mode 100644 index 000000000..2c088f01b --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/cpu.pinned_env.in @@ -0,0 +1,7 @@ +conda-forge::dash[version='<=2.18.1'] +conda-forge::evaluate[version='<0.4.2'] +conda-forge::catboost[version='>=1.1.1,<1.3.0',build='*cpu*'] +conda-forge::libsqlite[version='<3.49.0'] +conda-forge::urllib3[version='<2'] +conda-forge::papermill[version='>=2.6.0'] +conda-forge::plotly[version='<6.1.0'] diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/code-editor/code_editor_machine_settings.json b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/code-editor/code_editor_machine_settings.json new file mode 100644 index 000000000..44fb8ef7f --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/code-editor/code_editor_machine_settings.json @@ -0,0 +1,4 @@ +{ + "python.terminal.activateEnvironment": false, + "python.defaultInterpreterPath": "/opt/conda/bin/python" +} diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/code-editor/code_editor_user_settings.json b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/code-editor/code_editor_user_settings.json new file mode 100644 index 000000000..ed3ef56a4 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/code-editor/code_editor_user_settings.json @@ -0,0 +1,3 @@ +{ + "extensions.autoUpdate": false +} diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/code-editor/extensions.txt b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/code-editor/extensions.txt new file mode 100644 index 000000000..7672e9df9 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/code-editor/extensions.txt @@ -0,0 +1,4 @@ +https://open-vsx.org/api/ms-toolsai/jupyter/2024.5.0/file/ms-toolsai.jupyter-2024.5.0.vsix +https://open-vsx.org/api/ms-python/python/2023.20.0/file/ms-python.python-2023.20.0.vsix +https://open-vsx.org/api/amazonwebservices/aws-toolkit-vscode/3.30.0/file/amazonwebservices.aws-toolkit-vscode-3.30.0.vsix +https://open-vsx.org/api/amazonwebservices/amazon-q-vscode/1.58.0/file/amazonwebservices.amazon-q-vscode-1.58.0.vsix diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/conda/.condarc b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/conda/.condarc new file mode 100644 index 000000000..c3616df50 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/conda/.condarc @@ -0,0 +1,6 @@ +envs_dirs: + - ~/.conda/envs + - /opt/conda/envs +pkgs_dirs: + - ~/.conda/pkgs + - /opt/conda/pkgs diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/jupyter/jupyter_server_config.py b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/jupyter/jupyter_server_config.py new file mode 100644 index 000000000..0182cc238 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/jupyter/jupyter_server_config.py @@ -0,0 +1,28 @@ +# Default Jupyter server config +# Note: those config can be overridden by user-level configs. + +c.ServerApp.terminado_settings = {"shell_command": ["/bin/bash"]} +c.ServerApp.tornado_settings = {"compress_response": True} + +# Do not delete files to trash. Instead, permanently delete files. +c.FileContentsManager.delete_to_trash = False + +# Allow deleting non-empty directory via file browser. Related documentation: +# https://github.com/jupyter-server/jupyter_server/blob/main/jupyter_server/services/contents/filemanager.py#L125-L129 +c.FileContentsManager.always_delete_dir = True + +# Enable `allow_hidden` by default, so hidden files are accessible via Jupyter server +# Related documentation: https://jupyterlab.readthedocs.io/en/stable/user/files.html#displaying-hidden-files +c.ContentsManager.allow_hidden = True + +# This will set the LanguageServerManager.extra_node_roots setting if amazon_sagemaker_sql_editor exists in the +# environment. Ignore otherwise, don't fail the JL server start +# Related documentation: https://jupyterlab-lsp.readthedocs.io/en/v3.4.0/Configuring.html +try: + import os + + module = __import__("amazon_sagemaker_sql_editor") + module_location = os.path.dirname(module.__file__) + c.LanguageServerManager.extra_node_roots = [f"{module_location}/sql-language-server"] +except: + pass diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/patches/apply_patches.sh b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/patches/apply_patches.sh new file mode 100755 index 000000000..c4ec7604c --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/patches/apply_patches.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +set -eux + +# Check if parameter is provided +if [ $# -ne 1 ]; then + echo "Usage: $0 [smus|studio-ai]" + exit 1 +fi + +# Validate parameter +case "$1" in + "smus") + PATCH_DIR="/etc/patches/smus" + ;; + "studio-ai") + PATCH_DIR="/etc/patches/studio-ai" + ;; + *) + echo "Error: Parameter must be either 'smus' or 'studio-ai'" + exit 1 + ;; +esac + +# Check if patch directory exists +if [ ! -d "$PATCH_DIR" ]; then + echo "Error: Patch directory $PATCH_DIR does not exist" + exit 1 +fi + +# Patch files can be generated via "diff -u /path/to/original_file /path/to/new_file > XXX_bad_package.patch" +# See https://www.thegeekstuff.com/2014/12/patch-command-examples/ +for PATCHFILE in "$PATCH_DIR"/*.patch; do + [ -f "$PATCHFILE" ] || continue + echo "Applying $PATCHFILE" + (cd "/opt/conda" && patch --strip=3 < "$PATCHFILE") +done diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/patches/smus/0001-sparkmagic.patch b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/patches/smus/0001-sparkmagic.patch new file mode 100644 index 000000000..25d380b9d --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/patches/smus/0001-sparkmagic.patch @@ -0,0 +1,10 @@ +--- /opt/conda/lib/python3.12/site-packages/sparkmagic/livyclientlib/command.py ++++ /opt/conda/lib/python3.12/site-packages/sparkmagic/livyclientlib/command.py +@@ -54,6 +54,7 @@ + try: + session.wait_for_idle() + data = {"code": self.code} ++ data["kind"] = session.kind + response = session.http_client.post_statement(session.id, data) + statement_id = response["id"] + output = self._get_statement_output(session, statement_id) diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/patches/smus/0002-sparkmagic-override-info-table.patch b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/patches/smus/0002-sparkmagic-override-info-table.patch new file mode 100644 index 000000000..0e6959fc3 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/patches/smus/0002-sparkmagic-override-info-table.patch @@ -0,0 +1,24 @@ +--- /opt/conda/lib/python3.12/site-packages/sparkmagic/utils/utils.py ++++ /opt/conda/lib/python3.12/site-packages/sparkmagic/utils/utils.py +@@ -94,15 +94,12 @@ + + + def get_sessions_info_html(info_sessions, current_session_id): +- html = ( +- """ +-""" +- + "".join( +- [session.get_row_html(current_session_id) for session in info_sessions] +- ) +- + "
IDYARN Application IDKindStateSpark UIDriver logUserCurrent session?
" +- ) +- ++ current_session = next((session for session in info_sessions if session.id == current_session_id), None) ++ spark_ui_url = current_session.get_spark_ui_url() ++ driver_log_url = current_session.get_driver_log_url() ++ ++ from sagemaker_studio_dataengineering_sessions.sagemaker_base_session_manager.common.debugging_utils import get_sessions_info_html ++ html = get_sessions_info_html(current_session.get_app_id(), spark_ui_url, driver_log_url) + return html + + diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/patches/smus/0004-fix-boto3-endpoints.patch b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/patches/smus/0004-fix-boto3-endpoints.patch new file mode 100644 index 000000000..cadcc70b3 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/patches/smus/0004-fix-boto3-endpoints.patch @@ -0,0 +1,12 @@ +--- /opt/conda/lib/python3.12/site-packages/botocore/data/endpoints.json ++++ /opt/conda/lib/python3.12/site-packages/botocore/data/endpoints.json +@@ -5404,6 +5404,9 @@ + "ap-northeast-3" : { + "hostname" : "datazone.ap-northeast-3.api.aws" + }, ++ "ap-south-1" : { ++ "hostname" : "datazone.ap-south-1.api.aws" ++ }, + "ap-south-2" : { + "hostname" : "datazone.ap-south-2.api.aws" + }, diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/__init__.py b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/__init__.py new file mode 100644 index 000000000..0427e383a --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/__init__.py @@ -0,0 +1,3 @@ +from __future__ import absolute_import + +import utils.logger diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/serve b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/serve new file mode 100755 index 000000000..bd604df37 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/serve @@ -0,0 +1,2 @@ +#!/bin/bash +python /etc/sagemaker-inference-server/serve.py diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/serve.py b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/serve.py new file mode 100644 index 000000000..0d23ada86 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/serve.py @@ -0,0 +1,25 @@ +from __future__ import absolute_import + +""" +TODO: when adding support for more serving frameworks, move the below logic into a condition statement. +We also need to define the right environment variable for signify what serving framework to use. + +Ex. + +inference_server = None +serving_framework = os.getenv("SAGEMAKER_INFERENCE_FRAMEWORK", None) + +if serving_framework == "FastAPI": + inference_server = FastApiServer() +elif serving_framework == "Flask": + inference_server = FlaskServer() +else: + inference_server = TornadoServer() + +inference_server.serve() + +""" +from tornado_server.server import TornadoServer + +inference_server = TornadoServer() +inference_server.serve() diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/__init__.py b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/__init__.py new file mode 100644 index 000000000..28b0e2cc2 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/__init__.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import + +import pathlib +import sys + +# make the utils modules accessible to modules from within the tornado_server folder +utils_path = pathlib.Path(__file__).parent.parent / "utils" +sys.path.insert(0, str(utils_path.resolve())) + +# make the tornado_server modules accessible to each other +tornado_module_path = pathlib.Path(__file__).parent +sys.path.insert(0, str(tornado_module_path.resolve())) diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/async_handler.py b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/async_handler.py new file mode 100644 index 000000000..9eb946086 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/async_handler.py @@ -0,0 +1,76 @@ +from __future__ import absolute_import + +import asyncio +import logging +from typing import AsyncIterator, Iterator + +import tornado.web +from stream_handler import StreamHandler + +from utils.environment import Environment +from utils.exception import AsyncInvocationsException +from utils.logger import SAGEMAKER_DISTRIBUTION_INFERENCE_LOGGER + +logger = logging.getLogger(SAGEMAKER_DISTRIBUTION_INFERENCE_LOGGER) + + +class InvocationsHandler(tornado.web.RequestHandler, StreamHandler): + """Handler mapped to the /invocations POST route. + + This handler wraps the async handler retrieved from the inference script + and encapsulates it behind the post() method. The post() method is done + asynchronously. + """ + + def initialize(self, handler: callable, environment: Environment): + """Initializes the handler function and the serving environment.""" + + self._handler = handler + self._environment = environment + + async def post(self): + """POST method used to encapsulate and invoke the async handle method asynchronously""" + + try: + response = await self._handler(self.request) + + if isinstance(response, Iterator): + await self.stream(response) + elif isinstance(response, AsyncIterator): + await self.astream(response) + else: + self.write(response) + except Exception as e: + raise AsyncInvocationsException(e) + + +class PingHandler(tornado.web.RequestHandler): + """Handler mapped to the /ping GET route. + + Ping handler to monitor the health of the Tornados server. + """ + + def get(self): + """Simple GET method to assess the health of the server.""" + + self.write("") + + +async def handle(handler: callable, environment: Environment): + """Serves the async handler function using Tornado. + + Opens the /invocations and /ping routes used by a SageMaker Endpoint + for inference serving capabilities. + """ + + logger.info("Starting inference server in asynchronous mode...") + + app = tornado.web.Application( + [ + (r"/invocations", InvocationsHandler, dict(handler=handler, environment=environment)), + (r"/ping", PingHandler), + ] + ) + app.listen(environment.port) + logger.debug(f"Asynchronous inference server listening on port: `{environment.port}`") + await asyncio.Event().wait() diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/server.py b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/server.py new file mode 100644 index 000000000..496bfac89 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/server.py @@ -0,0 +1,127 @@ +from __future__ import absolute_import + +import asyncio +import importlib +import logging +import subprocess +import sys +from pathlib import Path + +from utils.environment import Environment +from utils.exception import ( + InferenceCodeLoadException, + RequirementsInstallException, + ServerStartException, +) +from utils.logger import SAGEMAKER_DISTRIBUTION_INFERENCE_LOGGER + +logger = logging.getLogger(SAGEMAKER_DISTRIBUTION_INFERENCE_LOGGER) + + +class TornadoServer: + """Holds serving logic using the Tornado framework. + + The serve.py script will invoke TornadoServer.serve() to start the serving process. + The TornadoServer will install the runtime requirements specified through a requirements file. + It will then load an handler function within an inference script and then front it will an /invocations + route using the Tornado framework. + """ + + def __init__(self): + """Initialize the serving behaviors. + + Defines the serving behavior through Environment() and locate where + the inference code is contained. + """ + + self._environment = Environment() + logger.setLevel(int(self._environment.logging_level)) + logger.debug(f"Environment: {str(self._environment)}") + + self._path_to_inference_code = ( + Path(self._environment.base_directory).joinpath(self._environment.code_directory) + if self._environment.code_directory + else Path(self._environment.base_directory) + ) + logger.debug(f"Path to inference code: `{str(self._path_to_inference_code)}`") + + def initialize(self): + """Initialize the serving artifacts and dependencies. + + Install the runtime requirements and then locate the handler function from + the inference script. + """ + + logger.info("Initializing inference server...") + self._install_runtime_requirements() + self._handler = self._load_inference_handler() + + def serve(self): + """Orchestrate the initialization and server startup behavior. + + Call the initalize() method, determine the right Tornado serving behavior (async or sync), + and then start the Tornado server through asyncio + """ + + logger.info("Serving inference requests using Tornado...") + self.initialize() + + if asyncio.iscoroutinefunction(self._handler): + import async_handler as inference_handler + else: + import sync_handler as inference_handler + + try: + asyncio.run(inference_handler.handle(self._handler, self._environment)) + except Exception as e: + raise ServerStartException(e) + + def _install_runtime_requirements(self): + """Install the runtime requirements.""" + + logger.info("Installing runtime requirements...") + requirements_txt = self._path_to_inference_code.joinpath(self._environment.requirements) + if requirements_txt.is_file(): + try: + subprocess.check_call(["micromamba", "install", "--yes", "--file", str(requirements_txt)]) + except Exception as e: + logger.error( + "Failed to install requirements using `micromamba install`. Falling back to `pip install`..." + ) + try: + subprocess.check_call(["pip", "install", "-r", str(requirements_txt)]) + except Exception as e: + raise RequirementsInstallException(e) + else: + logger.debug(f"No requirements file was found at `{str(requirements_txt)}`") + + def _load_inference_handler(self) -> callable: + """Load the handler function from the inference script.""" + + logger.info("Loading inference handler...") + inference_module_name, handle_name = self._environment.code.split(".") + if inference_module_name and handle_name: + inference_module_file = f"{inference_module_name}.py" + module_spec = importlib.util.spec_from_file_location( + inference_module_file, str(self._path_to_inference_code.joinpath(inference_module_file)) + ) + if module_spec: + sys.path.insert(0, str(self._path_to_inference_code.resolve())) + module = importlib.util.module_from_spec(module_spec) + module_spec.loader.exec_module(module) + + if hasattr(module, handle_name): + handler = getattr(module, handle_name) + else: + raise InferenceCodeLoadException( + f"Handler `{handle_name}` could not be found in module `{inference_module_file}`" + ) + logger.debug(f"Loaded handler `{handle_name}` from module `{inference_module_name}`") + return handler + else: + raise InferenceCodeLoadException( + f"Inference code could not be found at `{str(self._path_to_inference_code.joinpath(inference_module_file))}`" + ) + raise InferenceCodeLoadException( + f"Inference code expected in the format of `.` but was provided as {self._environment.code}" + ) diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/stream_handler.py b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/stream_handler.py new file mode 100644 index 000000000..ab01f5878 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/stream_handler.py @@ -0,0 +1,59 @@ +from __future__ import absolute_import + +import logging +from typing import AsyncIterator, Iterator + +from tornado.ioloop import IOLoop + +from utils.logger import SAGEMAKER_DISTRIBUTION_INFERENCE_LOGGER + +logger = logging.getLogger(SAGEMAKER_DISTRIBUTION_INFERENCE_LOGGER) + + +class StreamHandler: + """Mixin that enables async and sync streaming capabilities to the async and sync handlers + + stream() runs a provided iterator/generator fn in an async manner. + astream() runs a provided async iterator/generator fn in an async manner. + """ + + async def stream(self, iterator: Iterator): + """Streams the response from a sync response iterator + + A sync iterator must be manually iterated through asynchronously. + In a loop, iterate through each next(iterator) call in an async execution. + """ + + self._set_stream_headers() + + while True: + try: + chunk = await IOLoop.current().run_in_executor(None, next, iterator) + # Some iterators do not throw a StopIteration upon exhaustion. + # Instead, they return an empty response. Account for this case. + if not chunk: + raise StopIteration() + + self.write(chunk) + await self.flush() + except StopIteration: + break + except Exception as e: + logger.error("Unexpected exception occurred when streaming response...") + break + + async def astream(self, aiterator: AsyncIterator): + """Streams the response from an async response iterator""" + + self._set_stream_headers() + + async for chunk in aiterator: + self.write(chunk) + await self.flush() + + def _set_stream_headers(self): + """Set the headers in preparation for the streamed response""" + + self.set_header("Content-Type", "text/event-stream") + self.set_header("Cache-Control", "no-cache") + self.set_header("Connection", "keep-alive") diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/sync_handler.py b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/sync_handler.py new file mode 100644 index 000000000..919f803ac --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/tornado_server/sync_handler.py @@ -0,0 +1,77 @@ +from __future__ import absolute_import + +import asyncio +import logging +from typing import AsyncIterator, Iterator + +import tornado.web +from stream_handler import StreamHandler +from tornado.ioloop import IOLoop + +from utils.environment import Environment +from utils.exception import SyncInvocationsException +from utils.logger import SAGEMAKER_DISTRIBUTION_INFERENCE_LOGGER + +logger = logging.getLogger(SAGEMAKER_DISTRIBUTION_INFERENCE_LOGGER) + + +class InvocationsHandler(tornado.web.RequestHandler, StreamHandler): + """Handler mapped to the /invocations POST route. + + This handler wraps the sync handler retrieved from the inference script + and encapsulates it behind the post() method. The post() method is done + asynchronously. + """ + + def initialize(self, handler: callable, environment: Environment): + """Initializes the handler function and the serving environment.""" + + self._handler = handler + self._environment = environment + + async def post(self): + """POST method used to encapsulate and invoke the sync handle method asynchronously""" + + try: + response = await IOLoop.current().run_in_executor(None, self._handler, self.request) + + if isinstance(response, Iterator): + await self.stream(response) + elif isinstance(response, AsyncIterator): + await self.astream(response) + else: + self.write(response) + except Exception as e: + raise SyncInvocationsException(e) + + +class PingHandler(tornado.web.RequestHandler): + """Handler mapped to the /ping GET route. + + Ping handler to monitor the health of the Tornados server. + """ + + def get(self): + """Simple GET method to assess the health of the server.""" + + self.write("") + + +async def handle(handler: callable, environment: Environment): + """Serves the sync handler function using Tornado. + + Opens the /invocations and /ping routes used by a SageMaker Endpoint + for inference serving capabilities. + """ + + logger.info("Starting inference server in synchronous mode...") + + app = tornado.web.Application( + [ + (r"/invocations", InvocationsHandler, dict(handler=handler, environment=environment)), + (r"/ping", PingHandler), + ] + ) + app.listen(environment.port) + logger.debug(f"Synchronous inference server listening on port: `{environment.port}`") + await asyncio.Event().wait() diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/utils/__init__.py b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/utils/__init__.py new file mode 100644 index 000000000..c3961685a --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/utils/__init__.py @@ -0,0 +1 @@ +from __future__ import absolute_import diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/utils/environment.py b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/utils/environment.py new file mode 100644 index 000000000..18870de27 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/utils/environment.py @@ -0,0 +1,59 @@ +from __future__ import absolute_import + +import json +import os +from enum import Enum + + +class SageMakerInference(str, Enum): + """Simple enum to define the mapping between dictionary key and environement variable.""" + + BASE_DIRECTORY = "SAGEMAKER_INFERENCE_BASE_DIRECTORY" + REQUIREMENTS = "SAGEMAKER_INFERENCE_REQUIREMENTS" + CODE_DIRECTORY = "SAGEMAKER_INFERENCE_CODE_DIRECTORY" + CODE = "SAGEMAKER_INFERENCE_CODE" + LOG_LEVEL = "SAGEMAKER_INFERENCE_LOG_LEVEL" + PORT = "SAGEMAKER_INFERENCE_PORT" + + +class Environment: + """Retrieves and encapsulates SAGEMAKER_INFERENCE prefixed environment variables.""" + + def __init__(self): + """Initialize the environment variable mapping""" + + self._environment_variables = { + SageMakerInference.BASE_DIRECTORY: "/opt/ml/model", + SageMakerInference.REQUIREMENTS: "requirements.txt", + SageMakerInference.CODE_DIRECTORY: os.getenv(SageMakerInference.CODE_DIRECTORY, None), + SageMakerInference.CODE: os.getenv(SageMakerInference.CODE, "inference.handler"), + SageMakerInference.LOG_LEVEL: os.getenv(SageMakerInference.LOG_LEVEL, 10), + SageMakerInference.PORT: 8080, + } + + def __str__(self): + return json.dumps(self._environment_variables) + + @property + def base_directory(self): + return self._environment_variables.get(SageMakerInference.BASE_DIRECTORY) + + @property + def requirements(self): + return self._environment_variables.get(SageMakerInference.REQUIREMENTS) + + @property + def code_directory(self): + return self._environment_variables.get(SageMakerInference.CODE_DIRECTORY) + + @property + def code(self): + return self._environment_variables.get(SageMakerInference.CODE) + + @property + def logging_level(self): + return self._environment_variables.get(SageMakerInference.LOG_LEVEL) + + @property + def port(self): + return self._environment_variables.get(SageMakerInference.PORT) diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/utils/exception.py b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/utils/exception.py new file mode 100644 index 000000000..eb961889d --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/utils/exception.py @@ -0,0 +1,21 @@ +from __future__ import absolute_import + + +class RequirementsInstallException(Exception): + pass + + +class InferenceCodeLoadException(Exception): + pass + + +class ServerStartException(Exception): + pass + + +class SyncInvocationsException(Exception): + pass + + +class AsyncInvocationsException(Exception): + pass diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/utils/logger.py b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/utils/logger.py new file mode 100644 index 000000000..c88008689 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-inference-server/utils/logger.py @@ -0,0 +1,43 @@ +from __future__ import absolute_import + +import logging.config + +SAGEMAKER_DISTRIBUTION_INFERENCE_LOGGER = "sagemaker_distribution.inference_server" +LOGGING_CONFIG = { + "version": 1, + "disable_existing_loggers": True, + "formatters": { + "standard": {"format": "%(asctime)s [%(levelname)s] %(name)s: %(message)s"}, + }, + "handlers": { + "default": { + "level": "DEBUG", + "formatter": "standard", + "class": "logging.StreamHandler", + "stream": "ext://sys.stdout", + }, + }, + "loggers": { + SAGEMAKER_DISTRIBUTION_INFERENCE_LOGGER: { + "level": "DEBUG", + "handlers": ["default"], + "propagate": True, + }, + "tornado.application": { + "level": "DEBUG", + "handlers": ["default"], + "propagate": True, + }, + "tornado.general": { + "level": "DEBUG", + "handlers": ["default"], + "propagate": True, + }, + "tornado.access": { + "level": "DEBUG", + "handlers": ["default"], + "propagate": True, + }, + }, +} +logging.config.dictConfig(LOGGING_CONFIG) diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/git_clone.sh b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/git_clone.sh new file mode 100755 index 000000000..714d687e2 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/git_clone.sh @@ -0,0 +1,62 @@ +#!/bin/bash +set -eux + +sourceMetaData=/opt/ml/metadata/resource-metadata.json + +# Extract the required fields from meta data stored in opt/ml/metadata. +dataZoneDomainId=$(jq -r '.AdditionalMetadata.DataZoneDomainId' < $sourceMetaData) +dataZoneUserId=$(jq -r '.AdditionalMetadata.DataZoneUserId' < $sourceMetaData) +dataZoneEndPoint=$(jq -r '.AdditionalMetadata.DataZoneEndpoint' < $sourceMetaData) +dataZoneProjectId=$(jq -r '.AdditionalMetadata.DataZoneProjectId' < $sourceMetaData) + +DEFAULT_DESTINATION_PATH=$HOME/src +DESTINATION_PATH=${1:-$DEFAULT_DESTINATION_PATH} + +echo "Cloning to ${DESTINATION_PATH}" + +# Function to clone the CodeCommit repository +clone_code_commit_repo() { + if [ -d "${DESTINATION_PATH}/.git" ]; then + echo "Repository already exists at ${DESTINATION_PATH}" + else + rm -rf "${DESTINATION_PATH}" + local repoName=$1 + git clone codecommit::$AWS_REGION://$repoName $DESTINATION_PATH + # if the above command exit with nonzero exit code ,delete the partially cloned Repo. + if [ $? -ne 0 ]; then + echo "Git clone of the Project repository has failed. Please refer to the documentation to understand how to fix this." + if [ -d $DESTINATION_PATH ]; then + rm -rf $DESTINATION_PATH + fi + fi + fi +} + +# Get the clone URL for the project +response=$(sagemaker-studio git get-clone-url --domain-id "$dataZoneDomainId" --project-id "$dataZoneProjectId" --profile DomainExecutionRoleCreds) +cloneUrl=$(echo "$response" | jq -r '.cloneUrl') +# Get the project default environment and extract the gitConnectionArn and gitBranchName +getProjectDefaultEnvResponse=$(sagemaker-studio project get-project-default-environment --domain-id "$dataZoneDomainId" --project-id "$dataZoneProjectId" --profile DomainExecutionRoleCreds) +gitConnectionArn=$(echo "$getProjectDefaultEnvResponse" | jq -r '.provisionedResources[] | select(.name=="gitConnectionArn") | .value') +gitBranchName=$(echo "$getProjectDefaultEnvResponse" | jq -r '.provisionedResources[] | select(.name=="gitBranchName") | .value') +dataZoneProjectRepositoryName=$(echo "$getProjectDefaultEnvResponse" | jq -r '.provisionedResources[] | select(.name=="codeRepositoryName") | .value') + + # Check if the cloneUrl is available +if [[ -n "$cloneUrl" ]]; then + # Check if the cloneUrl contains "codeconnections" or "codestar-connections" (For customers created connection before Jun 7th) + if [[ "$cloneUrl" == *"codeconnections"* ]] || [[ "$cloneUrl" == *"codestar-connections"* ]]; then + # Check if the DomainExecutionRoleCreds profile exists in the AWS config file + if grep -q 'DomainExecutionRoleCreds' /home/sagemaker-user/.aws/config; then + /bin/bash /etc/sagemaker-ui/git_config.sh + # Clone the repository using the cloneUrl and gitBranchName + git clone "$cloneUrl" $DESTINATION_PATH -b "$gitBranchName" + fi + else + # Clone the codeCommit repository + clone_code_commit_repo "$dataZoneProjectRepositoryName" + fi +else + # If the cloneUrl is not available, check if the gitConnectionArn is available + # If not available, clone codeCommit repository. + [[ -z "$gitConnectionArn" ]] && clone_code_commit_repo "$dataZoneProjectRepositoryName" +fi diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/git_config.sh b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/git_config.sh new file mode 100644 index 000000000..5f4d61e5e --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/git_config.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set -eux + +sourceMetaData=/opt/ml/metadata/resource-metadata.json +dataZoneDomainRegion=$(jq -r '.AdditionalMetadata.DataZoneDomainRegion' < $sourceMetaData) + +# Configure Git to use the AWS CodeCommit credential helper with profile DomainExecutionRoleCreds +git config --global credential.helper "!aws --profile DomainExecutionRoleCreds --region $dataZoneDomainRegion codecommit credential-helper --ignore-host-check $@" +git config --global credential.UseHttpPath true diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/jupyter/lab/settings/overrides.json b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/jupyter/lab/settings/overrides.json new file mode 100644 index 000000000..4c84693d5 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/jupyter/lab/settings/overrides.json @@ -0,0 +1,5 @@ +{ + "@jupyterlab/apputils-extension:themes": { + "theme": "Amazon SageMaker Unified Studio Dark" + } +} diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/jupyter/lab/settings/page_config.json b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/jupyter/lab/settings/page_config.json new file mode 100644 index 000000000..fe64b8de5 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/jupyter/lab/settings/page_config.json @@ -0,0 +1,14 @@ +{ + "disabledExtensions": { + "@jupyterlab/apputils-extension:announcements": true, + "@amzn/sagemaker-jupyterlab-emr-extension": true, + "@amzn/sagemaker-jupyter-scheduler": true, + "@amzn/sagemaker-jupyterlab-extension-common:panorama": true, + "@amzn/sagemaker-jupyterlab-extensions:sessionmanagement": true, + "@amzn/sagemaker-jupyterlab-extensions:spacemenu": true, + "@amzn/amazon_sagemaker_sql_editor": true, + "@sagemaker-studio:EmrCluster": true, + "@jupyterlab/scheduler": true, + "@jupyter/collaboration-extension": true + } +} diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/jupyter/server/jupyter_server_config.py b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/jupyter/server/jupyter_server_config.py new file mode 100644 index 000000000..7ce6e079e --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/jupyter/server/jupyter_server_config.py @@ -0,0 +1,30 @@ +import os + +c.ServerApp.terminado_settings = {"shell_command": ["/bin/bash"]} +region = os.environ.get("AWS_REGION") +csp_rule = os.environ.get("JUPYTERSERVER_CSP_RULE") + +c.ServerApp.tornado_settings = {"compress_response": True, "headers": {"Content-Security-Policy": csp_rule}} + +# Do not delete files to trash. Instead, permanently delete files. +c.FileContentsManager.delete_to_trash = False + +# Allow deleting non-empty directory via file browser. Related documentation: +# https://github.com/jupyter-server/jupyter_server/blob/main/jupyter_server/services/contents/filemanager.py#L125-L129 +c.FileContentsManager.always_delete_dir = True + +# Enable `allow_hidden` by default, so hidden files are accessible via Jupyter server +# Related documentation: https://jupyterlab.readthedocs.io/en/stable/user/files.html#displaying-hidden-files +c.ContentsManager.allow_hidden = True + +# This will set the LanguageServerManager.extra_node_roots setting if amazon_sagemaker_sql_editor exists in the +# environment. Ignore otherwise, don't fail the JL server start +# Related documentation: https://jupyterlab-lsp.readthedocs.io/en/v3.4.0/Configuring.html +try: + import os + + module = __import__("amazon_sagemaker_sql_editor") + module_location = os.path.dirname(module.__file__) + c.LanguageServerManager.extra_node_roots = [f"{module_location}/sql-language-server"] +except: + pass diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/kernels/kernel_launchers/python3_kernel_launcher.sh b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/kernels/kernel_launchers/python3_kernel_launcher.sh new file mode 100755 index 000000000..ca1a8fb75 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/kernels/kernel_launchers/python3_kernel_launcher.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +kernel_type=$2 +connection_file=$4 + +if [ ! -e "/opt/ml/metadata/resource-metadata.json" ] && [ -z "$SPARKMAGIC_CONF_DIR" ]; then + export SPARKMAGIC_CONF_DIR="$SM_EXECUTION_INPUT_PATH" +fi + +if [ -n "$SPARKMAGIC_CONF_DIR" ]; then + mkdir -p $SPARKMAGIC_CONF_DIR + config_file_path=${SPARKMAGIC_CONF_DIR}/config.json +else + sparkmagicHomeDir=${HOME}/.sparkmagic + mkdir -p $sparkmagicHomeDir + config_file_path=${sparkmagicHomeDir}/config.json +fi + +if [ ! -f "$config_file_path" ]; then + cat << EOT > "$config_file_path" +{ + "livy_session_startup_timeout_seconds": 180, + "logging_config": { + "version": 1, + "formatters": { + "magicsFormatter": { + "format": "%(asctime)s\t%(levelname)s\t%(message)s", + "datefmt": "" + } + }, + "handlers": { + "magicsHandler": { + "class": "sagemaker_studio_dataengineering_sessions.sagemaker_base_session_manager.common.logger_utils.SessionManagerFileHandler", + "formatter": "magicsFormatter", + "file_name": "spark_magic" + } + }, + "loggers": { + "magicsLogger": { + "handlers": ["magicsHandler"], + "level": "INFO", + "propagate": 0 + } + } + } +} +EOT +else + sed -i 's/\"sagemaker_base_session_manager/\"sagemaker_studio_dataengineering_sessions.sagemaker_base_session_manager/g' $config_file_path +fi +exec /opt/conda/bin/python -m ${kernel_type} -f ${connection_file} diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/kernels/python3/kernel.json b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/kernels/python3/kernel.json new file mode 100644 index 000000000..7db91492d --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/kernels/python3/kernel.json @@ -0,0 +1,14 @@ +{ + "argv": [ + "/opt/conda/share/jupyter/kernels/kernel_launchers/python3_kernel_launcher.sh", + "-m", + "ipykernel_launcher", + "-f", + "{connection_file}" + ], + "display_name": "Python 3 (ipykernel)", + "language": "python", + "metadata": { + "debugger": true + } +} diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/libmgmt/install-lib.sh b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/libmgmt/install-lib.sh new file mode 100755 index 000000000..84999cf14 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/libmgmt/install-lib.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -eux +PROJECT_DIR=${SMUS_PROJECT_DIR:-"$HOME/src"} +# Check if the .libs.json file exists +if [ -e $PROJECT_DIR/.libs.json ]; then + lib_config_json=`cat $PROJECT_DIR/.libs.json` + + apply_change_to_space=`echo $lib_config_json | jq -r '.ApplyChangeToSpace'` + # Extract conda channels from the config, add `-c ` before each channel and join the strings + conda_channels=`echo $lib_config_json | jq -r '.Python.CondaPackages.Channels | .[]' | sed 's/^/-c /g'` + # Extract conda package spec from the config and join the strings + conda_package=`echo $lib_config_json | jq -r '.Python.CondaPackages.PackageSpecs | .[]'` + + if [ ${apply_change_to_space} == "true" -a -n "$conda_package" ]; then + # if conda package spec exists, install the packages + micromamba install --freeze-installed -y $conda_channels $conda_package + fi +fi \ No newline at end of file diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/network_validation.sh b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/network_validation.sh new file mode 100644 index 000000000..aac0ff96f --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/network_validation.sh @@ -0,0 +1,181 @@ +#!/bin/bash +set -eux + +# Input parameters with defaults: +# Default to 1 (Git storage) if no parameter is passed. +is_s3_storage=${1:-"1"} +# Output file path for unreachable services JSON +network_validation_file=${2:-"/tmp/.network_validation.json"} + +# Function to write unreachable services to a JSON file +write_unreachable_services_to_file() { + local value="$1" + local file="$network_validation_file" + + # Create the file if it doesn't exist + if [ ! -f "$file" ]; then + touch "$file" || { + echo "Failed to create $file" >&2 + return 0 + } + fi + + # Check file is writable + if [ ! -w "$file" ]; then + echo "Error: $file is not writable" >&2 + return 0 + fi + + # Write JSON object with UnreachableServices key and the comma-separated list value + jq -n --arg value "$value" '{"UnreachableServices": $value}' > "$file" +} + +# Configure AWS CLI region using environment variable REGION_NAME +aws configure set region "${REGION_NAME}" +echo "Successfully configured region to ${REGION_NAME}" + +# Metadata file location containing DataZone info +sourceMetaData=/opt/ml/metadata/resource-metadata.json + +# Extract necessary DataZone metadata fields via jq +dataZoneDomainId=$(jq -r '.AdditionalMetadata.DataZoneDomainId' < "$sourceMetaData") +dataZoneProjectId=$(jq -r '.AdditionalMetadata.DataZoneProjectId' < "$sourceMetaData") +dataZoneEndPoint=$(jq -r '.AdditionalMetadata.DataZoneEndpoint' < "$sourceMetaData") +dataZoneDomainRegion=$(jq -r '.AdditionalMetadata.DataZoneDomainRegion' < "$sourceMetaData") +s3Path=$(jq -r '.AdditionalMetadata.ProjectS3Path' < "$sourceMetaData") + +# Extract bucket name, fallback to empty string if not found +s3ValidationBucket=$(echo "${s3Path:-}" | sed -E 's#s3://([^/]+).*#\1#') + +# Call AWS CLI list-connections, including endpoint if specified +if [ -n "$dataZoneEndPoint" ]; then + response=$(aws datazone list-connections \ + --endpoint-url "$dataZoneEndPoint" \ + --domain-identifier "$dataZoneDomainId" \ + --project-identifier "$dataZoneProjectId" \ + --region "$dataZoneDomainRegion") +else + response=$(aws datazone list-connections \ + --domain-identifier "$dataZoneDomainId" \ + --project-identifier "$dataZoneProjectId" \ + --region "$dataZoneDomainRegion") +fi + +# Extract each connection item as a compact JSON string +connection_items=$(echo "$response" | jq -c '.items[]') + +# Required AWS Services for Compute connections and Git +# Initialize SERVICE_COMMANDS with always-needed STS and S3 checks +declare -A SERVICE_COMMANDS=( + ["STS"]="aws sts get-caller-identity" + ["S3"]="aws s3api list-objects --bucket \"$s3ValidationBucket\" --max-items 1" +) + +# Track connection types found for conditional checks +declare -A seen_types=() + +# Iterate over each connection to populate service commands conditionally +while IFS= read -r item; do + # Extract connection type + type=$(echo "$item" | jq -r '.type') + seen_types["$type"]=1 + + # For SPARK connections, check for Glue and EMR properties + if [[ "$type" == "SPARK" ]]; then + # If sparkGlueProperties present, add Glue check + if echo "$item" | jq -e '.props.sparkGlueProperties' > /dev/null; then + SERVICE_COMMANDS["Glue"]="aws glue get-databases --max-items 1" + fi + + # Check for emr-serverless in sparkEmrProperties.computeArn for EMR Serverless check + emr_arn=$(echo "$item" | jq -r '.props.sparkEmrProperties.computeArn // empty') + if [[ "$emr_arn" == *"emr-serverless"* && "$emr_arn" == *"/applications/"* ]]; then + # Extract the application ID from the ARN + emr_app_id=$(echo "$emr_arn" | sed -E 's#.*/applications/([^/]+)#\1#') + + # Only set the service command if the application ID is valid + if [[ -n "$emr_app_id" ]]; then + SERVICE_COMMANDS["EMR Serverless"]="aws emr-serverless get-application --application-id \"$emr_app_id\"" + fi + fi + fi +done <<< "$connection_items" + +# Add Athena if ATHENA connection found +[[ -n "${seen_types["ATHENA"]}" ]] && SERVICE_COMMANDS["Athena"]="aws athena list-data-catalogs --max-items 1" + +# Add Redshift checks if REDSHIFT connection found +if [[ -n "${seen_types["REDSHIFT"]}" ]]; then + SERVICE_COMMANDS["Redshift Clusters"]="aws redshift describe-clusters --max-records 20" + SERVICE_COMMANDS["Redshift Serverless"]="aws redshift-serverless list-namespaces --max-results 1" +fi + +# If using Git Storage (S3 storage flag == 1), check CodeConnections connectivity +# Domain Execution role contains permissions for CodeConnections +if [[ "$is_s3_storage" == "1" ]]; then + SERVICE_COMMANDS["CodeConnections"]="aws codeconnections list-connections --max-results 1 --profile DomainExecutionRoleCreds" +fi + +# Timeout (seconds) for each API call +api_time_out_limit=10 +# Array to accumulate unreachable services +unreachable_services=() +# Create a temporary directory to store individual service results +temp_dir=$(mktemp -d) + +# Launch all service API checks in parallel background jobs +for service in "${!SERVICE_COMMANDS[@]}"; do + { + # Run command with timeout, discard stdout/stderr + if timeout "${api_time_out_limit}s" bash -c "${SERVICE_COMMANDS[$service]}" > /dev/null 2>&1; then + # Success: write OK to temp file + echo "OK" > "$temp_dir/$service" + else + # Get exit code to differentiate timeout or other errors + exit_code=$? + if [ "$exit_code" -eq 124 ]; then + # Timeout exit code + echo "TIMEOUT" > "$temp_dir/$service" + else + # Other errors (e.g., permission denied) + echo "ERROR" > "$temp_dir/$service" + fi + fi + } & +done + +# Wait for all background jobs to complete before continuing +wait + +# Process each service's result file to identify unreachable ones +for service in "${!SERVICE_COMMANDS[@]}"; do + result_file="$temp_dir/$service" + if [ -f "$result_file" ]; then + result=$(<"$result_file") + if [[ "$result" == "TIMEOUT" ]]; then + echo "$service API did NOT resolve within ${api_time_out_limit}s. Marking as unreachable." + unreachable_services+=("$service") + elif [[ "$result" == "OK" ]]; then + echo "$service API is reachable." + else + echo "$service API returned an error (but not a timeout). Ignored for network check." + fi + else + echo "$service check did not produce a result file. Skipping." + fi +done + +# Cleanup temporary directory +rm -rf "$temp_dir" + +# Write unreachable services to file if any, else write empty string +if (( ${#unreachable_services[@]} > 0 )); then + joined_services=$(IFS=','; echo "${unreachable_services[*]}") + # Add spaces after commas for readability + joined_services_with_spaces=${joined_services//,/,\ } + write_unreachable_services_to_file "$joined_services_with_spaces" + echo "Unreachable AWS Services: ${joined_services_with_spaces}" +else + write_unreachable_services_to_file "" + echo "All required AWS services reachable within ${api_time_out_limit}s" +fi \ No newline at end of file diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/sagemaker_ui_post_startup.sh b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/sagemaker_ui_post_startup.sh new file mode 100755 index 000000000..db7da9f55 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/sagemaker_ui_post_startup.sh @@ -0,0 +1,253 @@ +#!/bin/bash +set -eux + +# Writes script status to file. This file is read by an IDE extension responsible for dispatching UI post-startup-status to the user. +write_status_to_file() { + local status="$1" + local message="$2" + local file="/tmp/.post-startup-status.json" + + # Check if the file exists, if not, create it + if [ ! -f "$file" ]; then + touch "$file" || { + echo "Failed to create $file" >&2 + return 0 + } + fi + + # Ensure the file is writable + if [ ! -w "$file" ]; then + echo "Error: $file is not writable" >&2 + return 0 + fi + + # Create the JSON object and write to file + jq -n --arg status "$status" --arg message "$message" '{"status":$status,"message":$message}' > "$file" + +} + +# checks if the script status is "in-progress". If so, no errors were detected and it can be marked successful. +write_status_to_file_on_script_complete() { + local file="/tmp/.post-startup-status.json" + local check_key="status" + local check_value="in-progress" + + + if jq -e --arg key "$check_key" --arg value "$check_value" '.[$key] == $value' "$file" > /dev/null; then + write_status_to_file "success" "IDE configured successfully." + echo "Post-startup script completed successfully. Success status written to $file" + else + echo "Skipping writing post-startup script "success" status. An error was detected during execution and written to $file". + fi +} + +write_status_to_file "in-progress" "IDE configuration in progress." + +sourceMetaData=/opt/ml/metadata/resource-metadata.json + +# Extract the required fields from meta data stored in opt/ml/metadata. +dataZoneDomainId=$(jq -r '.AdditionalMetadata.DataZoneDomainId' < $sourceMetaData) +dataZoneUserId=$(jq -r '.AdditionalMetadata.DataZoneUserId' < $sourceMetaData) +dataZoneProjectRepositoryName=$(jq -r '.AdditionalMetadata.DataZoneProjectRepositoryName' < $sourceMetaData) +dataZoneEndPoint=$(jq -r '.AdditionalMetadata.DataZoneEndpoint' < $sourceMetaData) +dataZoneProjectId=$(jq -r '.AdditionalMetadata.DataZoneProjectId' < $sourceMetaData) +dataZoneDomainRegion=$(jq -r '.AdditionalMetadata.DataZoneDomainRegion' < $sourceMetaData) + +set +e + +# Remove the ~/.aws/config file to start clean when space restart +rm -f /home/sagemaker-user/.aws/config +echo "Successfully removed the ~/.aws/config file" + +aws configure set credential_source EcsContainer +echo "Successfully configured default profile" + +# Add region configuration using REGION_NAME environment variable +aws configure set region "${REGION_NAME}" +echo "Successfully configured region to ${REGION_NAME}" + +# add SparkMonitor and Connection Magic entrypoint +NB_USER=sagemaker-user + +config_path=/home/${NB_USER}/.ipython/profile_default/ipython_config.py + +if [ ! -f "$config_path" ] || ! grep -q "sagemaker_studio_dataengineering_sessions" "$config_path"; then + ipython profile create && echo "c.InteractiveShellApp.extensions.extend(['sagemaker_sparkmonitor.kernelextension','sagemaker_studio_dataengineering_sessions.sagemaker_connection_magic'])" >> $config_path + cat << EOT >> "$config_path" +c.Application.logging_config = { + "loggers": { + "": { + "level": "INFO", + # console handler is required to keep the default behavior of jupyter logging. + # https://jupyter-server.readthedocs.io/en/latest/operators/configuring-logging.html + "handlers": ["console"], + }, + }, +} +EOT +fi + +# Setting this to +x to not log credentials from the response of fetching credentials. +set +x + +# Note: The $? check immediately follows the sagemaker-studio command to ensure we're checking its exit status. +# Adding commands between these lines could lead to incorrect error handling. +response=$(timeout 30 sagemaker-studio credentials get-domain-execution-role-credential-in-space --domain-id "$dataZoneDomainId" --profile default) +responseStatus=$? + +set -x + +if [ $responseStatus -ne 0 ]; then + echo "Failed to fetch domain execution role credentials. Will skip adding new credentials profile: DomainExecutionRoleCreds." + write_status_to_file "error" "Network issue detected. Your domain may be using a public subnet, which affects IDE functionality. Please contact your admin." +else + aws configure set credential_process "sagemaker-studio credentials get-domain-execution-role-credential-in-space --domain-id $dataZoneDomainId --profile default" --profile DomainExecutionRoleCreds + echo "Successfully configured DomainExecutionRoleCreds profile" +fi + +# Run AWS CLI command to get the username from DataZone User Profile. +if [ ! -z "$dataZoneEndPoint" ]; then + response=$( aws datazone get-user-profile --endpoint-url "$dataZoneEndPoint" --domain-identifier "$dataZoneDomainId" --user-identifier "$dataZoneUserId" --region "$dataZoneDomainRegion" ) +else + response=$( aws datazone get-user-profile --domain-identifier "$dataZoneDomainId" --user-identifier "$dataZoneUserId" --region "$dataZoneDomainRegion" ) +fi + +# Extract the Auth Mode from the response. Unified Studio currently supports IAM, SSO and SAML. +auth_mode=$(echo "$response" | jq -r '.type') + +case "$auth_mode" in + "IAM") + # For IAM users - extract IAM ARN from response. Response does not contain username or email. + arn=$(echo "$response" | jq -r '.details.iam.arn') + # Split ARN by / and return the last field + username=$(echo "$arn" | awk -F'/' '{print $NF}') + email="$arn" + ;; + "SSO"|"SAML") + # For SSO and SAML user, extract username and email if present in response. + username=$(echo "$response" | jq -r '.details.sso.username') + email=$(echo "$response" | jq -r '.details.sso.email') + # Setting up the email as username if email is not present + if [ -z "$email" ] || [ "$email" = "null" ]; then + email="$username" + fi + ;; + *) + echo "Unknown authentication mode: $auth_mode" + exit 1 + ;; +esac + +# Checks if the project is using Git or S3 storage +is_s3_storage() { + getProjectDefaultEnvResponse=$(sagemaker-studio project get-project-default-environment --domain-id "$dataZoneDomainId" --project-id "$dataZoneProjectId" --profile DomainExecutionRoleCreds) + gitConnectionArn=$(echo "$getProjectDefaultEnvResponse" | jq -r '.provisionedResources[] | select(.name=="gitConnectionArn") | .value') + codeRepositoryName=$(echo "$getProjectDefaultEnvResponse" | jq -r '.provisionedResources[] | select(.name=="codeRepositoryName") | .value') + + if [ -z "$gitConnectionArn" ] && [ -z "$codeRepositoryName" ]; then + return 0 + else + return 1 + fi +} + +echo "Checking Project Storage Type" + +# Execute once to store the result +is_s3_storage +is_s3_storage_flag=$? # 0 if S3 storage, 1 if Git + +if [ "$is_s3_storage_flag" -eq 0 ]; then + export IS_GIT_PROJECT=false + export SMUS_PROJECT_DIR="$HOME/shared" + echo "Project is using S3 storage, project directory set to: $SMUS_PROJECT_DIR" +else + export IS_GIT_PROJECT=true + export SMUS_PROJECT_DIR="$HOME/src" + echo "Project is using Git storage, project directory set to: $SMUS_PROJECT_DIR" +fi + +if grep -q "^SMUS_PROJECT_DIR=" ~/.bashrc; then + echo "SMUS_PROJECT_DIR is defined in the env" +else + echo SMUS_PROJECT_DIR="$SMUS_PROJECT_DIR" >> ~/.bashrc + echo readonly SMUS_PROJECT_DIR >> ~/.bashrc +fi + +# Write SMUS_PROJECT_DIR to a JSON file to be accessed by JupyterLab Extensions +mkdir -p "$HOME/.config" # Create config directory if it doesn't exist +jq -n \ + --arg smusProjectDirectory "$SMUS_PROJECT_DIR" \ + --arg isGitProject "$IS_GIT_PROJECT" \ + '{ + smusProjectDirectory: $smusProjectDirectory, + isGitProject: ($isGitProject == "true") + }' > "$HOME/.config/smus-storage-metadata.json" + +if [ $is_s3_storage_flag -ne 0 ]; then + # Creating a directory where the repository will be cloned + mkdir -p "$HOME/src" + + echo "Starting execution of Git Cloning script" + bash /etc/sagemaker-ui/git_clone.sh + + # Setting up the Git identity for the user . + git config --global user.email "$email" + git config --global user.name "$username" +else + echo "Project is using Non-Git storage, skipping git repository setup and ~/src dir creation" +fi + +# MLFlow tracking server uses the LOGNAME environment variable to track identity. Set the LOGNAME to the username of the user associated with the space +export LOGNAME=$username +if grep -q "^LOGNAME=" ~/.bashrc; then + echo "LOGNAME is defined in the env" +else + echo LOGNAME=$username >> ~/.bashrc + echo readonly LOGNAME >> ~/.bashrc +fi + +# Generate sagemaker pysdk intelligent default config +nohup python /etc/sagemaker/sm_pysdk_default_config.py & +# Only run the following commands if SAGEMAKER_APP_TYPE_LOWERCASE is jupyterlab +if [ "${SAGEMAKER_APP_TYPE_LOWERCASE}" = "jupyterlab" ]; then + # do not fail immediately for non-zero exit code returned + # by start-workflows-container. An expected non-zero exit + # code will be returned if there is not a minimum of 2 + # CPU cores available. + # Start workflows local runner + bash /etc/sagemaker-ui/workflows/start-workflows-container.sh + + # ensure functions inherit traps and fail immediately + set -eE + + # write unexpected error to file if any of the remaining scripts fail. + trap 'write_status_to_file "error" "An unexpected error occurred. Please stop and restart your space to retry."' ERR + + # Install conda and pip dependencies if lib mgmt config existing + bash /etc/sagemaker-ui/libmgmt/install-lib.sh + + # Install sm-spark-cli + bash /etc/sagemaker-ui/workflows/sm-spark-cli-install.sh +fi + +# Execute network validation script, to check if any required AWS Services are unreachable +echo "Starting network validation script..." + +network_validation_file="/tmp/.network_validation.json" + +# Run the validation script; only if it succeeds, check unreachable services +if bash /etc/sagemaker-ui/network_validation.sh "$is_s3_storage_flag" "$network_validation_file"; then + # Read unreachable services from JSON file + failed_services=$(jq -r '.UnreachableServices // empty' "$network_validation_file" || echo "") + if [[ -n "$failed_services" ]]; then + error_message="$failed_services are unreachable. Please contact your admin." + # Example error message: Redshift Clusters, Athena, STS, Glue are unreachable. Please contact your admin. + write_status_to_file "error" "$error_message" + echo "$error_message" + fi +else + echo "Warning: network_validation.sh failed, skipping unreachable services check." +fi + +write_status_to_file_on_script_complete diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/set_code_editor_theme.sh b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/set_code_editor_theme.sh new file mode 100755 index 000000000..f295052c5 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/set_code_editor_theme.sh @@ -0,0 +1,23 @@ +#!/bin/bash +set -e + +USER_SETTINGS_FILE="/home/sagemaker-user/sagemaker-code-editor-server-data/data/User/settings.json" +COLOR_THEME_KEY="workbench.colorTheme" +COLOR_THEME_VALUE="Default Dark Modern" + +# Check if the settings file exists +if [ ! -f "$USER_SETTINGS_FILE" ]; then + echo "Code Editor user settings file not found. Creating..." + mkdir -p "$(dirname "$USER_SETTINGS_FILE")" + echo "{}" > "$USER_SETTINGS_FILE" +fi + +EXISTING_COLOR_THEME_VALUE=$(jq -r --arg key "$COLOR_THEME_KEY" '.[$key] // empty' "$USER_SETTINGS_FILE") + +if [[ -n "$EXISTING_COLOR_THEME_VALUE" ]]; then + echo "Theme is already set in user settings as '$EXISTING_COLOR_THEME_VALUE'. No changes made." +else + # Set theme + jq --arg key "$COLOR_THEME_KEY" --arg value "$COLOR_THEME_VALUE" '.[$key] = $value' "$USER_SETTINGS_FILE" > "${USER_SETTINGS_FILE}.tmp" && mv "${USER_SETTINGS_FILE}.tmp" "$USER_SETTINGS_FILE" + echo "Successfully set Code Editor theme to '$COLOR_THEME_VALUE'." +fi diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/docker-compose.yaml b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/docker-compose.yaml new file mode 100644 index 000000000..d04f00995 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/docker-compose.yaml @@ -0,0 +1,77 @@ +x-airflow-common: &airflow-common + image: 058264401727.dkr.ecr.${AWS_REGION}.amazonaws.com/mwaa_image:latest + network_mode: sagemaker + environment: + # AWS credentials + AWS_REGION: ${AWS_REGION} + AWS_DEFAULT_REGION: ${AWS_REGION} + AWS_CONTAINER_CREDENTIALS_RELATIVE_URI: ${AWS_CONTAINER_CREDENTIALS_RELATIVE_URI} + + # Logging configuration. + MWAA__LOGGING__AIRFLOW_DAGPROCESSOR_LOGS_ENABLED: "true" + MWAA__LOGGING__AIRFLOW_DAGPROCESSOR_LOG_LEVEL: "INFO" + MWAA__LOGGING__AIRFLOW_SCHEDULER_LOGS_ENABLED: "true" + MWAA__LOGGING__AIRFLOW_SCHEDULER_LOG_LEVEL: "INFO" + MWAA__LOGGING__AIRFLOW_TRIGGERER_LOGS_ENABLED: "true" + MWAA__LOGGING__AIRFLOW_TRIGGERER_LOG_LEVEL: "INFO" + MWAA__LOGGING__AIRFLOW_WEBSERVER_LOGS_ENABLED: "true" + MWAA__LOGGING__AIRFLOW_WEBSERVER_LOG_LEVEL: "INFO" + MWAA__LOGGING__AIRFLOW_WORKER_LOGS_ENABLED: "true" + MWAA__LOGGING__AIRFLOW_WORKER_LOG_LEVEL: "INFO" + MWAA__LOGGING__AIRFLOW_TASK_LOGS_ENABLED: "true" + MWAA__LOGGING__AIRFLOW_TASK_LOG_LEVEL: "INFO" + + MWAA__LOGGING__AIRFLOW_DAGPROCESSOR_LOG_GROUP_ARN: "arn:aws:logs:${AWS_REGION}:${ACCOUNT_ID}:log-group:/aws/sagemaker/studio" + MWAA__LOGGING__AIRFLOW_SCHEDULER_LOG_GROUP_ARN: "arn:aws:logs:${AWS_REGION}:${ACCOUNT_ID}:log-group:/aws/sagemaker/studio" + MWAA__LOGGING__AIRFLOW_TRIGGERER_LOG_GROUP_ARN: "arn:aws:logs:${AWS_REGION}:${ACCOUNT_ID}:log-group:/aws/sagemaker/studio" + MWAA__LOGGING__AIRFLOW_WEBSERVER_LOG_GROUP_ARN: "arn:aws:logs:${AWS_REGION}:${ACCOUNT_ID}:log-group:/aws/sagemaker/studio" + MWAA__LOGGING__AIRFLOW_WORKER_LOG_GROUP_ARN: "arn:aws:logs:${AWS_REGION}:${ACCOUNT_ID}:log-group:/aws/sagemaker/studio" + MWAA__LOGGING__AIRFLOW_TASK_LOG_GROUP_ARN: "arn:aws:logs:${AWS_REGION}:${ACCOUNT_ID}:log-group:/aws/sagemaker/studio" + + # Airflow URL configuration + AIRFLOW__CLI__ENDPOINT_URL: "/jupyterlab/default/proxy/absolute/8080" + AIRFLOW__WEBSERVER__BASE_URL: "/jupyterlab/default/proxy/absolute/8080" + MWAA__CORE__REQUIREMENTS_PATH: "/usr/local/airflow/requirements/requirements.txt" + #Project configuration + DataZoneDomainId: ${DZ_DOMAIN_ID} + DataZoneProjectId: ${DZ_PROJECT_ID} + DataZoneEnvironmentId: ${DZ_ENV_ID} + DataZoneDomainRegion: ${DZ_DOMAIN_REGION} + ProjectS3Path: ${DZ_PROJECT_S3PATH} + volumes: + - /home/sagemaker-user/${PROJECT_DIR}/workflows/dags:/usr/local/airflow/dags + - /home/sagemaker-user/.workflows_setup/plugins:/usr/local/airflow/plugins + - /home/sagemaker-user/.workflows_setup/requirements:/usr/local/airflow/requirements + - /home/sagemaker-user/.workflows_setup/startup:/usr/local/airflow/startup + - ${MOUNT_DIR}:/home/sagemaker-user/src:rw + - /home/sagemaker-user/jobs:/home/sagemaker-user/jobs:rw + depends_on: &airflow-common-depends-on + postgres: + condition: service_healthy + +services: + postgres: + image: 058264401727.dkr.ecr.${AWS_REGION}.amazonaws.com/postgres:13 + network_mode: sagemaker + container_name: mwaa-292-db + environment: + POSTGRES_USER: airflow + POSTGRES_PASSWORD: airflow + POSTGRES_DB: airflow + volumes: + - /home/sagemaker-user/.workflows_setup/db-data:/var/lib/postgresql/data + healthcheck: + test: ["CMD", "pg_isready", "-U", "airflow"] + interval: 10s + retries: 5 + start_period: 5s + + webserver: + <<: *airflow-common + command: webserver + container_name: mwaa-292-webserver + + scheduler: + <<: *airflow-common + command: scheduler + container_name: mwaa-292-scheduler diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/healthcheck.sh b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/healthcheck.sh new file mode 100755 index 000000000..a9581b549 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/healthcheck.sh @@ -0,0 +1,34 @@ +#!/bin/bash +set -e + +POLLING_INTERVAL=1 # seconds +LOCAL_RUNNER_HEALTH_ENDPOINT="http://default:8888/jupyterlab/default/proxy/absolute/8080/api/v1/health" + +while true; do + response=$(curl -s -w "%{http_code}" $LOCAL_RUNNER_HEALTH_ENDPOINT) + curl_exit_code=$? + + if [[ $curl_exit_code -ne 0 ]]; then + python /etc/sagemaker-ui/workflows/workflow_client.py update-local-runner-status --status 'unhealthy' --detailed-status 'Local runner health endpoint is unreachable' + else + + http_code=${response: -3} + body=${response:0:${#response}-3} + + if [[ $http_code -ne 200 ]]; then + python /etc/sagemaker-ui/workflows/workflow_client.py update-local-runner-status --status 'unhealthy' --detailed-status 'Local runner health endpoint is unreachable' + elif [[ -z "$body" ]]; then + python /etc/sagemaker-ui/workflows/workflow_client.py update-local-runner-status --status 'unhealthy' --detailed-status 'Local runner health endpoint did not return a response' + else + status=$(echo $body | jq -r '.metadatabase.status, .scheduler.status, .triggerer.status, .dag_processor.status') + if [[ "$status" == *"unhealthy"* ]]; then + python /etc/sagemaker-ui/workflows/workflow_client.py update-local-runner-status --status 'unhealthy' --detailed-status 'Local runner is unhealthy' + else + python /etc/sagemaker-ui/workflows/workflow_client.py update-local-runner-status --status 'healthy' --detailed-status 'Local runner is healthy' + POLLING_INTERVAL=10 # raise to 10 seconds after startup + fi + fi + fi + + sleep $POLLING_INTERVAL +done diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/plugins/amzn_SagemakerWorkflowsOperator-1.0-py3-none-any.whl b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/plugins/amzn_SagemakerWorkflowsOperator-1.0-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..3f14c1ec58eca6c157f982638c536126aac1d168 GIT binary patch literal 23090 zcmeHPO>87fQugj+7w8kxzC8e9DfI~1esq`J{u$5oZZGSx+aAC1-?;7Z%$QNVa(A`6 z+|^YzRn`8P!9ueK4u~7#4$>eYaY5qBnHxglvJw*F$c+<1zy-d@pUTSWpXr|WqXp6L z^|-4lG9ofEG9oe}vksqp@(Z8N&}Z{kUcO{M#6RE1-|Haiw!PpwUa&0JcN5Dp!`s7= zO@2dbV!IKwovi8X(57J&T)8bLnvlNv0VHR z?&SDl`@-qjT_>_q`CCGmR_OIFTpy#*j)I;c?wb5=Z1rp(Z6m|&g+Y`U>wE+bS(`$E zHAzvLX=5p5lgr0MpUh4WbYpV}CldF5kT~Z6dW`Q>n1j%X>?DXL!hRrt3xz_{v*Xw} zl^V%AHK%oPzFIKw@$H^t)QsW~?sIZ17FYw;S+qFIcIp*-lyaMWEV+7B7(EvrOg`R> z{AjKG-qj!d;Ag)&Geh5vX|WEG0hCARN8EPB{Da*yr5}&R@C=>CrTA8s{(VfTSBpl#UfLR9Y28%HxuL9O*%%>aSUROO5ZCpoo2<_~hlI}tnIc@ib2nz6a5cTYYT5wi!L>xIT7TKNJtYq9u zAI$1pg@Nb6n?i-acCE6gp3XDwtE^u}+MMC78plvGX4!%^Qx-|bxD3vXBrwh$(Zp$$ z0051{|1p_DJ2nzK?pkik%o4~BL)GB3vJcZtDuzBYA`Hf8yPm_F((nnTqY==DP6(9U z{K)ak@~4g7CCG_yXS4eU$Mr`C2Tx{S-DNp#20iGRQw28mgRsKHNnwIaAEr{uG#$8fgiQ=CA1`nl zIj{R}GoO{;xO+vahpW2=mi&XQ75U{fU3b93akON)`&T$OgTGFv#U?`w95uYGwBNs$T2Z3 zX*q2}hU&`b#*WukRwhLu3=2k3J=Bdt%Y~Dx8E-QtFE=YCL{XnDH1I_^TZ*qT?bEp; zTV|fgL53n^Rbm(<8?qq}a)N~pg8!_I{R|2ptNwoWS@&Aq5q_SmT-=9qo|`vQY4V1K zY`|?bgM@TVD<8>#>|neyMZ4?2i zUF)FIrq!f*(H{>TGhiHgKi8CI93b&Wf1nK_Ahhd@qK}g!$s;qInEkNGz?F?b=aj7Z zb2GSdq6jO__^g=9x%djr-eMLbT7+Kb0>`;|Zc9iLA}8rbzOeooKDl?YFk_=cg$0NK zRCK~LV;H}0Q_&EGqI4cYUBHhHz<@Ynilp#-Kru{+ZLXMsnOD<+n$stJj0lTdCE2kL zAfm9Wm_wDB+jlAqol;DiZsz5rn;i_4vU=1H#r9G(`3$KH z`dwX%)cmm$5pkscAP1S92NJb4$(+e)oAg0^E`JDyQh5AU zkJaEwrIS8UQ=s8Pb5<0<%qlUJ6*tuULi8mTgrqh22qj_A1CGa3qu6BYb2CSI?z7Kw zcPy?ZY7RIoPk@zyNEgtO!^!bryO>M)yuw_&xMgE?f%R`d5e<@7QfZZ=gN<|Uiu1~# zUfW1TLP0XNl!V|p6hbl;FR9j8_LRsZC(ca*1DneDx&yk#an#Q-O7Wr@dyW$_Os3|1 zRF}D2<1p~itr|BTy!LUIV|3HWc3p2RR5Tetq;wudfx>uxi9U@Z%oszIVW`t5G4SIG18C$H$oCH4; zC|)TE4-ko$p)T-5Q;`vkGK3_WEGdl^lw6L3)v^7S=a9oq98LTs5jI0VvZB{T2+;u9 zpeV#N!XKrIR;){g#8qMo=2*!@p#o~?w^T=UpCqkugsxzwGo__fo?I02{1ZXbCmKGd zG(@Uvm@ten8VELwI(b3uteCjPS0)?mupf7He@axl&TXw-d`l?KW?OC?diE`I3s@DK z;x;`LCLDK*%J>li`ml^mjp1NA#C7DA4w#wpO3qR>xTM9^&zr0#5+(_HyQNt{!Z8}f#iF-Hc`C{{>?sS767_NME%gTZOiF4kpc5dKU4gg3fli8YcU$}S+Yvufz;DM zrl5WVb!IsclVmz5Bynf#aW755NY-^wU_$bgAM{y!Zq#7Oi#k1m%>iZN6+uzMI+>*( zU5)zD2(pm-VC#?yRS)NKsW~qBQpjT1Auk`tX~9RSvcU!uF}dxz z$t_EOQ%)>bC=*4pud$Xzn)4AQXE~+iio}w5;CZC*q)>GGFUl>MVi4WQ)q%3h-j6SX z&CX_$EX1+4t_5B##W1ppl`g5&LaIh2JaBFa7c#v%wf3k$^yrxzwMfJPO# zgpjJny3zOD*Pvze9NS0hb|0>>l@?40kZ0OOX)G(bQH3D}!z))vuOrchx(|xAqB?{m ze;hhZx9w7)h03v!afuoZr%u%b*H0}wRgR?@5mh}DilSL67Nc(0LKz6QFuEoGPOv+hb(FY7XQCd; zd%V^~OaQu>q?j{hEG{hSe5UBhZho*v_jVQ`Dz#$aD9Wo0zZe8f&#K0V0wRZ+qCPji zJV#RCnIR)z22Gv4m;q`Gl`v$6h@+s$A)DOOx+k(KUqww1I`RJ{Jxa~|pDyVQv7l7g z!?Z+n92?gi2g=K8&IFknH|bn5UK6P>VTBz`_cqH>VJRS6DGU8WN?UK)h-XViEAVHr zAq7C1snjg?moGGmxsNg<;#d3JL)f1(NOLpwkZj??ShnL^zuAcbKj_D>kF<;-NU>`n z?PzMccqts&JeQ<~{?OWkTB&}EdO5{wa&EzdyTN&o1kE6F3_R&0xd%bQG`dvy_K;&# z7GVw@u=`$8<tJatbXYVExg({XutH+? zQU}yV8rZaJ9aIb|fW$BT@z8N4{)X+H$Tb~RTpcpdz&PZtj!zqPG|;YfP&JHzQx`fA z7auRa1C0ORnV6sCmwXgl0#8~R$Rycm1(h#q!6?G2^88G8l=MaTh$XeCe2QVtrd~zz zjhF$2v_eX$Z6b#lZ9q+?p~%8h(4$aPgbRpH*-j>AFta_8#Sr2pP2{NkxcXuw+pspk zqB1aqOjA`3tliR~^?Ad=^?N$J&~XkZE_8^Yip}ANKFYO*&I@3z;zm8w^pyi?w-lyK zl9hMH5hW!NsFJqb#bSPa#M(8z33KwdGQ z$fWe7nti$|GS=8bU00|tB6U#PAIJ|3!V-LzO)V*`L`q=tqrlmINydqOZ+JUxw8jpg zq?GX)@)kBTbb=N$^EFYScCeL#)ef-@E;UgEukw11hY8OZ9bzVR!RAx!g9FTmKSiXv zF4&+Frp5>HqM$O>ObtqLOYl4)3Z;?!oXKRVUIk>G8kfVCN}#g8l;|bZQY_Ip-Wfa@ ztJ1)xfz5ZuPKy$z+3dGU4-=#FW46#&Cr>TLjvwPl!RVBw@gM*4(?9*inHl=lr^h=c zVL8>#dBLZd-#g!6{L5t0&qumZ9=VVzz+D1uI#M0r$}>TDdJpynOAD5ias4Z(4$~jx+bJB9>E*nd4YIEFs$D$f$^P+% zEYKkib2HZHSzZ=3N1u9JUX=4`cLaG&%ZM>L*FSv z3yJr`p@k_x$@gC1 zyaCgJ|DDCUj94^HPE{0sCR4M6B&^EP^2+Q8VDdB>a7r5GN__g7C3_5kYw>^&C+(lQ z9H!XkUU(=1<|k>WDfvpQew}IJagl`LmX(#*wafBmd81(hY zR~buaBZ}BSyXJF)yfdnJE{fi723)joL;4Eup3%BR_eBNq!oe9T)C|~2p%jXw`RhKA zv05b?Mp61=C!#goWZu=X*aMu^w=A9rw=CngjiOn^zXK42nvhzSzWUWSfRii8?C3_a zL7WFr4Ic*!*(8iS4K?vQ4hRAnperrs!%3Ky{pt2(fxAp+@qf-uAZuiUzG|MvFR ze;?~Y`c83ln{5Tjx(2biB!~-zbi;+^_*WJxsZf{V>A}&Ht=)suhE?BxhC^Eg(w2cE zC0yHut^_e<&VgfY03+g2oL!(DM!W2EO0H9X^QQgF-~R5*41MpTV|MS2Z>6h_Q+bqL zE<4K=bJ4_x&ZJChq=miu@%rZa@%kP%Ah+zqE|^Ar24O6Z##l(3 z0Cl0!@AYi#O;_>401I(p(}|mr%MP8FH)v0dpOopyA`a+b1NQpFo#Ulbtf7MpbI^~Pw3(pUr5)p(AT1Nq_H1=cg`2J_#_>8B zmbfg`11_-*-+)rNsLb^sWH|PF2otHMM+)yxhfng#`>SGkRQYQEn3*Z|HT(y zAXe=ZLN}DvJ)CqF8;i>6EGf$(6E&djfvrYAq*r4=5{K+?ydg9+9?Ktm4z-G9Bb*YW znGhQo+X`|PEyH)NvD-=z*>#)9=YZ$&y+%atF-UNOR{&6P7#&_`x`#QoXmC7K1V(uw zh5*7_#AO}4*n_>u1Y6L0B}lnx8u06sbg|pmQB4O|W7Am2&e0=+j*TM+{s?= znuO85!qEaYF-*_kE>Wukp= z(liwcX(Cm&hc%Vy774|@swm#o)LA*YBa*vXF(iM0ok}p1y?a2uX+SHELIgP3;*aq6$7-R)x5L~O^6RKS`}4}b{w}-;eV3>9DyNU@_1)8s z<9N!SkaO7PQBM$|>P$Y!!iEXQGv*e}7b<(;^E*vC#S_Z;qkG6Ki;1-<5C zx$I*fa~a9QLe2&L)vq0G7r-Qae>gR>Nf26|bLDtua+9QXB}d|qzx%T#yx?bszSDcz zH*Q#t?Y5Icdi?$R-`c+fmyPer)O;V+Hx77X{PgAaa;MSXIw>uxSY|=^#IFNo>OQ|-BQ$bv zhx)2yuLLFfLUd9GIPR@cl7sNM+jma3PoM8~lgjSRRb#Pxe)aU|dNba?@^^ysc5--W z?LRtLy^KrC4~LEaP#!4ds1;!(y)Ub6W2g=3H{Nh02|p}fS62K@e{HF`vwr1NnlHkA zr}uRGQS#bfT6=tSxP<_vd;eKzJuTh8Us)ZZ=|gEtFZ9jzR#6<^<8Xhw(cC_Iz4zjJ zBR-Cgj-Q3WR@e{Dqss@&PGhD0`1zy8ZDaSUzgJqVR3;uD&<@MTz8=c&&ZUpzc&)lnv*Y5KZf4yF+JX~FxbbLhu>>INZlHT~< zdhy}r)B0uWc&&2O_v|^?59ogOXqI^BcK{_ep8YkBQ@ajAW|-(73%o>UIp`olN(v3M(0R+k@4Nsfgc zlGf6-6Yf>~?#gCk#n}p9M5mSGQVAM7_SULRbaAGV)*52F1CJ9{r5wysy!OPH3^iBg6UlGyrr z_;|Z{v3p+b9>t$;``26bZqi-rzX@L+Y&0LeSX(K-c+`rXJllpSr=-QBi&6<8%eTJ$ z=_jLKABnhyecr#LKSRTjaVY3@lJfKZ9fg_-#gH&$94dOfr2M>p=i}!fDrM(oYLUI{ za&#Bzb(8Y*{@q{W=QyN;VaGUz>GhNH^Zwm`toa| zf8tJ2n*G5?P@2Abv=>Ky-oN`P)N{h_NjE;GbNRhFiq1byPv^^a?Vr%o3A-kJ_L#2a zYlEt5t5}UrNoTUI-jcqB&0^pJ-4te(UkHG??$t z6UZkA6oG%3ntgP_?%@xgd=tqiZc@n-%7@4PhZ^?3U*n1%lU!y7NXFfcGMFfhO0`G}AEk(otO zdg|#)h^owcBTk$+apJ^@6X%?G^5sAH%YS%{pMUu;{_gj``|#dB`d5E(?Hd367kD-w z9G9nqSLLifUo3~C=}x~tnv53xe(&t!Xf{19ss(z7)5)YfT#TlZdGBzr7>uXK#pv{G zI$IQX?PqbLm`wjT*eyQ)^rPF?Hvkhr21xNq4oso-hG?mOIvtkdd8jfTm6OHY>Evj1 zT;!Dm1F3T`n3v&;*SrT{e6hL~%8W~|a(6mjo=&!l=kl9~% z7+=?N2h+v$6R-ZPoX_#{`t|F-4sBf*B#O^4WOtK6-@RVo19BdX#$|spI4ySr=>7R( z_M+G;9!)2u6q}XD09!90z32|hqrq~#*kkc6DUUuAkEDWOMyO4d8W2vA?N+hhQuL>< z%h_x+Ea$sI9OAuQfL66;`bUGq#dLPDHv|p0t_zYtyXg1Nrt^hO;_kd09~op4hd+Cv z31I%6)Z;6DIwbM8=yPYcQnYtmF1qpccJbZ!TibcvoqK%1zxw3K<7ZNYf9=Uv`rs@3eeeEn??1oKTKY{(-F^J% z(fzwp(!T2R$4{O=c>L%Yi`!Ry{`~2ky8=YMSW9=F-~A0sKH-}!8HX6RHl3Nw35;eu;^HTrvMQab zB^$us`Q0;X!CP*r3Wgicdzh<>at8V5jXtp7U-7je*sHd?TJ|@|OI?Fh%yc?BZcodz zSvkkLIWGpqGhafAuO=hNv|*uZNio#nDQp!RjK|Y+R#?u3 zx7)>FGAvFx)+z_@EP&6!aseqCWYlO_be%(FHQ3rMo}ZM(ax(hk5||G`1a^8>Opl5M zURb9CfZ24q=|$S$TJEawelRkJ!u?gT->5;&Zs1%|MmH-n3w*~Y%GC3$F!uXu2T zVoDy!hhj9x7Gr@yTw>~M3ipIf~?m;l%$ zxb^zbUtM^Qh6!q{ZIJ6g@)j&ciGGV&u>E8)Xl@nl?bdpSQV z4@XBADIfPbkxGPby#w}jY?N3mwU}Mxs3pC_a*mx#=zi1C$_AKfK6MCc_C6kgE!YS@ zaaG(i%(5a8ch#|M{tIP_!MrGQER}e5?Wl`AR)8z*G)PhOC}P^zUh1xdg>@95wk#eD z6OsxrSyo$X^KG?;(Y~_Swt~>&_k9QP6e>y;qAj7VAoP8;Rutv!z1K2d&BmxKMEo^& zz*ycF7xIhZo@yGj72OOLw|>R-D2_}jBc7TfHy2qd>KzyxJO1h6Xt03Lq@>NXqcCo$ zx|~gtC7t}khE&UZU4`CWDY2kYvN=tQa)>qiTT51KR?y1x^ z)7{hZbh;=559`*W*>YDU!J3^&GZ1Nf?bfGm^fB|8vad7IX1f^Yio#$Nm)pl!^``ww zGLYD^U|48PoNpImGQ{6!pA=_<#R@lFhfUVPd2^ufPuJHiF}vzW~MSduk)qp3y9?A*VBHZ|K`tCR z_HD{M`{W7K2i4!3x6BTObzAn#p^H)VCz0*(yYHJFLJpoy{3x5|(7iZxUMFVVZTbMp}c--p%!@J?3?SFErd7nnZJ?syK zt9zqiceMCbYBy4qeQS`}H-&h+|r^0y91L-8D* z(?-RI_C~+Qa+NWVg+~nwUfa1v?ISEuvn=RZ>>Bv0>IU?g=<027P{=jq4PZUd(sfgf z4YBL>t3YYduiWAz<5@R-ygHrtUzHdA!EADA^T(GDpB1Rf)22ofh!G~y3Rc@d5_oat zPS?9OJBT&ZPdk(GuNPP|0g_^oo5;m}?7xnE({dFEVylOMTt8hM3znrj!e|&lwVJR_ z$45AG>@Q}6!&f-H5n%(P*4qs0!`~7VY^VwfQ+NiSi}yCl?cgsr=qq}hjeR;MZzuhN zTzxNNM}uQr6=c%sVQzi9#VyAc?U8Z8h{{7cF)**>e3>UjYD6C$CXK9`oyEb094S)> z#sR=#(qt+}%sfZ}N500QINV0b0{GMQhX#wHW4ziM4Ng1BJg*-Ji4b0EXNh!4fHew@ zgd$=;jlYZO0o}!7Us6KF2E_jfYq21PgW#+yfq^oKlT@~~Ty%)!@xg_F?Gor-@|?e0 zr*14ak0O}1)&09cPk6C@+{dWFlR+5mlA#AjG#ICS*rMXsNaPw4#ht>NiMScTlaumh zio;{83NUDEkp`|N_1I89KA-zx80GPe;vt;0@-a&~P1YPuhUJ^$BW!Nr)dJ^1wb&c; zre)~`5Vp!;;DZnzoF+(MUqYzhn)1yeSK7KGIWQk>3v3>q(#elr1SJmz-HyG*{WO2~ zgz@&^5#)oxIkdH1+`1i*h>8pt42k%OZdjR}f0H(+nz{M9Z z0TlN>dw0rg1X_udlj#5$oXy}1>Z)7EL8+@I>%=l79EI@?X|!W;81tQ2v`%%BIs)MO zyj=m87n83@2ACxia^boT0aHeH^*w}H4LfQtb5Jr2Yw(C={|<`?rFB@ad+ELHDy z7)Tx22g9@WYzem=pT_Sx3=Vi+DCBpi{wj!@5&d`8*?HvY$i0F6LpwW)`43O~MR|G# zyV-OGZ|V0(cS41`j6i*#)Nh0P!;Hb=^y~*4fbw+KFAqQNBi^i!_!v0xiU;$%4#EA0 zPmB9^KQ0)?mVkZtG1vg`W`l75boO|1|M26L^MKL^6#Ahgj}!k8n<9A0W4$Sp-Ta11 zZ$*bl33LFh1W*QN@0ae4VBbI0cSshN=PjpFV}dH9N!I}UpS0pUZiQqF@|%eJk}VFTGItJsedc)3YY&mF2~ z&VJL%g1x+1RA;%Fsqy6jym5dx{W)|?{~h-A$@PMLu?FECC>P$b~bLBqUmV` zC2595kO~eP0Jln4P<|8A+7_OtbiL6WN|2mXFxtUGUO+sF=4&D}$mJn!c1~pQQcA=0 zjG#(*(2b5Kh^GtmC98S!t#ELXN85EPfSitd`OoAKFcOr_nhrwwFZ$fyO9>%yt+`d#$5R#hRFmf!N8D2FWwu$Bi~@>m|;bq|{Nl zI7HymG5T0Ulwu>qHGiIn$3{YsjS?G}QKG_J=6l^VF|wXImE*Cpb4;^?MN&SFCVNBk zfybLvc&`~!TA>1}e$ZT(7!?N*$IDNgLxue4IgeTXzy9Zcv-{}AwQKy>Z3;4Ibon{E zFn{{#{JMSPAdW`|{`1?>85cqI&R-kAT+4$X-t^3nAfe5OI+sa3NYY@$M=i0cu;{^(Nb0d zJ?4p;rZo9tv{+3EO+tbwaLXUy6)Wg(7x96FsV6FthVEm)R87Fg;>peWNV}~j;loHlOoD{9_ z4BrR#v{{ijV}yR|lz1VX#thJA6aFV09={-JgHgJcOht-|*3?H3Z@=F?93!~p!vSJu z@#n)==lqr|NziprqL%;yyU-IPU-c_x;P$x0*+4gNM_@i2NRQ`RfEQYiM~b%m<*;;A z6=MdS0%fj`aUJQnXU%`+omWdDva$Dv_yA{Wjf3GEkxWdZrzUBQ{)Pj z*s`Vca12$DkQx9679=0Cl}(CJz3xM5`6(4?HplK34x{IDqm2|qhdMha)6;S%Q1BLy zd3Sm!xT8dj=wQN%!z8uCWHN#r&oFqmV~ zETBkt_Y-OJBC%2^pk!a<(^R%~B3dNE;j9Z5PBNM0e6ySQ(L z3QGgtWzeuH$Q{;(LW6_+X4uq{Yh4DfTICfOg3ai$LhT5cJ;~H_wQM@EStNE;@Tq8Z z0MM$|)nOT}69g*IO=$zvsI_edCJaXuaZzAGIqLNfmZR}7-CT)MkVGv()>JD;!;%}G zWU;6f^BzURQZCS&K+6U)FUC14R8AU@IRt_=QL<56uK;v=3G^4yw0snt;bUJ8Mvxvz9L|g zbsVF;Qgt^gk@T&GXkam{LuXSs7B%5nD`e=JZCRJ#O%P5jpnC979}vepFS=0|Y%pyb z&_3F}3kVzu*^$peX6dPsN~B4sLoTLiqE;-hl*_aARU#kM>LhcFE!JA|s?h+R_k@*d zM6Oh-*I+F#gat|!tK>m$Ze?kH0-J;?>64Z^!Bku8T8)s+5F9NSZfhXoJ11-%M&w)V zMIoERxC!IaSjMac)s_-_0WIcx5?k#+U^Wb6|y zH*QB2WTn39a$4RsFIR2#Y3z*Yu)D5I%iLc9)yh}F+T#eg&{8wa6W!z0hNe4NrSsCjl&fXkyt#%E1&ib|sx6L}GfDQ+1;wRD>t*&BtYN2Uo<-FimRRfoQpnrEmD3LSk7z z1K9|mfp3Q^#{vLO+V*}wI{Tb{gN}AQ6yTFtd6chQj@!z?#z9Mfm++_8^}jceFb<7) zz?`2|PQr^^eSxeqzRU`OR9uAYAV`(L zGG6Lz{CXYRw`8SWpW9Yuv)L&e{_bHQY@S4~^6LF%JE(QenH-A0f0! zF6h}VUL%kE5S}e^HIY5TuBi|Ax>E1(i4qPNJ!KMadLO~&W^63(m;nP^y5WL2_x|Bi zAmOg};w~LPoI+QET#0qT;D{p_HaPRAeJHw21%U|YK}bFU+yy{m?8q4?J^dw*RD#g~^ALx~odj>?ZF zKy+S0IJ&YLg&WuulQs;FGYoP7l$gT9J`F1}1A1aVt4jkB<6doJK6C2-eey;e&&`-4 z*IpWysl32@ViH-AkX;|a^^}AIzrP6fgQF5tftR8njSu$X$8xnvaWvq~QE{pHF}REp zXh+tn_rYp`8`H`1C&gMhCv3)EUz*O_z*zq3J+agkM~J-oQ5PZ~!p(RgXvsBZ01L?U zXi$MQWxnaSa95m9C-#GTPcfxeHC~V)yvrA2nQjUZGCCAOkRbE&hZ#yjN>ObuE2@v` zMGvM!9?wLWTx06RPT+8f-ELMAs;)gw3{LeUv>f@hD6c`3!fh3L@?Hw)pui+!j^p{d ze;3zG;nv)ecMBG_Bhb6X!g8DnJSo?=a-c%znO=!-7j}r<0?N@JCY_@5RK^*vK{9_)JDIW43@a) zbB0^ceniw8TYVe!KcCJHMnjya{di=rH~BV*Khp!79}n$ngO@{^BBymjq_Yh|<*5eu zV>b!m#HiAlU+$?Fax!_Q?8;mKVXEs@VYZ2+73U252W%J8Emxe*nB=3mZ_~RdiqPx{ zOc$BpG^i9P`w(C+g1kccD4Oc>Jgs*V6>m1wG#Q{pE4M=Z;ots8yI=k{e{qff8Ur@n zc)246W^)z%vo`%%j3Y)A2?iD(p*ouSwsV6DXONF}%fZxi(3k27|a<9v`dF2a*R;IBfNr@~bV%)rb2nY}G-J z6UNRg4E`k9S6+uapFn*O!wA-JS{=L87q+hRT*x1fro9J`dFwY8Ely}SSi>5>=zoJ# zU4+QdN^^FB#b6>oyGIk7S3=FB@$9pt}Ynujf%I*+T6f!o{ z4iW-G2B5g_SaSKA`4|sy+jXzFw-mW$rz1E5+4jc6ju>XU87}jb?ggN*kG_;%zNGBZ z^P^tz8|<97i}O-*Ajbmp1(Z%UZyiJJ!RskJjOg+%-Du8;%1Od-AIVWjcR$Kln8YN) zQGN6JO=aLyCkDVM{HQE70L$g5!bJmzCxgjxNjIQ5nI-T^ernFa(<-+uZ|Ln~ zA=@~yoeq#42;+bhl@NPzdC+fYZ!tqL7q8T)DO2@EzdpGB7=rgT4ZRo+BpzZ^vN4=X zJBd>djG?H_3%Bx<^`s`41B)2%)1HGvPX{Vq#2h#AD>mncuvU|iMD)aa1qA`{AI{4K zmP|2e7sn3^o+nV{I>ed)$$0{Cg|g*iSsE4t@PQl<%yBsI%A%v?wU6;FC6mqDTg9X0 z=|MUB9gd!{IE}E%V%CJ0&qO7>kDT4%(Vf|BaG?j@9M7V-RZL*bm-kL2(fH=e1CbFL z+ATG3yA}_FNCr?Ay(=nX=}6KAN^bWgVFk2=mX78PK<^r*6NM7()8{}UxP2gydy4}x z-|q-HI!W?)_QKi|k!yVo4+oQr?g}2+((zz-R=22ZowekPx-yGK5G(Kb!Q{p~7!Lx; zg$Ks1C>rH4`bS7(&PON;Xa6>5~F<#AMp$aXKsP= zXr8njj_6K-B~wIlW5~aeGqytPo8*%46GdhM6zhwfL<*UIOitU6Qgrjq%1AlN5PS&` zc3b4adOnO~W+i?yxE_QWW{$8>l`E4YHA1jq$N+`We3#+y@rC1M?sFg#CD#fdf1ZQ) z#o0i{RVYFYK#uI5Jdir-UO=QN{OO1o^h5~|(2GaJKVXTI>(C3+IlzS?o1r)id1wXz z$#PG;`tDxZ)|1QHY# z`XkAPqvD}HEC0Aevf!b<>z|I^pv$(jXVvxzF*3AFbO9b6zFd)mN~C+6=GiParDN}u zACuITRyhJbfzAefE(~9B6SmHq!E_*7Dxx8YK7e7ruVV|Z&y-MMgh}y8%T0U1rG^`~ zeB@TquAM58Z7@s}R&!Z0b;|2V7P!^|dQ9G$**E1xo!#zd2G2VApxkMMJO_@fK2yDC z&wr<`FyD#piXbrH(q4v7`QJ8tZzgtZM;JhoQ5&X@ggXq-A5r z>Ls`-9UU*Rm4P~^(Rvn6X3z2}ar{6wVY6-A$zlRRR38Wd>3l^(C=PiEjk3z0Z97yK ztD*l54Wc1aL>pU6UTagygK9gr#mM^}d#i+mMu5=#{(eVX8YD}1*?FNd4dPDvo$kA6 zA#FUyftk5@DK@W{5(@hAOnjq=OgjiC;A&HVz6SNbSM6p-sMHyNsz5*lD|1#wbTa$U+>lk)my~&IV9heTl3aNn9uaYPYl6>=S98aEa4MdG|<6dJpoPI3W#>3*}X}{BU}(CVr4Al#nWlWXKS;cndTYH z4p2SS=#^|`(1XP^5d21QHbQdV0rG~Pn+ak^HDYM2Ivo*3w}7r(9u8;%qbFCg*Gd7I z?eY`hdEex=aO}4?T;h!4?6@J-uNVGX&P&nOWy_<$Eqw@KX09n9cMuV+`vw@1o_WlB0 zTWx$0q-D*UuQnt(ME=!{RWR9p_kAF{mx5Y3J(3w<+4C@i`uRh(ucV;Bj$&N~A2Kk3 zCj)!<7x~elTX%DKaXeq+*bZg_ES_ebu)Q)yQ5!Jxbz3=@u)E1D01Y{ZGd>Gr9!)}R z(DEsGqxcG3OCuQA45N!-wH=9D+=OGW5@D)v;X4_??YNE0Nst8M$GbcL&>CYL#KS4Y zu+o-vCLNRz8-NM!;_1SCiT{a(_&oOsxuNFb%EUt=Nx_v)b&Do_P4>*JEwKIsK$ zOz(%@n)sk|A>Eqk{CQ4t=?M$(Sw*1=L{|Xp_{MFc+Q#|G2JQ zRjnw?BKa>M|h*H+~==^-vJK^4J4PUMoP_M= zu61LpH~<61F$C4lr<0p_Bpg@)Y}{ydF>F~s!%}6W*Tu(0nT}AuO?W_Lb&cZ5vd>Dc z?n$ChF%zAQ#7xwbA~Ya;1L0e$b8^EhV;}V4+6cLM2=}Hry1H)V{S!!(V+WiF=w3K7 z&CB65YH%xajDsMsB`zdzyvLy2q8&-NQio?S$(0Bc1<3BUp?>)Mkq2U=MB>#I{!8{e2In&Tk$orYHE zf$(mvq&=yt-!+{jtWhQdWwHul!SwB?pmDI+gVdr>U6j*zm4%p9gN^3v7}pTElLh$c z+|}UCxCCXo)(}TgSk+FU8Of$E6`j3?)bwJUZSGfb^Mm&=24@$$5)lFvP0PjwNK0ouj^$p{%C3Kq?&j za@pV%;nL#kw+P2_-fOFm)$9VI2QgQ3#8Ql7styE*W1+z6$NiE_>*X0;UlhCMR^r-2 z&kd*w33fUqPT^lFCqD>YJ3U)m2)^`n;JQNXNY|E|ZQ}E0fXMv{SLnUAo~b(8Fg#~C z-qpu~(>4w-;s{~BJ7mzaZcRt1G_l=T{tnhyIl*7Nt+7xWv&u7rz?p8)48u3^=c}r`Jo+nW<^8Y29ZxHCMriMp09~ ztE2Zj(iFgS&yWqA=%p*wIhKe5MCmVs1cqoLqp7W+g$)Q-d8oj>xWDz@JhTz30`c?@WIZG)#V;^v?P~?Ji^)Bz?v-~`wt?fTiSEec zukA=N?z)i`_GzeUb|AeK9{9A)z)F)KjS$=oEa zkrCmUfp1Vx%#|kD4XRNC1z&zf;j6N~h-qQzynoRC_3aScTp2(cVx{SPhb@`m${wn3I;8*MLvsx0z} zM%6}1!=770=3~c*WoQxWs!aG=4}YleK9is&CK{1%H+??J8%+DqH&PkNF-%PX zJIl^iCz))$6DcT5t*C&qv0wuk96oUKv&L_%+aR)a|Ag8xvbgF^8*Oc%V4`$f>TG~Z z7vw09gy8%J%@#-OV)q3b%N7#z!z@VB*Q|>q6vbX-o}O698x9zt7N?hU1Tgg-P7_eG zyW7Cj9g71vlFtEbLOGK#UPVdzYnk%uw<(Z+4H>e+aazjA0UY7fJC7+|M>(?Ym4W`s zK!0VR&!%uv>S$@n~^@X`zqq;KD z&#p}Lat_{f5O8IppIw>g;lXlcqKDhWY~iPUS0;K|3gU*j>AdU8L@(BoHuF&26;tQC zGSRPehPg7)yUm@ar&lI=@iqJVG10$;f_-JA*O<~PBmGarNPlS_cB}C_n7?cGXA4sl zCo+wA_Ec^1$b88W|G+K3=3~d%51k1i0>xvOaoq?WSBGVs9BS$Vo)V(UXeK6<`T5}Z z821E2ePj3@!zrQ>8)+LnY=Nf`Z4r$dMsv&&PckcS9Uu?=D|o#@L#hULq`@0mFa?e^ z)UC~8i9)1QJb=#i1)>Y9zeVJ*Zj1?W8xsF2)#Lez)I+b6SWZ^<2$o12h9IOgfzf|} zlmpe22_TI&q37J_Gg947C^rD5Gpo2I=Zv&x97OgY zIf4v6ICtF7@IJHYMzF-!cl5r}n@ObI``=)}E> z{>aQ>@xN`e)y9Nq6KKYnHJ)rNRSCL_^VDMF2r}osryc@_Ifm#tItA2ImT>}#C`~7v zbC9JU=?Ss20V)3&hT?64?`nZ}oZ@uvhzWHBtVboPV*;+Bi9=4#GCVaGMc_GlQPYJD zOO?`@F2EYBxUb$|$(2VuJh#HqVlN48Y$(lWSAn}o{1PMvwue~dt~VXi{zUJEw3N2l zR0?>{`$8TxlzR&))s@14QXnO8x`Ty?DA zsvR)sV+s1{F7T!-K;~)>k|o;@^0;F1eQizm0xJ{=PBDJy4Gz^n^MBB<+0=@lzeT;G zIr`a`Y^>xpJoW?R7|X*(MN6n@7~#!YEu&hpUDII6s64FGHdxx|9xLTUWD(={#_V8{ z48?O3iH>sD;_Q9|Ek%4P#a;-<%Ew1L;@!O??xM=};$n?=WE%#m1UG+pR??^28G*A{ zr?VSmvGGN6Blx~+><}Lda%UZqyx(5yo`5*itI1p+SbuhEax8>1%l; z5pw6ZNa;x1sM8HvI=av zE*T*_vp2dj*lfoq9P%u zB6RcEMgTQkVBa>D|b z(+xy`>FM-rgXZkysRxxZt7e??!!G=t&*q5NTAY{Y6>prvn#yE;vf^8YF;0Dfm{H8T zHwT|+cg5*>xMlGzk)7dP&8`TDgs%d7vn_d<^OO%-W!meOmNbeOWFr+G3(PF$J5CgQ z16u45F~SU$n`~r{znChsazig5)LI3xX8Bpz-9H0EXKK*+$^zMwG)cF6$t9Z}%UjL4 zR&-+qvL_)^EtLyd;V3JZh$?RKxdz^49xc%x0*jm>U8{r;vI5B8GvOd2BoCsoMOJIb z5K}(R5U2tRl_Ud`L1jbyptu*s2n#|oy!;Uit67b~_rk12fra4f}x-} zOk{*zj*%31Y{Wu(Vln$MK2}cpIUk8_m8xRf;+i+YZ7f{klhsI8wlgyB})q!2RYm)9B_i15Qh;M5c z@Y+#|AwJX324osABHHAIus7qAg5b#4D*}@Vi}GzpOx_?jSh*_g@+%273*d8l13Yo; z=JoSsEsSr|Scd&qgF>G-g|HzUQpx3TPX-jc+B>Y4J{?v^MqS;Fl3vsp>zTPUniu)Bb5Ahf@5lL{M3!mvC;An6)7B$7qDHGRrO~awe zt!zn{%&e(KkQK5Hx>ih#F##(C&Zk(jBv@I+z`AKKFPom?2>w69#hV(A zIi5}>u05XjJGnd9;)FTEFNlAsFFU>B4wzRv6gaQ}m@{R_dQ8@VSr12gA`WBjR#ix*+9oVFF}v)N{?z;^-oa%+0osu$mjLa)N|LtqBV$N~fW7AGIu%C! zk@8fBDL|U@^DZN%5P~&RI-c&O%{DL(CUVj;AIBfX9U*ku6&w@k@5>({7m%ATiUBVY zGUcdiTNONBswn?%n^V{m=fHTz3S;>O1MgL#B4UYbQ;+#Yeih%Tx7{*)47-&(slh zxA<6}1w;RC@yRw-@8_`bkRDu{Z*mKEQ*~{cdv}XZwH8k+c8j0u54mk=xA=wr!kNcz z@mKntcQ5T0zqC3?UdH^LyTxC}2f)n`#(4>T7^dN7COrCB(7G8ONp?8yQpY14NmB!( z=5v5FF^gMRAEe+-+MjQREAwtjk9ya?zkZzw8eppwQ@^ZXu#=6EUJL0##Ny1JWBIeQ z4EW!I8Z(?=O>xeF%93CM&(x+vc0h_QA(yAs;cf#3-$fiafEq~RsYGI2Tz}2c-3Q3?mD1>UWjL^TYP8_xCxVSz=^?ynltS5 z9eW=bmgwiVDB&i&U6j4!UUBmiC8PBqoYh06<=t62y3Co@jZ6 zv2A%HEi{6YW?O2lz#@5NcL^!8$$^T2%U?v~>{cqP5K+sYr-B@AfzRDp9@&K1V zHKgNndrhHjzdeWV&sl&WT*b z{eWuh!1jGExAf>yJyse`TqTL8=wl&^m8>v4LgRWsoSw+FtskpyAVe0E6?&y9t4te^ zUSj>h88u&FpUQPl?|l749vvVo<7_%pyFWTAV3v~+eJnCiLIefHViiz)lz~#0fE=?s zPw(rUBf*|VNkzmOssbVs2!EX7qrcIYM~|O30LpL>D&0ZSsi;0Bqrx0y(CPG6gODMA zOVha08X;uYb7n5gJl|51W;!58V%3MlPDfWN`=JUHy~MRUK~C*2$)B#09c41lQqycgdvjF>y=yEC0E6#bMF50|v zn2ivdU5^}^OK=MevH^+1Iv0m%P1jgslfF6RFyZuORk`k?si$6keQ#N^-d#RjUl(Gd zUKJ0erq2o*M3YGf4NWi9mg~X96D-_urMG>CpBzk`mg3N{J)OI-wMCZ7ljox~p08bbot13ga-_ZFN8tB7Z^#Zk3Y9qy;2t`@2+;ZXo zWt4kz2@DQtVNh8hET)duR>FvuC?Xz-bdkcd)B9#RnsnjerFsnkWo_U>-FDzxNy^)` zCl{RumQ30PhI+`$59Tk6{SW3Za5;=81;^DT2WXNjIp5@m49KNt73tA{J#viV@~S_P2y zCp=P|8p(R+?7pDhHqD-P}h+HoP^5U3CrO&F1IR*$^qCvs)QyWlPo# zx0#!%_@6v`{K&5|l4+)P0jQ1!J=nnLsy8|s**)}0S!FNQ(ncWP zmxs6{84-pNhVU;eNpuNABJ}7>n{~zfoAcEx@4W2SvGuVfXhI((v2mm*#CGZbNt(q2 z|E$5Hdp9Me0nLkuey#Pnjz~{T7l=W@c@Hv@@NPF5JQju%77KqHQm zCLHV_hjM?s-(J~?+yYP)g2*hQr($wbCl2`6fE3(v-6c|O&I5OEJSr%O+>Q@*wq~uT zt}>U@WNayD(qa;nG8HC17YPqNX)sG}$Z@HWAit>=6Pd<={19qPY$YS&+p;FLlDI|0 z3Q)ZULwQ#zjC(_7WVlE}o?<4y8ucLI9kdhKe}(MocvJ*ZcUL4=IL&5&^sKbS; z0l6@vSfPFCfO@&DmgwYy4OZb?>5AeRlo8R#ik+s`_A``TY(X`^ensry7T%n!{Wmb> zvG=(dyL(fO1#k|8;5(j9#gvYlrjSUK0buEK*F54kIhP?aF0&D#FqQ+ph|A~dACvc zo0d_CaDTW_IL3_?3m%yLFawcv;T;BI@a6%ph}~c|&?q^7|C2$%zQ<9REKd(Wb;un7 z-8?BOb0N%;x0Fqo6xNS-7>d#4!6rk2ao4uqPA;vO5!MCO(W={-uUq^J^Idw_%fOAf zWgM#0;yn*VAWw2Vmy0Komq*kc*tW*-+I!8*{N9XCm#5q@OR!+|VNw!7hxL;7P=_6> z5d4I@q+`qA2z~s$&^wX;)S;psHdUw0vJ=OIMky{O(3#L7e9Kp#usljRki^Qta+89M z%({UIW7Ebf<|<;q&uJ?b4HfEla>UN29cbxiRz%8dtRIB&ei#@d(~l#`M0pIw10%Hz ze87~|yfcV7ZB!EKP~W3`bn^n^GNFaSquG@O5q<$t4%%gvvst%*}-@KAdL1>(E!xAcM3 zz=Mx;u5G;b;9v{;g~=LST$|fuF462TD|_>DFgrZyHsHUHB$34Z#eT=zmUEHRiY%Sk zlmBaX5`_hU&;8T+F^Ds3RRd+YL0TKc!=ka}c);rv8Id~Y(P9|2Y}xVkJ29T|#3n1V zX?H@UDEKfSI;hA^T8ZGffeTA`!S@*gf;C)CC}ibPQ4J~N2%ZUo!T~;c1uvK6nQ1Sc>5zd+w zW8MuJ5yf}dMv}Htx84I`FC&hg@C|}%j@r!+r{(NWocjp6$yVxBHGp2vQg;04_Ha5L zBjJhw;LU|_AHg{?X0&@AV9S;flP58J&jU22j#NT^o?0LOU)OD>C<{PhVK@Kh>C0T2A3#?FWVZsTqfC*E&(9mT$8I^PCmJ(HO+RI>+ z`62#bsF}0kr4iG5KNwo((0FOIv|a_R8V7=vi)K!{OoKJBvDqdW*ZFFKi!A9a2$4h? zCKs$@n^J>gn+=s-CXWziCpF^%LN2gyadvsJHy)fG49&kSopQVDCa=f}mC-g&($-BZ z&&ty&%nr+m3M8DfDmFPLe&s7pF3gBbTLF^PU^01()- z{qbacfo_#Z$ivl0oc^^a*I)B?;Zk-s#fl7c*2{HAE;-Ml%N{LmG7OOF;zOf(i8KXo zCPyhr;smol6ryA!x7HEtmgzP4qB}Od(G-x~k1VfO{=d-E#3=_-xM*~q{7V!X-L2)oTwxyO? zTc~z`Go!a@9R@HFg3A@-62-#&TnLZ>Bk7u*0g{fk>Iy^}^Aw5Dcv=?PuV_ZRLfdp0 z%rSw;rJlI?NU&$-mkk}c=A`Y#NIH{O(ARKqHV;!QN7$F)e z8;a@DQhQ*APK(Fn-?Nddk%Bf+&wyzg+5>UXpr#L7`3OHhWs)Z>12@*u z3=A1Iwn^LDYfz3mDfBKAZ8Xmc3JN|bIe8$|e$&$PBJXi!Dto?(23kgJgzfU?TO#e= ztu50}DkvtwB=F-ooI!q0aDqA1saMWfpZT=PnRLGL#5JWIUduqDM6TQQ*FnGgxwN^C}gD# zU?OTlt{9&a#K77l_h6t);@&FV;)Wqt0LJ{ShJ(8!AS?jWPY5I z>bB|Jr_R&r+o#W%VeOE~v~(Y?+?4P*2?Pp`!a|emEI}lB6-H6Emc-Lk4%yaZeI>Yt zPuO8*g=w=|i>o_+W;NMFg0%(o$({?M9RCqXEEly(HBy+Nl&A!2sZR+7V&s_}%vcr?%f{*lEZFjBEhuo0u%Kso!X>%uw{T zSmtro$2BOcT@#3B4F(8R$A+vF_8^rQ#LA$?G+|mWfMvOLh)ES*|CO~FK&-*6!TQ=r zFew*+Zh{wU)X>_8|9o8D>dHdicCy-4mzI3#XjwC|#YyOt%Me6Ctf8*0V2ALnJ1!Zb zz%T|18a1Mrn+v-N`xtYLs3?l7m5?kfSt7K*8N42FAv#+SAm?swE0TL6C}Fh?X%*8# zAaSx!mkX@Ix}<4NFg``7)ERd){l0n9AX> z#A3!2ZU82*W6$(-j1O54;s;rsbUom+6gAkgMz}ZnIUZvhwLG;TKb15IiqbD8=8&`@ zOm=9ETkbesuhE=|Ii`3tJaGsn(1z2)CG+xbY4^j?2t)_8S&33e5P$+5Ai=-p3^)T2ghcWXQ$W*t+sn<6Z^MrC+E=tkG=3M z9#&_#pg^MM#6sXW#n8X#t4vP9R`(pL;{E(yz|f7H1{t=(h*7<&AVGG|8<)ZIgXH8k zaU4C+rV78wE;UyWmg-~PaFnq3VAsb9{&@5)1O=8CGxY=*qP5t$?Jh179h{0jyvwpN zR9A4Z*V3H67o}cgpnZ#$XIK}slClxcZ9Fam%Mp|M@Q6SozxDqN0+uSSJw=vxe!$c; z<1TU|#kq?KC`eHte+QaKx+4YpeJn*bY6KZiqF98V4wi(A=~9(>d_ks8Ql=C~@~LNV zIzlipGgef5`UQYd+ULc%#32DgaxuLj;=w>X%y`K!yHNIC5_4%Mcd1cOIP%~^fq-a< zUJlAAZT@n0fKvt?#tJ4;L=jM+5-f#Iq?|fdieVJwtgYg2ieJ`Cu#_GPejUA$I}#oU z*~bME8%i65BzTS0_|Y_BMxU@9AOS}6=`Vlr(d|%~s{lL<@;w+qU@*9Lcq8Bnd7?-Q z3$c`cSgb$g37qG}@;Cms0dZ@Qk%yP7v-p;N z7rykiqW8-Jo_onK?jcoLt#HmA>=`&D5bLtzu44{|^L68I%SwfU8Fr$S>x?#Dtz!dR zlMcQMpEmGlilcH>kAz9?wXEyr7)&S)G}OwZ2eU~J8kiEOCtEZCh78Ai&_L(VZHZKC z>^I7GE3Iu6@S-B5dIb*bjpF8C-DEPUzv_L&KR5CBCad6aMtK(IXWjf3x z@Nim17K@_$7!*R)b6GvNizq+Pcf=&WiP+!JDJB8OicD5FAl>Aj5MHt;yi4Ho0g^U} zRYtf@(k!FB?>_!MBs{J!3_QI!o9Xb`8jDLwse>Q|WYihhMyiwKOMXCQOD$66n?#37 z%*Jp(k`>f)_RDvgaIg`QCjGmuCoop_UxSChZE>Z4nz)b2zD=z)$&on@^QnVo?KXy8 zC+a^2EjgjI!)$r4;G=Yo*tW!J*V+#Gud6_G1|_HG8Ok*HEYlh=%ltbR@jx##RjIV{n9w%m3 zxDpUVhLrRssDa7@B6YaUD&GuF={Pc+9{29yUsm%0GYD!EwzeNlu?N*HAeSMX^rgkv zr(4OChp@OOEE_wkx`4vR$qn=yMC%QigffnfthcxsbiN!dRstpq7u{%YjjlTEGE=W-ZkAQhCPc7ALWdnCxIl#tZMoWP2(=hT;9dG-C+Otk(q zVAcv;wxsK`CCU!j%V4;n2_)Rj0A(WrqnLP%8#~0h9+jFK zY%{da6hDuT%;Ld`%DW#7H=6<6q6pGo%%I|7rGSa#4x-Hv+=V6ciTr*74IV%4a_Ze3 z#HoJ+5Kl(9SRFpzuv*k5o!OsoPoU;l6+r+&L!} z0r=EVMK;=Tx$|v#FdOVVfe#N5{%kNu?hX9dxi^@M<|p`;w|10dt39PxQ>dW}mqHiE z9zWs0C51p5eVt90$0r#$_FoS>l5xt$6`Po;@>^&qK!|m8>OgYllPBH;qvE1QZq7>^UIlzOAXP23=vqU6e-=2`TMWIU%!Xtm zgH&NfF+>vFu-n!k1~?u{DjtxdDo*66JX9uPo3zet{eGGRqa3pj3c0 ze<2CnMET#L`DSN=X(m|7(eI8NgY3#igzyzIvk|KjCGCZgNqW0Z$qaQ;O*`m%e8}d= z<=!RvfvaUpn90EA=x~4$Ng2+OkKDI^f~g!FH8C{j$7}y{SA4+U%?I{s1Xt zDXMWg6eSbR(|uO%#jkO1C^;V89^SGsq*u<-=ol%p7)rC3{YoG;vB6%`L#<LC(HzIl5e zrcf#kN;iE*Wtgcz3e6dsz2zCODU*_Mb+`mZoA>(3(+3Y9Jb&=Drg48}!kM#i^X6Lm zUte4(KXCqQA!kbVoUP=1lc}Gul0t{TSpqmuH<-@&*{X3c#hwg;ijZ}ZJ%j4U&7U>` zQ$7lqUl9x8JNAums78TP7C$G1&ANo9Kkps3-X?fKi~IGUm@$?=^66Q z&vF6RL{5?)c#2z5PGj z?7aAIyZiqffB!Il@v|*`a8nel>Udf3=N=$Eh{6Ia8Cq#o9Ycw|P`G!DJ=0nDc7#;7 zCnwc9*ewnak zJho~ivh7A2n|;6dC%h%jf|!Nme1V~(lEkeP|jKpck!>{%&; ziuE@8-Gdbk`fIndTpZo{Wnz6k>dAD@g`V~72vE|F&CoGv(j@PZ8D!y80A38yHFAWl zE4_LR$Q)G(hOhA$S09nyzR>HFOr+?e_T@U9{c8A(;FmhY>yfzujyea`zwJcTmwLHS zOps5bkz5P{OCDN;G03`>RuIz@#xKN_Ny$(z?SIhAsecMfV)R891%(quH&o6@^_J3? z%)?I;jf0y1=c6twF^b?+5J-SYEL2E5RgDMC*GbN%yWGKt7|$rBQl4xA$@d;$5QjG~ zY*UrE-;$PXr=^qAc5c-T*F$b%{UVwj`K3`i`dyV;RMK6+yk)8M_sZp_A;7^JBB?yJ zI+BJxinVv#OK?!K35LK{C^l#kBC07-Kvq~sA$x?qgGJ?usBDgDZEZD6 zj6m{SWB6!)3Cg{`Sg6fY9b|k%H(m*$s z&iNrjHE*t=esH$Rfh0KP92Nok!Feiqwu{VsAwRz~yM^d%Kn{yKBg^}!pZ5^_lnU|u zB}t%jAqSC-x41H5`H*AOSWX=naVUC%qr0>Tl3Uc83KW1C9Zzr-vWQ;oC{UIi1|=B| z5U4CrahSlXeI1#`XJK%iZBRKY+8iR zqHR^sdFtoxmULYt5hN0HT=Ca}e8)(`S)bI=s<=% zESij-G{L3`judjz3@;+t!o%nX1r1o}sNPoZ;>SpRbJL;S1T6Rf9?)5dCjoNM8t~DX zWc5T$6CfIs`g#*$V;RKj%gyX^=mPPJeLqjp^~gcvZE%b%=hb!$F$&VW0$Buj@a&VX>Cj&EftdnKE;lOkBVVQn+X zm)Eg+MO+J)$G0%D*>JxNiR8$K$?!krB&!AT~Q z?0P~!mz&%w{=OBd(Zu0t?KG0fB6{6Iq~uqbvJtDZN`C0M{8(T zaN4}YJVJ!XCHt9+_>i@?~kd6IUOvnT7Cv<{|>y0z4$nJxA>vEi?$9<BBljwLXJHD(3y-sjtCT;Z|KglWr$%>#%Y8eg@%mIxtD}_((;TfO;!o z<$$XL=;5Ih3OS&FZ#<7B^M z71PV)0cLq0Q-o({G+)VjGH3 z3N%H#-f^$VP?G~AV10D}zHqA2auP8p`GuN_NF1Hq6PiKeT-F{483YE`HGL)`B{}>~ zM+g_=%Hg5tE~!~j`hQST6&6Im92NIRnh@xPhWTN*qeX1ifjosJQ02NeW%QeGIU>*u z{dxmUEEDWpe|`qXWS(HaxKx*e$rdL+Hzt~HNbNn$c}0C3`vk6b%Cy|HW(0SiRx{7L zqbV6Pn}KNTZaO3F_$w=;Ow19+DOcVKH?4{RuUe1h0Wk(9Dlpr9fOANA@HeabAZ70-l4#`H3FhrF>aX!bwZa(pR9h^EXTsKZMWQEPpfVcqRmZl+t1+w zQ7{zZwk6%r%;_5Rc5&Nime=J$W|Y^apA$0_0JO^Vemyka zkWkbcG@XVNUs_5;OxmbuTF}zgu5KBQ3IPnAt88&a!>gR_AY>Z02edWB(fXyDm$2{1-_ngzha!Lz$)IQ1c{3Ojr%~)T#zF_jZ z{yG)p^|u+h>aUwbY`v5lU(>TP$Butfo0Q~dtb>RK%DqI6<>hjv#@2yaf;n$^YzgM&h6*L ztm2UY#PX<}hCZK$I zd7B;*Sh6Z`s$f?IiW$zGN7{ciGUEk7NhE?zT29W`&v)ou7QLACy_Q}^unt-5x!&zp zvh&GsP0ukP1)VPt2Z60{7y=GO3yJxPJ(Wz}lnA6a<`b;!5P2nTJwhx7Jp2;$Dl4g0 zk$r^iz|&b4g#=rQWj&5a+N~A}UB$(TNHA{M6nK?p>u#0M{gZT}E&}wW^RX&NZKc?e z`n%0m(bjd3SZ3>V?#Y$6rfm0yQDw7jjF2 zRy{2UTaLqzSuDny%dv_zTVWSTwqki{E#yHP0)`UK3kzhN*u;aM7UiMRGvR=IeMyd~ zxht(86O{+>t^s>%{>^!TSpO+S8~s>A--3Yy)0W(%5pQ7J5O*LO8gEAgGrTyEi!z(A;VhCFfaFcS)5LT`A~boy zYa4J1JR2ZUoNQ0{zeJ?lXyv;WxdTpanO7S6n6d6YQpY5N6}o0CF3H3XI_N=Ap%(6J zh8J;PEJ}$NB8yYoR|g{g;>Q&9d=RM)?B|a(@Dt7Dk9$x`^)%HF*rH6xOU^y}W&St; z5ZOdXI!BPL-Z~z~fktT}$BXJ!L`bC55l#e|>BRDSN!BJgM3yM5yuumM*i03!<#mdg znR3)9eDf#s*g3B5#4AbPl$XUd*I^V|pmGqeWE5#qQ#Kuclr@8h`$6~{ z|BI0dx+V?4)Szp_$--)BQkr96q}^J<`u^VAp}9GveDsI@SI*ox0R(C@#aOn|_3fe> zO2QtzrWq*T2zWc`Um)cA>+AX;ddaHR_IkT`NQcW>tdLho|E5jojgpsYsG=06ko|ko z0!w!>E4t~z0D0lkV5=g_9R&Zj51W@t8qz80s|N@YR*Svxt)(qMfyp%R5PoJHR3kRG zFg4{kK`8~+)_=l?G}xrQ)dO7VgK(@4ZXLESmNrTArLxZE70?wzD=`9z6Jl2yP6Pg0 zh!tlqrc?kKG2(=bneaF>HxXE|KAWX8t0b*NLaJ;Pl)Zg~p3e#36DqdOW2kD;*Uh_# znh_}X*A6E~i^Uu3d+|PwGvJE{qwr*ka6kM7HGHjyRtGWWMM;>}B_bP@q+9FY*U^Q% zaq$~__(D}dQ}vW}>{OV>4)xphRB}`k$SkAuv!his;uz@UIC(S}i%|u0PoH*3>Ta0;N9vh<(-Q7)B(KOo1rE50JXSY*#Z$ZZMRHh4DP*w{gJ#Seh-)NyJgJ8O z%#-uoCo$1gU>OqM`7htGr#;T!H1#VlL6qXu+X@-8Vks4V`hT0sAcM_go+~yrlAfQH z$@Le$s~#}Qj3>7?4DfnqE_*&fHWV0dffo3Yrck=gmP6+T{Pe>|jGY*F)E;EBMe)o_ z+5Kh7Lou$zJIm&{=@5A_LbfoWc_<$COuTL(6w+y_c|AhWGG52P6Pxf{L2Oav-;SJW z)a+p9fmvc|Gw-6-!hSd-K8u@4VIS3AgnCF^($N^gYP;Ce%I%gMExel^g~P;ocV3Q> zi$@po0fOe`kerb?D2kuaAR@~ux^CzIpG5*(~?211{0Y_ zt_vA1=X@*KZG1-*MIRQ(h^2!KEfNUQe-60i1REVo{^Vr0%J+%sG^>|o0m$Dp*<|w) zKr5cc<*zJzSu_wB%jzm=Gb2<9W`xjn^QVy#J{=lLg)NNi$Yr#pA=L!NM~Q*KT!8m2 z@ePdqq50ab7qT`Zxu{5;eiKDHiJgap<|k)6OkI5-nDrXc6?|y<1C%8{{4i@<=Ys-n z+ZwEDuzLyUbqf2QEN>y=WV`G8l0#70oF{&K}TU3Uetuekk6Jw9Nn*qLGcfG^SN#3S*7X)x{mK0R7u?hAYE(mmQW> zRG8G-sh}yX1m7iUYU;J5As-JWa!d0ky*Fx2w%!yEzk2o@$)Yc)R`M(jGXU$0TxFg1 zPfvOUS;c!Ud9~z18`c(DdXx&dPkjW6~9_9di_tNCx;@?kw4t5X-CH=oR^{0j?yM-WvBY{X) zS^4EaLpHVY4R%~hnQlISVB3e$sHG3HK0KNtTR{%|7QlmNMP0(AG9?>hA|Y=&SMAmx zJ$+{|+z2(Se2^{g8YzvbN~t|@k~UCKU_$@3T$#=C(v)`WHCvYRySu&Dl3XYP*zrV zD2}xyCG{Y-6u2xf=PG`am^j&gHDF1WglCqP=fEj*a!FN28i>gI)n4&Q?{;xi4i-z~ z7YPi4u4i3HLM$S-+Q$6V=nQsm3&3DppB`l($dcR_gMi6UayCazHa4YD0)V7~-SBSw z2o>6dkTDvy;*)9ao(c(3xhj&WV-RpFQxi)l?`Khs?R<_C@aj9BaDq=|;OzK}_%*4J zH1*d3O6tCDvlQmm0BnQ z+vZMk&r4dXxn|=g@=_3@E907$qbfvyD77Hyyh0D~B))G0l#gjXEaAK^e;lh+_lEgc zQ$>-1!F=PAogJ;ZU`h{@CQJ*p~6rolIK4Ei)8@L`-j9lW7> zM+!k9;O-Ts$#p$8RjV?Xynr{c%1tg3P46dcm3w~a?NO2oA+Q3)fP{RjldW%dH{UPG z_6Pat=##j?rtU}BEmiGz=w3RaO~$)wkzl#A>92N>x=OFX@@*=81*+~W#1<$R1@(Fj z^f(oNO8T{S&ie4Dt6w*%#$h=kvtCl$&BvU&dK~K}waOJ*HkGL@d=OVFPSa-1XjOwj zU)=zD4ks+1`QwPt<(AJJ%8$8x+Im@8Wq{AB<#R3zNsI9_h)yMjttpirCJPD!ypco; zt^phcJLL(Y#P>uP{Gbw6k9xj`d#HrG=m^-55eKxyCx z_S}$)Wzok5ceLpD3tGhwv8G!zGDW7-iCTJ{cu_=hb7i)fXt-vjRv}Akd#4gzQIiUs ze>mKwF(!a_ucob(S}f?FNI9z-C_XQ43An&Z^(rz9mTfr)6el5Tt)7T1A@2WRcUTI` zW7v(%SR^jSyn^D~U{nK$SvTmx{81M`jda4mIY*IIw9`&3r(Ws_Cawrh#k_ZH7Wd+2 z^jif=9Q519!x3{APXk$?)a4L4ysBs0!)9+2#WLP3zzi*v5hASgQ=O=Yr!*Wh2f z0Sau|VH5L$-oI_#)MD)mxfCpPhoU2}1fQ#f>?wQPz7BbJ~eGlbFAR=SY`vq<@ zPTG1hLrUD)0+rPS$P1D4oOlkJF^T9sqtA>`4J!&ILhelC!m zH>6aw*af+@QuBANVp) zXDvG;Ve67D+z!^_kh=bdG~-auaGF%_urybHjFoU-V<;djvOTpr?^T|z^=N8o#=~(c z;B=kNjW@uEYgYbH+Kt*@zG`LSNkKwq%mL7(#Pbmv;2Ni-9{z<*QeInuRyG8NXyxfU zQz$oWXv;pnyfe9(P4a1{hR#^hnT`vjq@_kim68Wg;1#)cjf`pQOuT&!t1M>^GAJ}d zqUb-Jf+vyTZ#tt_n~Xjda+$F-;sr)@=*+F}>mydUIN4Me&?7Zg7f{g3hMLZEFpkUg zZjwUvIg{0JH=*ar&~C-;15QD5a_^H(EQ;x(?=9;zv>5mcSpvu=FQ{dX=Mbd{;an)g?Eqd8 zbdA8^#Rjqomq?vid5oDuAR83?A39x|U-ai5Hsw~flCK`bx$1Au)p(%(HCJBWp zaWFXs_due){(0}C-fgMmd>O&75}!fTV0MaFZmuSdyp7YfxqOB7DbWbs9ONBEFq_}i zN8%-nhk;Ulok--HINV%>uuv98r+p(U-Tv%CW8^r#E>fMrAvio=pDDRMfIKxuCSOdo z5uz)?DkEbl_rM5j?Tu*iT$mjFT*)`llRwU7O?Ud% z`5hUs9cT64*@fhh=KUlxQX=JbRMklc@*s;9RYiKb93#F$^$^H0yZZO~4LDF8!Gr{X zV_M<4lq6^blgKTpy3P6+Wo@&fD~k$Jx+qZqiJ}Sl0Bn~yZF27pX&jD2Ty@5P3Dxkl zggYLDI$W@@ydS=T2Fs9MfCn2QWZWbI*1o~PXgq=x2JCv1qW5B6V{tir1>!*xD=9FQ zPa!B4Cx9r0s-*2XX?sFiV6PP)vM+bcIpDL(c>Ul1`ak>M|Knd=yT*SXZZKZtIi#@0 za8X!11A-4Zy2UdYUCoRS2RUi;`t?V=%$e~3vbEwgkV~YBu5amwv^)A9_zT_VV`iT$ z7H9L_ot7h80?-sYQwtRHmnuRuSaIqVjw)SEZxH0MQHrwH%^&!zC!bmY-Ti z{18Rr@mowV9Ig@2V!?k(f3_Q>kSf%SR^!397k#Bv*UV6BMoCEA!?nc6WgmBx<7)dr z>IZyyPoL?ccRZdRz;@K#+V7+wb;T~USKKE(EcLa5= zI>)$B5E(%P{j6?+0*J5bn&Keqpq>|nmdvA<1LByVuz8CAMEF1!YRf>IB1is$4@h4v zV%Xx3Ch1-fatVu(B!85Y!m$)fCDcvI+e_g- z?4!yzPRnNPOg1bbiToX#R#@WP4CPU$NozO`i@-z~RTH$ct1N2lW@RSFBrqxI@HD{g zc6`Gj%4}yF2CMj%AUo2hPW7?8f-r!dJi*IZ=bv{^$A9P@e)@-A_v1HXtOw=aerkVz zX@B+4*569OpHEQow!f-Y`Rm3im#*=P5vw@x+rKcVA3J9L<`e(oFC4EF<>OC>g0q*6 z;0)}_%0J%>lTW?nRlrV3<=Y=wv#off$e(8I*9hRP>A+ilN@vQNm|JV!73|LoqakitF=BIR-b?pfyx9t`#Fki!X-{5N4VaxSw`j1!_W`M zdOf5Cd+Wuup;N5u%hSJ2$+VbFZi7yNec2s8OX~W&t*!qWVW~l_6)l^S*gxM#@s@n; zc3w}%(6-@g{%whUe*gHONk-JfAwem%jQ-l$-R7Dx*YA8&QB9~mjBeHJf z;CDG@aWfa30>z^~Z1V7cTPLg&Fu~B8V#+NIo3gIJCK)6lHyKc@#kxbQ4%8I^JX=De zID(jy)mAksykodnk}N$%DpO1YeB1r!ZlU>w9PCllm-&mITyNHAcnU2h5|~db7j*DZ zc1Z^x(A<&NVz5xakwq$+I3LwEXM7m$-GM$V2l%Qsw+^o9t!gv*$&P0r#Zyf>7k;zL zSr;y)53+XDja4H96Gi=ztmk?|&f+V%sj^h(YdM0$IJ#S_W_`o-wwSVws=YcD-;Dlf zhzY+zYuVn5RnnbQJErRdN2UX(yk(P)=Qzrqf#Ralr=zAMOSa z-~C!dUlOzQYn-IftBZz#hV8%197^?ukaEP6QRUWCG?55!eIyKeKxzyC^w8$D3X;}# z+VG)r2`^hJJq~)TA)Y$ioOO3H?*u-{TDAl-u{@~WkgkUHk~9S&eG6=Zn#NHkwcfWW z*QqlM51U?u_NK<-Or8*C_2Y>jWi66e3Uo_0w#kJkR%k7-;AA3e*ZFLUvl#&l*&{9_ zQRGzd@Zb0J{%kCmQ|V~dW)^5-xpQ{x*jtun$~akcXkf+uU9Jr=N-d@tEN?LVJDl-C zhvD=*+-Il@I;e^p8A|NnhLXx~Eg(5R%R~7F05Ly<#V)D6jp2ztI^w~ZqG>+2H!v|y*%ba{NjqiPmd3k~uOk+8^HCdJKSG&rVH9G;6H;+YJ` zZM29vVVpA6zu8J%2%MZQ)e8LmJDz@P4|uxlU7)*BVmFhc*tPw^QAB#fruHgcsoB)L zJOe+}XhB@|gqJhK(rg^Qd)NhPv-L697u?Ekt zXd#9|oMDi@!@TMyS#K)KTcsk_fFy|3(ryGMST)#L`)w41#mR2v>1`sEfDf8&3}yQv|`QY+XMvEV7M?q%wEI}UO-;Hmufs?L)w zjl~gE^kJp4yzaW6%sUq+G2SLqI&@KiG|g33XnJ0$ns%I3(%+S$*|ZdV(s^1b+&1}G zul3!}AV}dn$=n8(Pqh8wcn!6`^X zUHYeM1G=*2z?yqy&AGDXERiQSO=zNajJAF4rL8%>f(qDd8+&EUG1~lz8FPp=q^BEv zX!@4H&7Ea(LmTUa^oVz|aGz-LVIlt?^SML;e|GU441E>VC5QOwfrK8L zLxf#Lb#bu}7eqO8^n-@XJH;}%3uk5FWLHsLNyr)b>nf^C9VC0fLt@jYu61tG?Wby~ z&vY8fATDS>wfG8;q!8!!xWsDQIQ5yU(1dyfZ&3cKp{l9?Qdw75Q4h#s4V(=!a-T`aR*~# zqa$avev`9j9a4HASA~$iyK>mpsR7gWmBY4>;>uxLT$8UHwh=t)j#4Wfwo{{L;s;El z-<21(N*DS6l@~U)Y>9_7iBh?X?z`?6^y#Dp>RrEStzb76qcrDrG>)z<;p-Y zP9m-~q#o+SPbEy8!vx{xe!qY2p2fQ-|Ld*)Mv*GK11xw z`QpmKcy{Gr?CEXfe5sODSS@XO5!Fxc{t9(4{-RvmC1Zaz8$VUHzH&3Zax)Hz+bq}1 z92X#8T^_;wgILq?-zD75uP%>(>hVKf9)X1F-;{?7(`iUgJK39I3^!~I+R7w-)@WZs#8W(ZD1+T=+S zy`l#^Qe=Pp^Iud>jW#4FfbR~@=iOWTfB3`si=S~|Jw(BLEVqP#}9Z%G-p|+ z&YD~UU|;{t9L$5?3aN3Gsy}!B{(BD%2&41#r;@7Q{ow;<{*56f?y6?2mjgHEUs)|--MxKmFN!1!*Y>aA6 z`5ABnmxCLyhuKJzbfi~N^dBO_66d+!K^8jXI+{{a5P9@R@bQH~_JhO4oN!G}bhf5) z()mNnloZeh&LSZ~em02e!rX@l`8HLX?;%3|+mDc6bB^4i1fHJ0*`e)T^;o%8Js#^S z0XK1_aT8LVMoc?|*Ke0<(G9O(rIt3zqM#=lCzFg(M2qv8g;@P&myANJ{t&C*S`PNt z5UbxF4g0%tK@I5|?NL$RL#%!^64lQTtN(qA)o=7aACR6Xc(5qa3?3|MB!UM^@L*ZS zgM}llSC6aE)mATR^$k}F8lUm=asG157RZ%Gn^x zdn##0Zv@NhuvhCr7Kw(UD)db#n~#V2VKOYbD^EMsBAsX0nyQztU%%eu*|Q_4FgW-G z2cO{JqesBDzy$}Nv=F|_-EuY=rm(|oNBk|yk0PZeO#1zFQl9t;7bPnkp=7UqXc6F-~#Og|&F9KCs zM3fies3AKhI#}0}tKt>G&JarkF078U6v$foIRtM6T7&8@cq0UFgy4;!sG;FAcq0UF zgy49mZ0EC3=qhRQgPg;O~HWI`chS?u}(1YJoI9YA@vJDnoOu!QYvu3`~}^EG6A zki!u&K7@=94rPcR&~Z$XqDTj;tQjW(+DmFT}jZD1YLUfqcJq?e~BFm*4*%ukNgGsO!aP;oZ2t0C}ChBAg-)f{5A9i0ugA^KG@5 zSPQeL2?lS+n6;s9qwDp8_C2(#6+1$mexFd^JCYAtmmcKPQ8KhH?4xVLR9tvCNyqOo zK3?O_?{YNQUA5jHW4Z5`)gJOp(2^nLcX^U>a5kNm=M4D;n3*L}Kbd4@GR%HT2hsEN zG(xb0KA0w9gy<>o)6QSwmdNKo&rZhbqQxuub}u?ONx^3aS-(UA#4-m(+HIuc*+?{m z2y*nBRDwcE43b|MnUuoB}1NxWEApDWLE`-u9s@JCjR#- z7P*J2ZJ8J0&n_;Z!y-)X2LhB2koeSugi@Yo#C$12r{Ka7I4(HoXjYWSBpxNvC`Fv+ z0lxPW(qiEP2_?}eIgL(|7l`9L%_p$pf!M&`lakPsx+%DO5Y8O=Z-+-vtm}rSGwd5j zWjf_8LG1W==rB(Pa0t=WA7AZ!2o;ZQLc$m2^c_Rr>$=r0#lV%q#8+OUk_-ThQ_J|f zA4A4hD;TR8F!@&UV@uS0H9J71dm-+>8vfePfV2-t`+&5sB@J^iSdWACI9QJjJ@B_+ zJ-!_4afr&_gnSPOd4~iUJLqVqU7vEha6rf>UjG%0>G^Ls&**l&6Jp|9UMk55z55e=T+ptq^u$(Dhp3_a{pIzw`R9|9k%>5c%}) zPcIskAEMU>bUxABdydXOZ}fVpXk6^YqMR)ZQ)vt75?&B8$cP*Kz7-@)g~V@F*bbE6 zs=`hPpARZfh<)2_PvAoV1MR8}X?2CY2&BIO?j-C^VC_f2Z()e26^_HiHjfecvK{9U z`!~o<4Mx$^BmpOKds&UkyCPch*){jk%QddRBRPlUF|D`_))BL+hguKL5h8hC@w;F#bytQ;12%+{Bx24bE01zAi zf&+j}5jEd~13+*92o3-qVFU+&%W(j(hgpZ(ZzTtX0Q@<{vvY9FApn1GHi1$o?IM`7 zNkgC(SvoAzswIi;YHN}Xe&e3GRSWbP+zWzxK{_Ir0Xz4A*0@~>_X1m|9YWDvxlnY$ zSKyq!0?P&9ZzWFzy$V}MUQTn0v_%n9VC>4qlUb>(1okHAeh+$;pjQcc6_+L|zk*&R z=v9JV#UqQLR|$HRX?Yrt6Tl*l{h$ZMB<;sCxSJ{yg7sS@6g&ykU<6Ns;7PEICqdAV z3>9b9F=}z(qx`K}l|{6*QdOA#l97CHL?F~YBloH&M5v|9Y&>(@D$|RCYxM84mTmzSzB&EfEG^33kmUjn{%9}aNblFLKgeawZH_oku~lDW2#FeXkJE8Fg>oH%SWmeUB6UY!i;KWG zo|NUJ*t~i37)c3chdubq-b7SZiuGFN`LIww)?_pJbj1sudHnzgO_lMC!nWckL)Fo@ zLEfK@(s8*NZS>ZA>(}LDxi6dg(eiob5xp|)pIm3h#}JhNJ%|14p!_BrzgX8@UbrG3 zfn-;h@dpnNb}4i_n3@jmo6HE3>@VYOtS`Nc1uJ`;9xYr|%qH*V(Ks)obdZ(2Ud5wE z$#@2z=+mBvBdlGNv>%g4{2 z8w}|jEELF?^Kgn0FeZ`OVWvuZG_2D54{X_$+_tQyR!!K`ZNfxiW_>gAYK z^|6meImSt@|6G6zx1#4SfjKUE6M@RscOVrWOlPUlY}aNWZ)y1STC(w{ehcAd?QR0<>0hlO`-!OKBA7FIY>1wX}`3)FIQJb9CE6a0-4E_eaG1 z4q@m+7~H1zqi=rk2Y;wh=KtD%wDK?i2O!Mp-xp^^nTH_rA;>)ONynDM4AFx= zijc?slVp6H#?RB!BL1o7E3CrqXjMpf9FIGA+-4~h|aP{aj$ zQ1leR_D1<29rmb6vmHz&U`je5AcXv`Qk*{)w}f5G4HNH|Q4!(&>vr&W|DFtK5%BR0 z&9^NRxIob@LY(*Xl+2}A?1&9cU}xpY<-}?iZVEAPFd@!+z{i8T2YmdjD5L2NP=liq zu5{$CBLpxom0_O1VNM?cY<#@4rRWj?HE(4)zOw!fdb%F7lS83@lenWqc8Z)->(HfB zPjD6sr!Li3St!`QgmxxVo|;sA*>xnCyP7;Ky%p!(mlHxrcNRHWrsRns;V-V7#0Z0Q zUX!mB$y%c4L-ckc4fPk`@Bt1Fb#5Ao6Jpk9P70Dtd&j+~7~@11^%E#jx}e`=HY^Qn zk(Q7fDmUta6pymw89dq{_ad4wZQ(-C(nso`JYodtNjk2uYPBBKXE5cek?=o*Dc2tn z`?u0ML3@AziC%Qrj#M&@2gZ)(d z`&U5BrmvFGWQe7I6m27U6f7nuB-}S<>$2;c?~}Bo(8(;uzz8`(Mld>9cJAiKK>RA< zMo7rGw(uQ;DffLa<(m1Yv{ZxBs9U4m3W3@~pmuwqNH>8HsNEhE{au6)m%6r?+#e7k zDUO8>TbHuFtTf-UeL%LHXywgyST8OfpB7sjstKJCs=pWq#ahm71TE2hvRgqno!|2rbV$j{05q<^`G&o+AmI3?B8Bd$K8d>Iv2dcO-?OTukqd=!ONM= z>t+;hwru{Gnwh4{-T&!sX8wWFTlu_*5EVvKJ`=4Gy!PNCA={$V@TG z$AueQuy$XFx)gf`5-53264#_dzKU8X)Ca_B#nB(3?jzc{DqNCTrS(73L8u<#$VEFe zv=BHo(Uz4RWw<6AWh1y1zOKcQEJ2c*3+-vpmRM8gecd~X@=;b&Ov5oUMAHct`@f1o zh+S|1)POr_%^ST=mCW&dWF}}F>t}Sl&W{!@tDr6MX2WsZE#>B{edee$}>VF(}^gn$Boz(H_f4L}4uoQi%J5cEOukzq9eAE`EBr65{b z@u9Y@p!c}aVFGBHz!J4aNokV^SRNCw9FV}N7k-86=scP_1BAQJh6o81!meXp zO>oSw?yPTImuTqXwD4|RUjVUAU-eUtOb-JiP}|co+MZ^ zaIvH0RXj|`$K?qkOn-9QHE?#2mCW4T@NQ1iM1c5vBe5EQ~+TRnq=6o=vlbg%{DU z<9}sOytGKOWuAGQW8lZKGVkoZulV(VxnKjUkrm7fiwobT(*h9LMh?|6FHK*c;Pva6 z*_8@~zl2@d7JUP5KV%0FmS~3dp221wEYY+_)c*xbbO>V~!q|JX5yIGCP8fT8n9b=} zX5)#T=B!^$hR+)0M5^w{#!J!KGuPDl9*cmz{G$hR(suR@mUr?bNR;gO-BFfg(!CfPi9iH0XZX1u}mXfm-@y z%@K%dgis4=-0D8Xxm|hXhfoVspiQRbDMg$h$@&8cwV-A`Xj6j6!TaNJ@VEbsfBS#^ z{}6_s{@rZjaWKXyP{u9^4hL`w2o4AAtRP^DKby$=2wIaO;=^-E3Cg?UfxL`(A_)0d z3AgXw=1BYQB^_jckH}2461*US7laOMsJ%RXEOJC{3Q_f!_J#>w5D-)^+zVn6%(yvC zlZ`pPQebl>&)c1v8wcHWKBag-E_OdS4@4tMW^jn;t|K{RxKZO)udPuU`!s zeTI1bAzpuo*Kboq&G%q)4mRgtbM^=$*qkrN<{Y5(b5OdDA-bttfYN)U3cu^UIU(Z$ zl)f@vd?AF{x8u$01Jq?f>A7A1Ah$&^?rn2{?nbZ`Uuj!$K;EAddGD?Jpi-%4(oys> z8xBb^Dk6iQr2Xf>;ZxF#B+{YbR3Xhhni}KahylirQAJig% zZ~pjq{?@10uF=2E7C?Fm_8OB>g}5hr?)R?F#SD{+ODRw$AZuTtUkc%1FT+;fNhBqkXncu zOC*^HuzH9?7Y?h}s{U@LD3fU!Q>ghkIRc-oOEHj*`@>n0y+~s?)@GyG2r%Jwa{{xX z`*VBctf*_HZMK2#-h=qjX5oeSa6-*gkl&PalsD;)6Y0*?n-AznrIM`E*b}6|Dzx zdw&NVp@F))tG=GGN0ea#DT`;rvUXmr)seiCt7Bu`S|2px9jlaHLsmYDpI2Il;O~K4 ze9{%;l$p^WMJD4(I!-1T2g)n1tpASYo$sZ;M}^(P;e!%}tkh*ZAi|};4&|O9_XXsG z8y5?6LvR&5i1vY2c`6h$ZeLjN$5!QC@t-7EdBAY5yroAJsh!bD)gU0rZcj(svPk&?2+$rzi=VP^3*7WUtO(Ifz)@|vM z6ugRATR*}6Cf}iVFU=w*6C$Estg4I#I#q$ze#+qEg z{Me^W<$}wY%^>)Da2ZR=6X-?atV~B+F_H!AU&bupk6LgUd#f&Ew&g8kUkTY)Bsq5C zI!Iv0CEJce(v_Rg1S1ULY?=_nsB*V?AJMAwXZ&qNC6CU>NZDJ)KNc}TJBhCd_YnT6 z%>!`^!%-Q>U4nxx(fUpw>5 zD^^E#ADVMsP(xkmP((!2U~a+N?%K8A|M_2j|8W1Ge*DjnvWEVBd3J9*#!9B+;B^NZ zWyoanv-G-a@IzG@ZE97r6+gV%QtXgdduP699wApjlfgkRIOu8jw2=44md}ENUJC0I zseZfVY%)xNZP||aTZG&o{UIrbp$P8xQ%?_k;SPF>d;^+8Ib2!48FiKpd2do>_e^jy z41Q3sLg{m{S|k*+q&!J+E*Z{JX?>YyhqF?Ivh3*!tyj})U4@>}Im`#AIS6 zETYQ`$$2CDCi+$zvSxJY z3o^uH(3r4p@Z~gUOr}{f%zh#zNCG>1F+s#%SD9Mt?Gtq=i#%k|gDGiOk@lQbt!V6U zm`3Mu3s5O>kY$LQS*6&81ar!cGF(F}XL{5_1p3;3v=G|Ayr zDpVZ+5Y;I^6zK%rM}W&8b$)oQ0QqlzVDt+PcgbKa9}iE-4_P2#deM_2jeaU0gM-L z`Pcv8zyFUn)~{Wof45q|<-NSUAt_CO$G^u(X$1W|kU7|)l|xXJfG%eZkG+lI0wJ1~ zO8db~DT(?B2Vatg3%VoZHlv)&eK0@Lcaa_`84mN8xFt}6oYs1*E?PW~Z}*~u6J%_T z23fy^N{T)A>^9QzY$O^gdSWxyj5Z!6lc-A-No9uTQddMo2#HA~U6=L13VQL!A|H!d zlsEc_;@BW^j#7I$puw1XE6pPIgSWZs#M_Vah?qVPfm7G&0`?D~%@bpTTJ*9`X#r?v zJ)Pma0m!CDOH@>u~lvKeTb0@m}Q z6TBBhILwoQ6_drr15eX(HXVD(L`n1Q2D`$7PpelbBaU|!48Xl|gok^VDB{0G2T?Rc zk}&rQWf5?SjPr5IRz7oi#S0zJ<>T>eIAj(5me4f>9J!H(nU6WcN?cs=A;AS5o=s3& z#rFUR?-*%Ut{V?A&X8P=i`Fg`gepJ9-hfrhsW2-2tFA`sb#+CmtJPJ>cPcBBuGXwh zx?EYIbg{Zh>1t)A(#4w9N|zh+V!Rc|yc+EC1e1eYLz7wg2wPNhng>rupixkN0i_>M`T?b{sG;FA*qnpS zIoO;%;s_}H%eOfzF-D1f0vxp}gmC^p3*D@JS(QRH3(-PoW+B-K#R1sQ7V^Fg7={%7 z07u*vEj>2lg0~_kE?pCTIHV--7zGZndt=t#MX)upb}<=3<~U}2U9t7+LWZ^_rQNTg z;e4Eq@)ywNoxn1Q)!baQ#tNjK9cN}Hgx@yH@5ZGzH3VT{W6)ByQ-cHNa6y@1d3J0^En>ohsm($t~~9usLG-JTa?p*{vR?u z?*!Ki19i3SC$R5f@4|mwwPCETup@+YnIJ$c8@8>jEx2A#oOj3PBe-5zej&8JM#-yq zn2wJLcsk0)<~y!aO8CMc*&{9>E=K9A{%}@gFH#Ket86qItwMmQT(U~RQ-(@e%hM_^ zZ?ctOnjWXGl(;oVlna6Vr|=b>mKpqz*|{c}8d(%c4oGpq5+!or67LwD&Go|Bm-Orf zhm3R#k2bdHVoNk92;2MMKo2{tVMzq%fs=dy%UGY|Z{Pw6vY^1z=p+GxV{+m1si*5P z`_H&XCgo^M>!j94Onc2;phL#o)#SNpcoGcxYP1k2-f_hLYNtEul8|knjKlGAoc}J_ zjCMa>-{3iVU(*2CLR(AkgWym=hj{fD914O%0kq>_{-@X+##vtl+e>@Ly{H&N0Rq=) z0QFSR>BS2TMnAwyae*s`6r(O|1q7OVq9l{Tn;Jl+=XR$Vm#W1^-ksTdoQ_T^H`KzBVRuy}a=lE&)?H4qfe+EY@?@INj!&Y3 z9IBIYVQWwTqKzUY{AN;0Kkno>fie)+8A*ffgXb+P-Tm7hA@$w$3g>p*aZv^B&+o7x zBJl>o9bdcx9Vf|0AE$x@KK3L<8u`+$Z-4JgEp}7@_%p(=(pzPVI}Z7@GKO@d9l#@4 zc&FnRl&g#1<|`a((pSj{Nxw+Fx{YH8@Uti6dF{T?!nv8G z#wM=(QHA?5t}Sd2F%BLgniidsKwh$EtJJgv@QQI4Jzm&auuWgSZCXiglFhb~KZDyq za2v2WqJ#v@Cgcj6)SW*({&+y>w#9?LNJAs;}<2QaDZ zq1r<1$<2^0NXn{MhKZ~i>hwrBf`K@mjh~P6m*W_bgsNhWt~^JNiHBDnY$=qe5A^po zOwv-TM`mad0f3B2+04gMcd zSvUiHB)C3gfvT>DCKFo1pgMtM4*{Kys3HEpd)f~1|7Run>n55wiD>Hng6gDhRLr%Y zItj4;0P8pOz~6%EB&beeX>C1?5%H7Mo?g6ydVw^6_cbX&bPI_Acr*fdKY;g_0q@(e zJ_{L6wgssyWQ>)KDxq}-f-|RXMTQCt$odO~AlJYRg1%KmXswe7N)T)GU9Bv}T92$6 z)t@OY{~sUz{_mfBe(f6l+iZc$F9=o~SMbOIp&t?}cp0*Z) zMmtGJnVoUqqS|vMaupFlc+|aFq+w4$*F`Ss)cw{JM{O)Jk|PYzZwA?>t3yG{~kO%*!}Y1!*7=D$D;85%{FZN zsCuOwAjFWfy;ZNGxh@Fq3A>upp_LZl(bSEa91fNI4b|KYmAnn(kYR*I z^SyLv@wgZKS!jA2({0duicA(#Qv>$XwPeu+HO6F^$(pLx%Ef#(X`GlvjMBkP+q_ZYYZ&e$ zwm=oaft^(Cz0Tk2kPAgm=mXySnxG{a2Vxb+MZBO`LE@;`xG|Zw1w6-o8bJ@6EBY&@ zBQ7j@p0`+#z>*fv0k54p2PvinvtBytYh&4_rP8r(=tE-j>(P0Z29ZDO9(JWXxAY1T z@+#za6Cz`&5T&(5(bB?UqV0LsP2$?2bA-4nR1)aR<*aHC*%=Jja6PSnwRP zDWc|kfIkKJQ-D8tgc0CRmk)n3A`czDq{tIJ%_kJ2DH%R%5Z-B~9EsXJfwl21qb6+W zdZ}kiv09(U+CI<{sx7lj?Xj$NlaRdUoX*-bqcx2*Cb988@UdRz4h{kr7wFY%$@X6G zdtl!~AG#|Bj^Lp*JeZm|=1GTd)TE=ORkz9Q!GC^JIoTI2f|F+m>J~Eup6NcEq+@N; z#hNQtdT~5XU&0%Lei*?WXbSR+a9!L;CyuLRW2oMw2}7*_Fr$Hp0>CT)%-R6V95U^h zEr@I-pj!8WTi7{(t7JZcx#)tnmDEB`1>D-zh$kDI_oDMT@456r@$7>3Od4$?qJ16t zg~MPt;lnhK;QgxRe<3H3H7J8AWk?#pYgmLfp#UHh2@ayrH0`GdsyJXb+Qp+vkz4#w zJ;8Y}I1h%nOBT7+eZ}D-#9hL`0OuCsE`_*D9*L+ZW(Yav#>~>eOJzJPa^W8@+@_j? zv28_N5$9)*y#2c(b(DWs6Dllt_v;L0F|BDgXD1rb~sG+l@QOD&>49A606ii9 zdVrz_D0+aR>k+VJpR*(u3Q%-NCjp8+E6Qj(L!iVX1lnWK>=%Y&sU%-bg5?KPSjm)Fs?Ma5e`gsc`IpkA_Mh!IlHvmZ%NV zfmw2};;J|X&lZ#JP=AzkDXFy<#kvgxo$-3$ckP5_&$kx-ujYz~Q7pN)lO z(?;3DTO+oAdqoi{394|Jl!MAT7rerAJVKh|X4ctTb-T9G(Skcu9FXTPDc43XE7Osq z5uu5P5zti?(M1KDj$qHC26!yA5`nT->c>)X`Xil#7&7Oz$>vFoRP3H}>U@y#$pYB? z9fQq-$|OTjETVT(4ZfTPmB}t`*kWJItdgjoOtO-6UeE(lh;ZbP z>`${pQfiS-Fc}W>m$)U`A%%Vd@Ts_HHO9C3iQuDzO)R3K%%`c-MmnC2L_ipK6~e59GIA*Ci-4PsUDAdn9}u@2QI8M7p`uY*p5z0akPsI*hwdmjjZTuE zNqBH+N_>5ZF}!8dB;Up)-^SQ$3QVhdrb)6=APvk2BxUY>!2+_FD4y#tU=ejHwVxdk%0?!W<_Il5Q#ogJX9EIRVvV5@r#?YcZRo)9%AbI@Zdx2*T$| zFOJ9Q%Qz-U)T#x}NRUbwSxj0QTqVF{^(H+p*!R?^2m4;I@3pb-X)?7npaI>?3G%Lz zfiIw&-!Zy5=r{tV8Rncc=s1FoLkU?y$B~p;fG~sNehWGdF&;t30fTDLak#{xhvaR> z(SFA|jsQniYapmA)JOz%MNn6?QCFz-60{W|`1Mieht~?B_vQyu){vL!RfHq|=U@G2 z|KZmNd`wpCsesl)W0_ zABz}y8z-lLbdBZRxkw>VhJwAAZ)G-;zmBqD%8F5ObDWRupFpiM~JNL zUCPGZg<)2BR|pdAbjjO%=y?G$Ek@lzeb=!h?I?2T!L5x9n+-afNM=OH_PW^7)bmS3 zTkECM@p@!_?+pN4aWVH+r>+K0+wT05sO_rM)e^A1T|wd4z2GU8q0{yCC>x}3@jS}X zY0uz*zDZAC=F>q`Z7>GHz5iU8+`GhU&>&P}2h&+fNQ5B{KM`$;lVl3F9E9p;3zW0W z^#ltNsQ&+DHXM?J1IMuD=fMw)J+MM{VMr*#$pg5mY1&V-7wI4dhffxdYRE1evI|#< zZ7(3dtApZR306@t9>FS#^I))wy2PP}rc28eio zh)a&sX^1^;y-8P#0 zPe3~f_g?y^??IqV>PES_c$9*AW#Kpn^@><>LA|1N3ESgr zlnfWHoDfL+asp`w(0Oy(Ay2>4Ebh9V^t0n`oe9;0b5Qh(ItolG>s;^(H<1z5 zYrI#N0n8Z?TQd?AC1PmEj?T*<1j|-y1!1h;7j*jn{J;GdfAK#7nNI(<&x}qdQY`6^ zH#w!Pem^-*@8gs;jrPmgAj>0;{PJiox=-OGuU~(V%iy>Z(uzluY5oGJkwMfwPRHpK zFk*zDJmpGILPTGSi`d#u%5qX{-n@B?=-{)%UOyk*lt7RYz>z}zSd-1<(+Vo=0Eb8f zODyQIxyaR}`Zmb>teM}8HhSy5_3QGn+?P%LX!$(zh+diYPp-3olZ_^MK&ijSD0K>( zI!t~#jm1oMS40FN#ts))(<55b*ez*I_f&ZM9_x2{*h6dFHX^wu_HlRDL%s`i)bTJs zOoj;1`m|G5sPhc_Ox=ySpn9k*h#Uj9o|QGW=>ivUEXIE!zBio`u;NJz4tA(CPY&W8 zfoTE2iy8MGu=N334*@4&>(7R*clH&1Sdo#P+#JCHaSxLr#7HGhhalxV684bHT}`j` z$Wgt{VLmt|{C%Ai@s0ucvTLG?R~~`CRHXE(yeEaSmeBivm{;UapLd0!4v~U$b`5Y= zxT7?Ry6kXwliY~dH$jMdNkkXu%!kx0MTEno^erfJr!D)T>U%Kh3hS$XQdT0P8mH=K zFzJ#POm$q`E5W3@aEO9QS1g%e(hVkEmwC`H6_ zSW+vjJ5|kDMkXk}9OSz(KLKm*A?E8WO@95lGS!wmgOt+)`<}$Rn||9UA^*{ir3y6z z_8xY}vb+^ovcXTaVg-~`2g$;x!J zk4U@Ri^3+-QwqhjqgZDuf7lwpyAuLm4xdCY)Ytg|TVQMC2a z0a70z^^z1n7)X84mmtbOh%gW$3`k_bVogBMmjr#uNm5c?IL^0P$%|G{1hEizod*F{ zd@V}ZQmp+w=u5P6AVA>t!U+13I$embw5Tfs-9?DtuGSHh(piy>g(ny(Ggdj`q(qIW zQtDG`l4g^j`cOk+eG1)y(ltNRL1=$5Uf3#t#P1JYZi7->f%3Ce%F zVEUl>2oc=hAB_C}{n!4*e|i9XJpKEu1x6l03OT+oP?bbh1A(s$(D)Jo28|8qt2^r( z*Cjl<03<_)-{c$D7l5wQSN)XjN&xc;*gfn5+bXa!8wVCO!MN=hQTB(rjjq=V+D&YG zgV>JPi(yBqdaX+j@+q85tqc3;+EB(%XYj-%nuTKph2;c>tL&>1+@{=HR&(4l>u$Z?`i_Ud7WHLKNeCk&WXbr7gPXtOBaw0cW#u ze>f`;5I4qlo{eTBplH_x@1~96jrh7Ka&@y?r1CGK#%yr!JI6ayhv?7lR6wd*A(5`^ z%;|OhI4x(>v8y1JzKbHN)4Pog-#~;wsZ&0HcN-e%bB5wF*b9k^- z5*SEbO=$-PByy5O9^mT4i=4j@fy@~W>xTktvG^U#uhz)WSA}bf3V?7&3CIgZ>R^85 zQA&oxhcE=uSpnn~2{Y>|neb&e=MdoCTTSoU{8}&IvFI7_>iMKwiO3u9>cMF1(J=oE zM%ze)zN(FMMpo52423?Ui{Z1a)l|j)?G=4DMqAy9V70x{R$Hl|qg5qB3sLImYzl7# z1lXFS(=vm2vV{d(8n>CJdUA=NJDm7SgafQbY1h&JD!1xZd8LrOt}8d4m0h{p6tK@K zco8AsgQi4yRYfwOyR$ax_&+;j;k+#ZslA*AO$l-c53`?0`9bOEiwW`qr_M0e?g&9s z5@NO2(U-c000H?ZD=9AG7yxj1KjK6_R&flWmK-3Llj~j39OP8Q$55d$3S_~?wtyo& zr>V}5oYks2V1EWpi9H(r_n;~9N5uRNni435UgqN)Wh5Ls7SdYKl+^E+USxoJ`7TYt8RGsf?d>(_s&fYlJ&M2dKV zKOp`dgIgy_|2ZOJQ>mlqG@l87)lo7&Rb@|7puJxrQhUT#r|A(cAZ1n&F|->e7MXY+ zO(x?U7W=7adX$`^SusNivZD599Istqx_?O#0FxIv5>-+^R#hkS@$eK^WSfW+NES-! z*8m!@euuN3uJ4Y&W0jLn2A{;t? zwyTSbV{lH04^QJVIo7E6ulVYhrw6#!uASqwgsT>&FrH0^G3gmo1Xq+j`Z_Il=-!j* z@Uggajz(2xf#$|{M6C1n&lu#R1i(*|%VU}k5#t()QiM#0{-*F>NN@$b)?Kb?;<%&U zj;SVJcJ=zoCG^D~hvoVt$7rdpS>scgUo!;DPH?4F|HUxOe(OukF!FpIr|}>y6U(n- zk1pO7*V;`E1HGtkM;RztklG%Bzt9<6YS##b95w5#vaasowtm-QDOzc0*&j@?N@}08 z?2-V7P7#>;xi=;c7+7Rp8ZJMmcxXi7Gs@AB)zFH*J?J>9ly z!_=O~ZdZ>v-QGbSTN!YGve!Vad@|v{eO45L9B(>)k-=m=#5b{mjAq#Fwx5uJaW9>c>{ zyuhqjOOv8p+b~ZTt3&NFTamrix;cy|Q{>>&`ImCqsNA(DIu%UT{Ny z=3!3P^P?xc>pXcu3q4A}_Y+CdpiDGJw9{QwM-6s!6(UC z`>*13q(=h2uHGv!QgM28gb8KEelM$~2kYMaJ%C z!s$&27gr%3Ka#5<7q@~TnYJ}tI%!+WA&do;jykVhw)1A$*K2N}_4_tAQ9l5@$i$Rk zcRQSA!$HgxYi|q8yZyP;RBkwe$L+h^(3Trn*ss>pOcINT+zqCnh-Us-sjf&D6jiBj z?instX+ZM}NNmR`Jsj06rrTU09SOimwLQ-tKcSrE>^FPD9>E*UAHmwWmcG|yn!7UcW=%QOJp~RGL z?D3SUtSOj^-sETxHLk#7f5VCZQ9}0BrOb8J`I>ursA}$+*%$9Vw}`bsYRb)7tfF*- z#3*_B{_RJID9zHAIDIM&d8fFIl$=6>Je>8PV-(0KOJ33JGA>52(6%E1fZqiaP76ye*GC84N^>u*j#xlw)=QX^Or<|&OzL~YY@PH4&c~m8`q}5}7G|7!*D)ofJ^`hT@M-o@E-ZF4 z(WI|4@rqi^?MviPolGHl+ZAy?K2$eIemMUqRTaP(Hh=Dbda7?ZJl;# zw+vtL`XD)^{a|^irb*nPEZ$RUc6&rR4YR5GFUMsm33obpoEG_P3bQckx!wpg;_kH4 z75eL_?iaVeWQl`C6SwoCB+4$)FI|Tqw)7rgaggi1-s@7FLC%aK_7N%n;9zl5Q%MGl zQT6F_!TUWQ703g)JssDyM%CZm%c*%sk78udi<8V`-IoSJl*J?qA3ZZ>LbHQvZ60w|t8(Jq(#W2;DtDA4r ztP#FzT6`*&ojYL#9}S)gKO9<{k}=oR7mWW48kMXM?c7N|(0U!+OLOw!Q-iN9H2bA| zPRF-*I6B52DGod5daxbyr+(Afo=hk+5zX^&XOmNGy7!VpYp$7M?=ptKW~tR9l3!<^ z-sOSAvc;efAJoSuzt$6|OF&t)N4RwXN|};R81Ei)o6rZF$ACHz8^Wu}ZABeJz9gPel2pl!n8b-Z9`A5F6t5LowThvT$l7A)3p z!58L^shka|_(1iBYeOxK(G?Cn7|{gIJyKOJL5 zAebGsYfVSp2E^zRx$+7+J*7p1*zHPeH8e`;$Ld8pn%Zgwx=Mdq#1qq{$bh-kx-Z0w zD&qeg2)lLEGry8x81~{aETplfH{z-nXMCv*Yf@BG>a+2s=2p6>moj@g^~Zbb>f3fM zWzKJ%Wq9URx~SoyL8*=cU8TRd3;Fh0UTSWoi+ZWXIe%7jY-fJa&&OjJQgEod8Z5)~ zN9=WtWX!Wm5Vr zS?aH&PPmVE@9zI*@2i7`h3FBxs@{6JTLUOq_gsc$O4|cruJSm{ZQ=c#gzp|c{)X^B z`|=)MEdAG!vpvPDJnhT=xN zsCGe0nuGj#Y8~ARw1ulcEzo867-I4J#)E-1xJ680uXr>(8s;yr#6iL8T$^n_vknV( z)l1y%O!teH_PgFdUvOx^W}-F~|kTk*VsxuhNV;s&OXm)4KiMeU2# zA@&)Lnj89b&UAKFS_N|}F2!G+M_$|zQ?o7B-u-*KuYg%bto<>xFD|cfdNyypHIW20 zu-ss$litDwUv|b?Gim+<)WGy z&RdYAfSjX$t+3{0tZ(%ulQWn+#a??b1uGD5E-K>C0?$&`PbmW+ zunBhz_(IJ8e3C3tvEv(vI%68V=%p8}Zm1dV9 z5xu$Dvq(B6@yEvtn}KAiJZ77l{Hy}j(0)Ari;>uaCKYtLS9tls|Q&98ni142)vKMDp>PP_8e;q4_; z#<`uh@MdbBrtoS;*nq{e^A?8Q?d;-_*66a8Xp~{x5Qty{gDE0`Mr;DpPUe?1Sn0D%u=nj<2F*Od9Xl%uoLM|M?I9yZ`Z5*RIjOFBb9>(;!c+{&`Wn zM67g>kuj7Dhj_6Y*E(K{Tl;n1$>f51{kp&r9>BS;w*K<`hFJ~6Eh+U?TFi!J#h!Qe zm0a7&?rV`}OFRr}i*?JDj%ai7Lat#M9JpOHshGuKir9sMs~j_?l!AyPV~Wy&nZPnf zxR4(<&dVIA$Co`q8|xdFKSo2a(z*d!Uq8nX(df|MWsi{9_s%>>Wb#mH8nfhZm_|3O z1$Co`P&1NCiuJ_hIpx+ zIQWnmJ{kH0ioJh=^FzaqZLK+fcczLpaxy)RxFSW9ih(8s;;|xF%ztJ_)KU?tFe|S+ zWC{Tt@JjADep?i}P@Hl2m?3**2~4$8RSSWsHf#b90%!hAhVr;Zax`cOW9aHWO$-4x zI;h1}#g2FExI+B4UW6CECJHf%90Nh0H_QAc!8I`+M$uzgXn4yo;w>xqvx0-Ca!xdV zC2)D`Z7!f+Z?sAC?Ci02{<V@wccKTb!Jva-e4Z(Lb! zAAQukHqG)Nk*sE6TAISEI%PGYzdLl0{)g%Km|_dcJ?#>Of5PTB&=*Y~0PYAuFg{*H zVwyZ?Ud}ax<4*KZbn8Sajl|oii zwZ~s0D^W@HCm(KJl4hp1ZK}~pNc5NsVmqV~O&Bce1g<(@2$`-}1ip*5{=LpKS7Dxv=wqw?N+-srZ|uLrApT z>vqjbAug!4Dg@5}hjG-NRlaX{57m9UEY~0FlcYc%4HE9C)92*0{(#nv-zF&8TT~(d7=AFr2Q!fTSO&Ky}1UXihK0tXgSZK~dg1Zmk(=b)y*>MX1SUc-3G1 z)xY`A{|2C%^luJalN(_w=|jT6S&<=@z_N=7vm7vIhzREh)~tign*j5~B!}6d8$n(L zP(Q#tQM>|)>O9QL{I3#f&V7koj5fTNR6k|}xc%noUb}YVaICtLNKG=>Q!HtYV zhUR1NcDJcIkLTd0k!OkK)h_s+_J)< zt@K2VZim{nUe)JNI>0cMvx5tBU@*8Y^pM7=L$P^9gFOn;jVSeU{h+JPP(X@Rk%}+l zWmMa3UPzU-UrI(yp8q;7wf?_<@n8S*fBCnrU88>=EudB=G{JU2PMi}%VV@Ocs3q^x z)Pk%Gv~2sxSJl(VSPhci;Sj4L#^mE7bhJ03qImr0{V&|VRH+xO$WyE~T38w3I$3}9`K*#U(fvi;-$Z*#Ec z6w3zvy>U?{NP;GVA|VRWCWv9PDDutC%}n0BiJ$ns#-UHv;29;PUn%3t7uZz+n3U(M zYAZ`do14NJNc?}3oL_H>d2(xsb~~s^eO3*q6~2iuh%dp7*KWDZi2;;he0A?^r;Ts7 z_wH?fc~8YT>r4QnN`}Y>MvqaU$3{a9V7sL1x7KOS zXz~s=Ha72UY;J7yZr}cFeI1wXZ0ZmVogvaeJelBK=2g72@oA+ZuqT1&oQ{i2x5%|C^O8+Z9z_4wOLN((!&W5`cX9M$5Pxe-L`J=q*^g% zoi1@Xe{egR-Ri@JJ1C--n;B%7j1C7$^lCLaMdV;YYgLwjZcQ(PyS#zm#G`LA;cw$t*7uS_beF9_Z!JK~kOjP&3G&pR#Pk zg^@`^l(tNZM$um{QP>iqy8^94Y}b7Wbm42|28^6z5wc1H!nGOU1c±gk&v(`vZc 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

*W8tL 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]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 literal 0 HcmV?d00001 diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/requirements/requirements.txt b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/requirements/requirements.txt new file mode 100644 index 000000000..1ce361735 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/requirements/requirements.txt @@ -0,0 +1,5 @@ +--find-links /usr/local/airflow/plugins +--no-index + +amzn_sagemaker_studio +amzn_SagemakerWorkflowsOperator diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/sample_dag.py b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/sample_dag.py new file mode 100644 index 000000000..aa3fc2f14 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/sample_dag.py @@ -0,0 +1,18 @@ +from airflow.decorators import dag +from airflow.operators.bash import BashOperator + +default_args = { + "owner": "airflow", +} + + +@dag(default_args=default_args, tags=["sample"]) +def sample_dag(): + def sample_task(): + _task = BashOperator(task_id="hello_world", bash_command="echo 'hello world!'") + return _task + + task = sample_task() + + +sample_dag = sample_dag() diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/sm-spark-cli-install.sh b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/sm-spark-cli-install.sh new file mode 100755 index 000000000..6a0d50e33 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/sm-spark-cli-install.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +# install sm-spark-cli +sudo curl -LO https://github.com/aws-samples/amazon-sagemaker-spark-ui/releases/download/v0.9.1/amazon-sagemaker-spark-ui.tar.gz && \ +sudo tar -xvzf amazon-sagemaker-spark-ui.tar.gz && \ +sudo chmod +x amazon-sagemaker-spark-ui/install-scripts/studio/install-history-server.sh && \ +sudo amazon-sagemaker-spark-ui/install-scripts/studio/install-history-server.sh && \ +rm -rf ~/.m2 && \ +sudo rm -rf amazon-sagemaker-spark-ui* \ No newline at end of file diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/sm_init_script.sh b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/sm_init_script.sh new file mode 100755 index 000000000..57a4616fa --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/sm_init_script.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# Create a default aws profile in SM training container +aws configure set credential_source EcsContainer + +# Create a default ipython profile and load extensions in SM processing container +NB_USER=sagemaker-user +config_path=/home/${NB_USER}/.ipython/profile_default/ipython_config.py +# SparkMonitor Widget and Connection Magic - create entrypoint +if [ ! -f "$config_path" ] || ! grep -q "sagemaker_studio_dataengineering_sessions" "$config_path"; then + ipython profile create && echo "c.InteractiveShellApp.extensions.extend(['sagemaker_sparkmonitor.kernelextension','sagemaker_studio_dataengineering_sessions.sagemaker_connection_magic'])" >> $config_path + cat << EOT >> "$config_path" +c.Application.logging_config = { + "loggers": { + "": { + "level": "INFO", + # console handler is required to keep the default behavior of jupyter logging. + # https://jupyter-server.readthedocs.io/en/latest/operators/configuring-logging.html + "handlers": ["console"], + }, + }, +} +EOT +fi \ No newline at end of file diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/start-workflows-container.sh b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/start-workflows-container.sh new file mode 100755 index 000000000..42aae3824 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/start-workflows-container.sh @@ -0,0 +1,202 @@ +#!/bin/bash +set -eu + +# Get project directory based on storage type +PROJECT_DIR=${SMUS_PROJECT_DIR:-"$HOME/src"} +if [ -z "$SMUS_PROJECT_DIR" ]; then + MOUNT_DIR=$PROJECT_DIR +else + MOUNT_DIR=$(readlink -f "$PROJECT_DIR") # get the symlink source +fi + +# Datazone project metadata +RESOURCE_METADATA_FILE=/opt/ml/metadata/resource-metadata.json +SM_DOMAIN_ID=$(jq -r ".DomainId" < $RESOURCE_METADATA_FILE) +AWS_ACCOUNT_ID=$(jq -r '.ExecutionRoleArn | split(":")[4]' < $RESOURCE_METADATA_FILE) +ECR_ACCOUNT_ID=058264401727 +DZ_DOMAIN_ID=$(jq -r '.AdditionalMetadata.DataZoneDomainId' < $RESOURCE_METADATA_FILE) +DZ_PROJECT_ID=$(jq -r '.AdditionalMetadata.DataZoneProjectId' < $RESOURCE_METADATA_FILE) +DZ_ENV_ID=$(jq -r '.AdditionalMetadata.DataZoneEnvironmentId' < $RESOURCE_METADATA_FILE) +DZ_DOMAIN_REGION=$(jq -r '.AdditionalMetadata.DataZoneDomainRegion' < $RESOURCE_METADATA_FILE) +DZ_ENDPOINT=$(jq -r '.AdditionalMetadata.DataZoneEndpoint' < $RESOURCE_METADATA_FILE) +DZ_PROJECT_S3PATH=$(jq -r '.AdditionalMetadata.ProjectS3Path' < $RESOURCE_METADATA_FILE) + +# Workflows paths in JL +WORKFLOW_DAG_PATH="${PROJECT_DIR}/workflows/dags" +WORKFLOW_CONFIG_PATH="${PROJECT_DIR}/workflows/config" +WORKFLOW_DB_DATA_PATH="$HOME/.workflows_setup/db-data" +WORKFLOW_REQUIREMENTS_PATH="$HOME/.workflows_setup/requirements/" +WORKFLOW_PLUGINS_PATH="$HOME/.workflows_setup/plugins" +WORKFLOW_STARTUP_PATH="$HOME/.workflows_setup/startup/" +WORKFLOW_ARTIFACTS_SOURCE_DIR="/etc/sagemaker-ui/workflows" +WORKFLOW_PLUGINS_SOURCE_PATH="${WORKFLOW_ARTIFACTS_SOURCE_DIR}/plugins/*.whl" +WORKFLOW_REQUIREMENTS_SOURCE_PATH="${WORKFLOW_ARTIFACTS_SOURCE_DIR}/requirements/requirements.txt" +WORKFLOW_AIRFLOW_REQUIREMENTS_SOURCE_PATH="/etc/sagemaker-ui/workflows/requirements/requirements.txt" +WORKFLOW_OUTPUT_PATH="$HOME/jobs" +USER_REQUIREMENTS_FILE="${WORKFLOW_CONFIG_PATH}/requirements.txt" +USER_PLUGINS_FOLDER="${WORKFLOW_CONFIG_PATH}/plugins" +USER_STARTUP_FILE="${WORKFLOW_CONFIG_PATH}/startup.sh" + + +handle_workflows_startup_error() { + local step=$1 + local detailed_status="" + case $step in + 0) + detailed_status="Workflows blueprint not enabled" + ;; + 1) + detailed_status="Not enough memory" + ;; + 2) + detailed_status="Error creating directories" + ;; + 3) + detailed_status="Error installing docker" + ;; + 4) + detailed_status="Error copying prerequisite files" + ;; + 5) + detailed_status="Error starting workflows image" + # Kill any orphans that may have started + python /etc/sagemaker-ui/workflows/workflow_client.py stop-local-runner + ;; + *) + detailed_status="Unknown error" + ;; + esac + python /etc/sagemaker-ui/workflows/workflow_client.py update-local-runner-status --status 'unhealthy' --detailed-status "$detailed_status" + exit 1 +} + +# Create status log file if it doesn't exist +WORKFLOW_HEALTH_PATH="$HOME/.workflows_setup/health" +mkdir -p $WORKFLOW_HEALTH_PATH +if [ ! -f "${WORKFLOW_HEALTH_PATH}/status.json" ]; then + echo "Creating status file" + echo "[]" > "${WORKFLOW_HEALTH_PATH}/status.json" +fi + +# Only start local runner if Workflows blueprint is enabled +if [ "$(python /etc/sagemaker-ui/workflows/workflow_client.py check-blueprint --region "$DZ_DOMAIN_REGION" --domain-id "$DZ_DOMAIN_ID" --endpoint "$DZ_ENDPOINT")" = "False" ]; then + echo "Workflows blueprint is not enabled. Workflows will not start." + handle_workflows_startup_error 0 +fi + +# Do minimum system requirements check: 4GB RAM and more than 2 CPU cores +free_mem=$(free -m | awk '/^Mem:/ {print $7}') +cpu_cores=$(nproc) +if [[ $free_mem -lt 4096 ]] || [[ $cpu_cores -le 2 ]]; then + echo "There is less than 4GB of available RAM or <=2 CPU cores. Workflows will not start. Free mem: $free_mem MB, CPU cores: $cpu_cores" + handle_workflows_startup_error 1 +fi + +( +python /etc/sagemaker-ui/workflows/workflow_client.py update-local-runner-status --status 'starting' --detailed-status 'Creating directories' + +# Create necessary directories +mkdir -p $WORKFLOW_DAG_PATH +mkdir -p $WORKFLOW_CONFIG_PATH +mkdir -p $WORKFLOW_DB_DATA_PATH +mkdir -p $WORKFLOW_REQUIREMENTS_PATH +mkdir -p $WORKFLOW_PLUGINS_PATH +mkdir -p $WORKFLOW_STARTUP_PATH +mkdir -p $WORKFLOW_OUTPUT_PATH +) || handle_workflows_startup_error 2 + +( +# Set the status of the status file to 'starting' +python /etc/sagemaker-ui/workflows/workflow_client.py update-local-runner-status --status 'starting' --detailed-status 'Installing prerequisites' + +# Workflows execution environment install +sudo apt-get update +sudo install -m 0755 -d /etc/apt/keyrings +sudo rm -f /etc/apt/keyrings/docker.gpg +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg +sudo chmod a+r /etc/apt/keyrings/docker.gpg +echo \ +"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ +"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ +sudo tee /etc/apt/sources.list.d/docker.list > /dev/null +sudo apt-get update +VERSION_ID=$(cat /etc/os-release | grep -oP 'VERSION_ID=".*"' | cut -d'"' -f2) +VERSION_STRING=$(sudo apt-cache madison docker-ce | awk '{ print $3 }' | grep -i $VERSION_ID | head -n 1) +sudo apt-get install docker-ce-cli=$VERSION_STRING docker-compose-plugin=2.29.2-1~ubuntu.22.04~jammy -y --allow-downgrades +) || handle_workflows_startup_error 3 + +( +# Set status to copying files +python /etc/sagemaker-ui/workflows/workflow_client.py update-local-runner-status --status 'starting' --detailed-status 'Copying files' + +# Create .airflowignore file +cat >>"$WORKFLOW_DAG_PATH/.airflowignore" <<'END' +.ipynb_checkpoints +END + +#copy plugins from conda +cp $WORKFLOW_PLUGINS_SOURCE_PATH $WORKFLOW_PLUGINS_PATH +#copy requirements from conda +cp $WORKFLOW_REQUIREMENTS_SOURCE_PATH $WORKFLOW_REQUIREMENTS_PATH + +# Copy system startup +cp /etc/sagemaker-ui/workflows/startup/startup.sh $WORKFLOW_STARTUP_PATH + +# Append user's custom startup script, if exists +if [ -f $USER_STARTUP_FILE ]; then + tail -n +2 $USER_STARTUP_FILE >> "${WORKFLOW_STARTUP_PATH}startup.sh" +else + # Give the user a template startup script + echo "#!/bin/bash" > "${USER_STARTUP_FILE}" + echo "# Place any special instructions you'd like run during your workflows environment startup here" >> "${USER_STARTUP_FILE}" + echo "# Note that you will need to restart your space for changes to take effect." >> "${USER_STARTUP_FILE}" + echo "# For example:" >> "${USER_STARTUP_FILE}" + echo "# pip install dbt-core" >> "${USER_STARTUP_FILE}" +fi + +# Append user's custom requirements, if exists +if [ -f $USER_REQUIREMENTS_FILE ]; then + cat $USER_REQUIREMENTS_FILE >> "${WORKFLOW_REQUIREMENTS_PATH}requirements.txt" +else + # Give the user a template requirements.txt file + echo "# Place any requirements you'd like included in your workflows environment here" > "${USER_REQUIREMENTS_FILE}" + echo "# Note that you will need to restart your space for changes to take effect." >> "${USER_REQUIREMENTS_FILE}" + echo "# For example:" >> "${USER_REQUIREMENTS_FILE}" + echo "# numpy==1.26.4" >> "${USER_REQUIREMENTS_FILE}" +fi + +# Copy over any user-specified plugins, if they exist +if [ -d $USER_PLUGINS_FOLDER ]; then + cp -r $USER_PLUGINS_FOLDER/* $WORKFLOW_PLUGINS_PATH +fi + +) || handle_workflows_startup_error 4 + +( +# Set status to installing workflows image +python /etc/sagemaker-ui/workflows/workflow_client.py update-local-runner-status --status 'starting' --detailed-status 'Installing workflows image' + +# Copy sample dag if it does not exist +cp -n "/etc/sagemaker-ui/workflows/sample_dag.py" "${WORKFLOW_DAG_PATH}/" + +# Log into ECR repository +aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${ECR_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com + +PROJECT_DIR=$(basename $PROJECT_DIR) \ +MOUNT_DIR=$MOUNT_DIR \ +ECR_ACCOUNT_ID=$ECR_ACCOUNT_ID \ +ACCOUNT_ID=$AWS_ACCOUNT_ID \ +DZ_DOMAIN_ID=$DZ_DOMAIN_ID \ +DZ_PROJECT_ID=$DZ_PROJECT_ID \ +DZ_ENV_ID=$DZ_ENV_ID \ +DZ_DOMAIN_REGION=$DZ_DOMAIN_REGION \ +DZ_PROJECT_S3PATH=$DZ_PROJECT_S3PATH \ + docker compose -f /etc/sagemaker-ui/workflows/docker-compose.yaml up -d --quiet-pull +) || handle_workflows_startup_error 5 + +# Set status to waiting for image to start +python /etc/sagemaker-ui/workflows/workflow_client.py update-local-runner-status --status 'starting' --detailed-status 'Waiting for workflows image to start' + +# Start healthchecker +sleep 30 # give the container some time to start +supervisorctl -s unix:///var/run/supervisord/supervisor.sock start workflows_healthcheck diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/startup/startup.sh b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/startup/startup.sh new file mode 100755 index 000000000..1a2485251 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/startup/startup.sh @@ -0,0 +1 @@ +#!/bin/sh diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/stop-workflows-container.sh b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/stop-workflows-container.sh new file mode 100755 index 000000000..0ce31e2d5 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/stop-workflows-container.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +DOCKER_EXECUTABLE=$(which docker) + +# Stop healthchecker +supervisorctl -s unix:///var/run/supervisord/supervisor.sock stop workflows_healthcheck + +# Stop the containers +$DOCKER_EXECUTABLE compose -f /etc/sagemaker-ui/workflows/docker-compose.yaml down + +# Update status to stopped +python /etc/sagemaker-ui/workflows/workflow_client.py update-local-runner-status --status 'stopped' --detailed-status 'Shutdown completed' diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/workflow_client.py b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/workflow_client.py new file mode 100644 index 000000000..4ccec3872 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker-ui/workflows/workflow_client.py @@ -0,0 +1,114 @@ +import argparse +from datetime import datetime, timezone +from typing import Optional + +import boto3 +import requests + +JUPYTERLAB_URL = "http://default:8888/jupyterlab/default/" +WORKFLOWS_API_ENDPOINT = "api/sagemaker/workflows" +TIMESTAMP_FORMAT = "%Y-%m-%d %H:%M:%S.%f%z" + + +def _validate_response(function_name: str, response: requests.Response): + if response.status_code == 200: + return response + else: + raise RuntimeError(f"{function_name} returned {response.status_code}: {str(response.content)}") + + +def update_local_runner_status(session: requests.Session, status: str, detailed_status: Optional[str] = None, **kwargs): + response = session.post( + url=JUPYTERLAB_URL + WORKFLOWS_API_ENDPOINT + "/update-local-runner-status", + headers={"X-Xsrftoken": session.cookies.get_dict()["_xsrf"]}, + json={ + "timestamp": datetime.now(timezone.utc).strftime(TIMESTAMP_FORMAT), + "status": status, + "detailed_status": detailed_status, + }, + ) + return _validate_response("UpdateLocalRunner", response) + + +def start_local_runner(session: requests.Session, **kwargs): + response = session.post( + url=JUPYTERLAB_URL + WORKFLOWS_API_ENDPOINT + "/start-local-runner", + headers={"X-Xsrftoken": session.cookies.get_dict()["_xsrf"]}, + json={}, + ) + return _validate_response("StartLocalRunner", response) + + +def stop_local_runner(session: requests.Session, **kwargs): + response = session.post( + url=JUPYTERLAB_URL + WORKFLOWS_API_ENDPOINT + "/stop-local-runner", + headers={"X-Xsrftoken": session.cookies.get_dict()["_xsrf"]}, + json={}, + ) + return _validate_response("StopLocalRunner", response) + + +def check_blueprint(region: str, domain_id: str, endpoint: str, **kwargs): + DZ_CLIENT = boto3.client("datazone") + # add correct endpoint for gamma env + if endpoint != "": + DZ_CLIENT = boto3.client("datazone", endpoint_url=endpoint) + try: + blueprint_id = DZ_CLIENT.list_environment_blueprints( + managed=True, domainIdentifier=domain_id, name="Workflows" + )["items"][0]["id"] + blueprint_config = DZ_CLIENT.get_environment_blueprint_configuration( + domainIdentifier=domain_id, environmentBlueprintIdentifier=blueprint_id + ) + enabled_regions = blueprint_config["enabledRegions"] + print(str(region in enabled_regions)) + except: + print("False") + + +COMMAND_REGISTRY = { + "update-local-runner-status": update_local_runner_status, + "start-local-runner": start_local_runner, + "stop-local-runner": stop_local_runner, + "check-blueprint": check_blueprint, +} + + +def main(): + parser = argparse.ArgumentParser(description="Workflow local runner client") + subparsers = parser.add_subparsers(dest="command", help="Available commands") + + update_status_parser = subparsers.add_parser("update-local-runner-status", help="Update status of local runner") + update_status_parser.add_argument("--status", type=str, required=True, help="Status to update") + update_status_parser.add_argument("--detailed-status", type=str, required=False, help="Detailed status text") + + start_parser = subparsers.add_parser("start-local-runner", help="Start local runner") + + stop_parser = subparsers.add_parser("stop-local-runner", help="Stop local runner") + + check_blueprint_parser = subparsers.add_parser("check-blueprint", help="Check Workflows blueprint") + check_blueprint_parser.add_argument( + "--domain-id", type=str, required=True, help="Datazone Domain ID for blueprint check" + ) + check_blueprint_parser.add_argument("--region", type=str, required=True, help="Datazone Domain region") + check_blueprint_parser.add_argument( + "--endpoint", type=str, required=True, help="Datazone endpoint for blueprint check" + ) + + args = parser.parse_args() + + # create the request session + session = requests.Session() + # populate XSRF cookie + session.get(JUPYTERLAB_URL) + + kwargs = vars(args) | {"session": session} + + if args.command in COMMAND_REGISTRY: + COMMAND_REGISTRY[args.command](**kwargs) + else: + parser.print_help() + + +if __name__ == "__main__": + main() diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker/sm_pysdk_default_config.py b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker/sm_pysdk_default_config.py new file mode 100644 index 000000000..1a8457b4c --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/sagemaker/sm_pysdk_default_config.py @@ -0,0 +1,122 @@ +import json +import os +import re + +import yaml + + +def generate_intelligent_default_config(metadata: str) -> dict: + config = { + "SchemaVersion": "1.0", + "SageMaker": { + "PythonSDK": { + "Modules": { + "Session": { + "DefaultS3Bucket": metadata["S3Bucket"], + "DefaultS3ObjectKeyPrefix": metadata["S3ObjectKeyPrefix"], + }, + "RemoteFunction": { + "IncludeLocalWorkDir": True, + "VpcConfig": {"SecurityGroupIds": metadata["SecurityGroupIds"], "Subnets": metadata["Subnets"]}, + }, + "NotebookJob": { + "RoleArn": metadata["UserRoleArn"], + "S3RootUri": f"s3://{metadata['S3Bucket']}/{metadata['S3ObjectKeyPrefix']}", + "VpcConfig": {"SecurityGroupIds": metadata["SecurityGroupIds"], "Subnets": metadata["Subnets"]}, + }, + "Serve": {"S3ModelDataUri": f"s3://{metadata['S3Bucket']}/{metadata['S3ObjectKeyPrefix']}"}, + } + }, + "MonitoringSchedule": { + "MonitoringScheduleConfig": { + "MonitoringJobDefinition": { + "NetworkConfig": { + "VpcConfig": { + "SecurityGroupIds": metadata["SecurityGroupIds"], + "Subnets": metadata["Subnets"], + } + } + } + } + }, + "AutoMLJob": { + "AutoMLJobConfig": { + "SecurityConfig": { + "VpcConfig": {"SecurityGroupIds": metadata["SecurityGroupIds"], "Subnets": metadata["Subnets"]} + } + } + }, + "AutoMLJobV2": { + "SecurityConfig": { + "VpcConfig": {"SecurityGroupIds": metadata["SecurityGroupIds"], "Subnets": metadata["Subnets"]} + } + }, + "CompilationJob": { + "VpcConfig": {"SecurityGroupIds": metadata["SecurityGroupIds"], "Subnets": metadata["Subnets"]} + }, + "Pipeline": {"RoleArn": metadata["UserRoleArn"]}, + "Model": { + "VpcConfig": {"SecurityGroupIds": metadata["SecurityGroupIds"], "Subnets": metadata["Subnets"]}, + "ExecutionRoleArn": metadata["UserRoleArn"], + }, + "ModelPackage": {"ValidationSpecification": {"ValidationRole": metadata["UserRoleArn"]}}, + "ProcessingJob": { + "NetworkConfig": { + "VpcConfig": {"SecurityGroupIds": metadata["SecurityGroupIds"], "Subnets": metadata["Subnets"]} + }, + "RoleArn": metadata["UserRoleArn"], + }, + "TrainingJob": { + "RoleArn": metadata["UserRoleArn"], + "VpcConfig": {"SecurityGroupIds": metadata["SecurityGroupIds"], "Subnets": metadata["Subnets"]}, + }, + }, + } + return config + + +if __name__ == "__main__": + try: + config = {} + resource_metadata = "/opt/ml/metadata/resource-metadata.json" + + PROJECT_S3_PATH = "ProjectS3Path" + SECURITY_GROUP = "SecurityGroup" + PRIVATE_SUBNETS = "PrivateSubnets" + META_DATA = "AdditionalMetadata" + EXECUTION_ROLE_ARN = "ExecutionRoleArn" + CONFIG_FILE_NAME = "config.yaml" + CONFIG_DIR = "/etc/xdg/sagemaker/" + + if os.path.exists(resource_metadata): + with open(resource_metadata, "r") as file: + data = json.load(file) + + s3_path = data[META_DATA].get(PROJECT_S3_PATH, "") + metadata = { + # user provided bucket + "S3Bucket": re.search(r"s3://([^/]+)/", s3_path).group(1), + # ${datazoneEnvironmentDomainId}/${datazoneEnvironmentProjectId}/${datazoneScopeName}/ + "S3ObjectKeyPrefix": s3_path.split("//")[1].split("/", 1)[1], + # TODO: Is this a billing concern if set default + # 'InstanceType': 'ml.m5.xlarge', + "SecurityGroupIds": data[META_DATA].get(SECURITY_GROUP, "").split(","), + "Subnets": data[META_DATA].get(PRIVATE_SUBNETS, "").split(","), + "UserRoleArn": data[EXECUTION_ROLE_ARN], + } + + # Not create config file when invalid value exists in metadata + empty_values = [key for key, value in metadata.items() if value == "" or value == [""]] + if empty_values: + raise AttributeError(f"There are empty values in the metadata: {empty_values}") + + config = generate_intelligent_default_config(metadata) + else: + raise FileNotFoundError("No resource-metadata.json exists on host!") + + # Write the config YAML file to default location of the admin config file + with open(os.path.join(CONFIG_DIR, CONFIG_FILE_NAME), "w") as f: + yaml.dump(config, f, default_flow_style=False, sort_keys=False) + + except Exception as e: + print(f"Error: {e}, SageMaker PySDK intelligent config file is not valid!") diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-code-editor.conf b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-code-editor.conf new file mode 100644 index 000000000..58e187d02 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-code-editor.conf @@ -0,0 +1,12 @@ +[include] +files = supervisord-common.conf + +[program:codeeditorserver] +directory=%(ENV_HOME)s +command=start-code-editor +autostart=true +autorestart=true +stdout_logfile=/dev/fd/1 ; Redirect web server logs to stdout +stderr_logfile=/dev/fd/1 +stdout_logfile_maxbytes = 0 ; Fix: https://github.com/Supervisor/supervisor/issues/935 +stderr_logfile_maxbytes = 0 ; Fix: https://github.com/Supervisor/supervisor/issues/935 diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-common.conf b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-common.conf new file mode 100644 index 000000000..27820d4c4 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-common.conf @@ -0,0 +1,18 @@ +[supervisord] +nodaemon=true + +pidfile=/var/run/supervisord/supervisord.pid +logfile=%(ENV_STUDIO_LOGGING_DIR)s/%(ENV_SAGEMAKER_APP_TYPE_LOWERCASE)s/supervisord/supervisord.log +logfile_maxbytes=5MB +logfile_backups=10 +redirect_stderr=true + +[unix_http_server] +file=/var/run/supervisord/supervisor.sock +chmod=0700 + +[supervisorctl] +serverurl=unix:///var/run/supervisord/supervisor.sock + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-jupyter-lab.conf b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-jupyter-lab.conf new file mode 100644 index 000000000..5694ac116 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-jupyter-lab.conf @@ -0,0 +1,11 @@ +[include] +files = supervisord-common.conf + +[program:jupyterlabserver] +directory=%(ENV_HOME)s +command=start-jupyter-server +stopasgroup=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-sagemaker-ui-code-editor.conf b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-sagemaker-ui-code-editor.conf new file mode 100644 index 000000000..41dec7fe1 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-sagemaker-ui-code-editor.conf @@ -0,0 +1,28 @@ +[supervisord] +nodaemon=true + +pidfile=/var/run/supervisord/supervisord.pid +logfile=%(ENV_STUDIO_LOGGING_DIR)s/%(ENV_SAGEMAKER_APP_TYPE_LOWERCASE)s/supervisord/supervisord.log +logfile_maxbytes=5MB +logfile_backups=10 +redirect_stderr=true + +[unix_http_server] +file=/var/run/supervisord/supervisor.sock +chmod=0700 + +[supervisorctl] +serverurl=unix:///var/run/supervisord/supervisor.sock + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[program:codeeditorserver] +directory=%(ENV_HOME)s +command=start-sagemaker-ui-code-editor +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 \ No newline at end of file diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-sagemaker-ui-default.conf b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-sagemaker-ui-default.conf new file mode 100644 index 000000000..13ffc89f3 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-sagemaker-ui-default.conf @@ -0,0 +1,27 @@ +[supervisord] +nodaemon=true + +pidfile=/var/run/supervisord/supervisord.pid +logfile=%(ENV_STUDIO_LOGGING_DIR)s/%(ENV_SAGEMAKER_APP_TYPE_LOWERCASE)s/supervisord/supervisord.log +logfile_maxbytes=5MB +logfile_backups=10 +redirect_stderr=true + +[unix_http_server] +file=/var/run/supervisord/supervisor.sock +chmod=0700 + +[supervisorctl] +serverurl=unix:///var/run/supervisord/supervisor.sock + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[program:jupyterlabserver] +directory=%(ENV_HOME)s +command=start-sagemaker-ui-default-jupyter-server +stopasgroup=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-sagemaker-ui.conf b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-sagemaker-ui.conf new file mode 100644 index 000000000..ed00f4d5b --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord-sagemaker-ui.conf @@ -0,0 +1,35 @@ +[supervisord] +nodaemon=true + +pidfile=/var/run/supervisord/supervisord.pid +logfile=%(ENV_STUDIO_LOGGING_DIR)s/%(ENV_SAGEMAKER_APP_TYPE_LOWERCASE)s/supervisord/supervisord.log +logfile_maxbytes=5MB +logfile_backups=10 +redirect_stderr=true + +[unix_http_server] +file=/var/run/supervisord/supervisor.sock +chmod=0700 + +[supervisorctl] +serverurl=unix:///var/run/supervisord/supervisor.sock + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[program:jupyterlabserver] +directory=%(ENV_HOME)s +command=start-sagemaker-ui-jupyter-server +stopasgroup=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:workflows_healthcheck] +command=bash -c "/etc/sagemaker-ui/workflows/healthcheck.sh" +autostart=false +redirect_stderr=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile_maxbytes=0 diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord.conf b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord.conf new file mode 100644 index 000000000..686f4a5c4 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/etc/supervisor/conf.d/supervisord.conf @@ -0,0 +1,27 @@ +[supervisord] +nodaemon=true + +pidfile=/var/run/supervisord/supervisord.pid +logfile=%(ENV_STUDIO_LOGGING_DIR)s/%(ENV_SAGEMAKER_APP_TYPE_LOWERCASE)s/supervisord/supervisord.log +logfile_maxbytes=5MB +logfile_backups=10 +redirect_stderr=true + +[unix_http_server] +file=/var/run/supervisord/supervisor.sock +chmod=0700 + +[supervisorctl] +serverurl=unix:///var/run/supervisord/supervisor.sock + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[program:jupyterlabserver] +directory=%(ENV_HOME)s +command=start-jupyter-server +stopasgroup=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/entrypoint-code-editor b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/entrypoint-code-editor new file mode 100755 index 000000000..bf55a3713 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/entrypoint-code-editor @@ -0,0 +1,16 @@ +#!/bin/bash + +set -e + +# Generate and execute the shell code to modifies shell variables to include +# micromamba commands (e.g. using `micromamba activate` to activate environments) +eval "$(micromamba shell hook --shell=bash)" + +# Activate conda environment 'base', where supervisord is installed +micromamba activate base + +# Set up SAGEMAKER_APP_TYPE_LOWERCASE based on SAGEMAKER_APP_TYPE +export SAGEMAKER_APP_TYPE_LOWERCASE=$(echo $SAGEMAKER_APP_TYPE | tr '[:upper:]' '[:lower:]') + +mkdir -p $STUDIO_LOGGING_DIR/$SAGEMAKER_APP_TYPE_LOWERCASE/supervisord +exec supervisord -c /etc/supervisor/conf.d/supervisord-code-editor.conf -n diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/entrypoint-jupyter-server b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/entrypoint-jupyter-server new file mode 100755 index 000000000..f71e97f79 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/entrypoint-jupyter-server @@ -0,0 +1,25 @@ +#!/bin/bash + +set -e + +# Generate and execute the shell code to modifies shell variables to include +# micromamba commands (e.g. using `micromamba activate` to activate environments) +eval "$(micromamba shell hook --shell=bash)" + +if [ -n "$SAGEMAKER_RECOVERY_MODE" ]; then + export HOME=$SAGEMAKER_RECOVERY_MODE_HOME + # Activate conda environment `sagemaker-recovery-mode` + micromamba activate /opt/conda/envs/sagemaker-recovery-mode +else + # Activate conda environment 'base' + micromamba activate base +fi + +# Set up SAGEMAKER_APP_TYPE_LOWERCASE based on SAGEMAKER_APP_TYPE +export SAGEMAKER_APP_TYPE_LOWERCASE=$(echo $SAGEMAKER_APP_TYPE | tr '[:upper:]' '[:lower:]') + +# Start supervisord with supervisord configuration +# Since program 'jupyterlabserver' autostarts by default, it will be started +# automatically along with supervisord +mkdir -p $STUDIO_LOGGING_DIR/$SAGEMAKER_APP_TYPE_LOWERCASE/supervisord +exec supervisord -c /etc/supervisor/conf.d/supervisord.conf -n diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/entrypoint-sagemaker-ui-code-editor b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/entrypoint-sagemaker-ui-code-editor new file mode 100755 index 000000000..82ed47ffe --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/entrypoint-sagemaker-ui-code-editor @@ -0,0 +1,16 @@ +#!/bin/bash + +set -e + +# Generate and execute the shell code to modifies shell variables to include +# micromamba commands (e.g. using `micromamba activate` to activate environments) +eval "$(micromamba shell hook --shell=bash)" + +# Activate conda environment 'base', where supervisord is installed +micromamba activate base + +export SAGEMAKER_APP_TYPE_LOWERCASE=$(echo $SAGEMAKER_APP_TYPE | tr '[:upper:]' '[:lower:]') +export SERVICE_NAME='SageMakerUnifiedStudio' + +mkdir -p $STUDIO_LOGGING_DIR/$SAGEMAKER_APP_TYPE_LOWERCASE/supervisord +exec supervisord -c /etc/supervisor/conf.d/supervisord-sagemaker-ui-code-editor.conf -n \ No newline at end of file diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/entrypoint-sagemaker-ui-jupyter-server b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/entrypoint-sagemaker-ui-jupyter-server new file mode 100755 index 000000000..49c34623a --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/entrypoint-sagemaker-ui-jupyter-server @@ -0,0 +1,26 @@ +#!/bin/bash + +set -e + +# Generate and execute the shell code to modifies shell variables to include +# micromamba commands (e.g. using `micromamba activate` to activate environments) +eval "$(micromamba shell hook --shell=bash)" + +# apply patches for SMUS +/etc/patches/apply_patches.sh smus && sudo rm -rf /etc/patches + +# Activate conda environment depending on if we are in Recovery or Standard mode. +if [ -n "$SAGEMAKER_RECOVERY_MODE" ]; then + export HOME=$SAGEMAKER_RECOVERY_MODE_HOME + # Activate conda environment `sagemaker-recovery-mode` + micromamba activate sagemaker-recovery-mode +else + # Activate conda environment 'base', where supervisord is installed + micromamba activate base +fi + +export SAGEMAKER_APP_TYPE_LOWERCASE=$(echo $SAGEMAKER_APP_TYPE | tr '[:upper:]' '[:lower:]') +export SERVICE_NAME='SageMakerUnifiedStudio' + +mkdir -p $STUDIO_LOGGING_DIR/$SAGEMAKER_APP_TYPE_LOWERCASE/supervisord +exec supervisord -c /etc/supervisor/conf.d/supervisord-sagemaker-ui.conf -n diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/merge-settings-util.py b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/merge-settings-util.py new file mode 100644 index 000000000..8b93cae1c --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/merge-settings-util.py @@ -0,0 +1,22 @@ +import json +from sys import argv + + +# merges json files file1 and file2, keys in file2 overwriting any keys that already exist in file1 +def main(): + file1, file2 = argv[1], argv[2] + # Read JSON data from files + with open(file1, "r") as f1, open(file2, "r") as f2: + data1 = json.load(f1) + data2 = json.load(f2) + + # Merge the data (simple update) + merged_data = {**data1, **data2} + + # Write the merged data to a new file + with open(file1, "w") as f: + json.dump(merged_data, f) + + +if __name__ == "__main__": + main() diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/restart-jupyter-server b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/restart-jupyter-server new file mode 100755 index 000000000..6f2af98d3 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/restart-jupyter-server @@ -0,0 +1,6 @@ +#!/bin/bash +set -e +echo "Restarting the Jupyter server. This page should refresh in a few seconds. Note that any terminals will be closed." +echo "If this page doesn't refresh after a few seconds, try reloading your browser window." +echo "Restarting now..." +nohup supervisorctl -c /etc/supervisor/conf.d/supervisord.conf restart jupyterlabserver > /dev/null 2>&1 & diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/restart-sagemaker-ui-jupyter-server b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/restart-sagemaker-ui-jupyter-server new file mode 100755 index 000000000..8f5207b8a --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/restart-sagemaker-ui-jupyter-server @@ -0,0 +1,6 @@ +#!/bin/bash +set -e +echo "Restarting the Jupyter server. This page should refresh in a few seconds. Note that any terminals will be closed." +echo "If this page doesn't refresh after a few seconds, try reloading your browser window." +echo "Restarting now..." +nohup supervisorctl -c /etc/supervisor/conf.d/supervisord-sagemaker-ui.conf restart jupyterlabserver > /dev/null 2>&1 & diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/start-code-editor b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/start-code-editor new file mode 100755 index 000000000..bdd97c16a --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/start-code-editor @@ -0,0 +1,84 @@ +#!/bin/bash +set -e + +EFS_MOUNT_POINT="/opt/amazon/sagemaker" +EBS_MOUNT_POINT="/home/sagemaker-user" + +persistent_settings_folder="${EBS_MOUNT_POINT}/sagemaker-code-editor-server-data" +default_settings_folder="${EFS_MOUNT_POINT}/sagemaker-code-editor-server-data" + +override_machine_settings() { + # create a new settings file with preset defaults or merge the defaults into the existing settings file + local settings_relative_path="data/Machine" + local settings_file_path_suffix="${settings_relative_path}/settings.json" + local persistent_machine_settings_file="${persistent_settings_folder}/${settings_file_path_suffix}" + local default_machine_settings_file="${default_settings_folder}/${settings_file_path_suffix}" + + if [ ! -f "$persistent_machine_settings_file" ]; then + # copy settings file to EBS if it doesn't exist in EBS + mkdir -p "${persistent_settings_folder}/${settings_relative_path}" + cp "$default_machine_settings_file" "$persistent_machine_settings_file" + echo "Created persistent settings file with default settings at $persistent_machine_settings_file" + else + # if it does exist then merge settings + echo "File already exists: ${persistent_machine_settings_file}. Merging default settings with existing settings." + python3 /usr/local/bin/merge-settings-util.py "$persistent_machine_settings_file" "$default_machine_settings_file" + fi +} + +copy_user_settings() { + local settings_relative_path="data/User" + local settings_file_path_suffix="${settings_relative_path}/settings.json" + local persistent_user_settings_file="${persistent_settings_folder}/${settings_file_path_suffix}" + local default_user_settings_file="${default_settings_folder}/${settings_file_path_suffix}" + if [ ! -f "$persistent_user_settings_file" ]; then + # copy user settings file to EBS if it doesn't exist in EBS + mkdir -p "${persistent_settings_folder}/${settings_relative_path}" + cp "$default_user_settings_file" "$persistent_user_settings_file" + echo "Created persistent settings file with default settings at $persistent_user_settings_file" + fi +} + +install_prepackaged_extensions() { + local prepackaged_extensions_dir="${default_settings_folder}/extensions" + local persistent_extensions_dir="${persistent_settings_folder}/extensions" + + # if extensions directory doesn't exist then this is the first time opening the app + if [ ! -d "${persistent_extensions_dir}" ]; then + mkdir -p $persistent_extensions_dir + + # find all pre-packaged extensions folders, symlink them to the persistent volume + find "$prepackaged_extensions_dir" -mindepth 1 -maxdepth 1 -type d | while read -r dir; do + dir_name=$(basename "$dir") + + ln -s "$dir" "${persistent_extensions_dir}/${dir_name}" + echo "Added extension: $dir" + done + fi +} + +eval "$(micromamba shell hook --shell=bash)" + +# Activate conda environment 'base', which is the default environment for sagemaker-distribution +micromamba activate base + +# Start code-editor server +if [ -n "$SAGEMAKER_APP_TYPE_LOWERCASE" ]; then + # SAGEMAKER_APP_TYPE is set, indicating the server is running within a SageMaker app. + override_machine_settings + copy_user_settings + install_prepackaged_extensions + # Configure the base url to be `//default`. + sagemaker-code-editor --host 0.0.0.0 --port 8888 \ + --without-connection-token \ + --base-path "/$SAGEMAKER_APP_TYPE_LOWERCASE/default" \ + --server-data-dir $persistent_settings_folder \ + --extensions-dir ${persistent_settings_folder}/extensions \ + --user-data-dir /opt/amazon/sagemaker/sagemaker-code-editor-user-data +else + sagemaker-code-editor --host 0.0.0.0 --port 8888 \ + --without-connection-token \ + --server-data-dir /opt/amazon/sagemaker/sagemaker-code-editor-server-data \ + --extension-dir /opt/amazon/sagemaker/sagemaker-code-editor-server-data/extensions \ + --user-data-dir /opt/amazon/sagemaker/sagemaker-code-editor-user-data +fi diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/start-jupyter-server b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/start-jupyter-server new file mode 100755 index 000000000..a0242ffb1 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/start-jupyter-server @@ -0,0 +1,43 @@ +#!/bin/bash +set -e + +eval "$(micromamba shell hook --shell=bash)" + +if [ -n "$SAGEMAKER_RECOVERY_MODE" ]; then + export HOME=$SAGEMAKER_RECOVERY_MODE_HOME + # Activate conda environment `sagemaker-recovery-mode` + micromamba activate /opt/conda/envs/sagemaker-recovery-mode +else + # Activate conda environment 'base' + micromamba activate base + jupyter labextension disable @amzn/sagemaker-data-explorer-jl-plugin sagemaker-data-explorer:plugin amzn/sagemaker-ui-theme-jlplugin @amzn/sagemaker-ui-doc-manager-jl-plugin @amzn/sagemaker-connection-magics-jlextension +fi + +# Start Jupyter server in rtc mode for shared spaces +if [ -n "$SAGEMAKER_APP_TYPE_LOWERCASE" ] && [ "$SAGEMAKER_SPACE_TYPE_LOWERCASE" == "shared" ]; then + jupyter labextension enable @jupyter/collaboration-extension + # SAGEMAKER_APP_TYPE is set, indicating the server is running within a SageMaker + # app. Configure the base url to be `//default`. + # SAGEMAKER_SPACE_TYPE_LOWERCASE flag is used to determine if the server should start + # in real-time-collaboration mode for a given space. + jupyter lab --ip 0.0.0.0 --port 8888 \ + --ServerApp.base_url="/$SAGEMAKER_APP_TYPE_LOWERCASE/default" \ + --ServerApp.token='' \ + --ServerApp.allow_origin='*' \ + --collaborative \ + --ServerApp.identity_provider_class=sagemaker_jupyterlab_extension_common.identity.SagemakerIdentityProvider \ + --YDocExtension.ystore_class=sagemaker_jupyterlab_extension_common.ydoc_override.ydoc.MySQLiteYStore + +# Start Jupyter server +elif [ -n "$SAGEMAKER_APP_TYPE_LOWERCASE" ]; then + # SAGEMAKER_APP_TYPE is set, indicating the server is running within a SageMaker + # app. Configure the base url to be `//default`. + jupyter lab --ip 0.0.0.0 --port 8888 \ + --ServerApp.base_url="/$SAGEMAKER_APP_TYPE_LOWERCASE/default" \ + --ServerApp.token='' \ + --ServerApp.allow_origin='*' +else + jupyter lab --ip 0.0.0.0 --port 8888 \ + --ServerApp.token='' \ + --ServerApp.allow_origin='*' +fi diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/start-sagemaker-ui-code-editor b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/start-sagemaker-ui-code-editor new file mode 100755 index 000000000..9183f4858 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/start-sagemaker-ui-code-editor @@ -0,0 +1,107 @@ +#!/bin/bash +set -e + +EFS_MOUNT_POINT="/opt/amazon/sagemaker" +EBS_MOUNT_POINT="/home/sagemaker-user" + +persistent_settings_folder="${EBS_MOUNT_POINT}/sagemaker-code-editor-server-data" +default_settings_folder="${EFS_MOUNT_POINT}/sagemaker-code-editor-server-data" + +override_machine_settings() { + # create a new settings file with preset defaults or merge the defaults into the existing settings file + local settings_relative_path="data/Machine" + local settings_file_path_suffix="${settings_relative_path}/settings.json" + local persistent_machine_settings_file="${persistent_settings_folder}/${settings_file_path_suffix}" + local default_machine_settings_file="${default_settings_folder}/${settings_file_path_suffix}" + + if [ ! -f "$persistent_machine_settings_file" ]; then + # copy settings file to EBS if it doesn't exist in EBS + mkdir -p "${persistent_settings_folder}/${settings_relative_path}" + cp "$default_machine_settings_file" "$persistent_machine_settings_file" + echo "Created persistent settings file with default settings at $persistent_machine_settings_file" + else + # if it does exist then merge settings + echo "File already exists: ${persistent_machine_settings_file}. Merging default settings with existing settings." + python3 /usr/local/bin/merge-settings-util.py "$persistent_machine_settings_file" "$default_machine_settings_file" + fi +} + +copy_user_settings() { + local settings_relative_path="data/User" + local settings_file_path_suffix="${settings_relative_path}/settings.json" + local persistent_user_settings_file="${persistent_settings_folder}/${settings_file_path_suffix}" + local default_user_settings_file="${default_settings_folder}/${settings_file_path_suffix}" + if [ ! -f "$persistent_user_settings_file" ]; then + # copy user settings file to EBS if it doesn't exist in EBS + mkdir -p "${persistent_settings_folder}/${settings_relative_path}" + cp "$default_user_settings_file" "$persistent_user_settings_file" + echo "Created persistent settings file with default settings at $persistent_user_settings_file" + fi +} + +install_prepackaged_extensions() { + local prepackaged_extensions_dir="${default_settings_folder}/extensions" + local persistent_extensions_dir="${persistent_settings_folder}/extensions" + + # if extensions directory doesn't exist then this is the first time opening the app + if [ ! -d "${persistent_extensions_dir}" ]; then + mkdir -p $persistent_extensions_dir + + # find all pre-packaged extensions folders, symlink them to the persistent volume + find "$prepackaged_extensions_dir" -mindepth 1 -maxdepth 1 -type d | while read -r dir; do + dir_name=$(basename "$dir") + + ln -s "$dir" "${persistent_extensions_dir}/${dir_name}" + echo "Added extension: $dir" + done + fi +} + +set_code_editor_theme() { + echo "Setting code editor theme" + bash /etc/sagemaker-ui/set_code_editor_theme.sh +} + +disableJupyterKernels() { + local kernel_list + kernel_list=$(jupyter kernelspec list) + + for kernel in "$@"; do + if echo "$kernel_list" | grep -q "$kernel"; then + echo "Removing kernel: $kernel" + jupyter kernelspec remove -f -y "$kernel" + else + echo "Kernel not found: $kernel" + fi + done +} + +eval "$(micromamba shell hook --shell=bash)" + +# Activate conda environment 'base', which is the default environment for sagemaker-distribution +micromamba activate base + +# Disable Jupyter Kernels +disableJupyterKernels pysparkkernel sparkkernel glue_spark glue_pyspark + +# Start code-editor server +if [ -n "$SAGEMAKER_APP_TYPE_LOWERCASE" ]; then + # SAGEMAKER_APP_TYPE is set, indicating the server is running within a SageMaker app. + override_machine_settings + copy_user_settings + install_prepackaged_extensions + set_code_editor_theme + # Configure the base url to be `//default`. + sagemaker-code-editor --host 0.0.0.0 --port 8888 \ + --without-connection-token \ + --base-path "/$SAGEMAKER_APP_TYPE_LOWERCASE/default" \ + --server-data-dir $persistent_settings_folder \ + --extensions-dir ${persistent_settings_folder}/extensions \ + --user-data-dir /opt/amazon/sagemaker/sagemaker-code-editor-user-data +else + sagemaker-code-editor --host 0.0.0.0 --port 8888 \ + --without-connection-token \ + --server-data-dir /opt/amazon/sagemaker/sagemaker-code-editor-server-data \ + --extension-dir /opt/amazon/sagemaker/sagemaker-code-editor-server-data/extensions \ + --user-data-dir /opt/amazon/sagemaker/sagemaker-code-editor-user-data +fi \ No newline at end of file diff --git a/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/start-sagemaker-ui-jupyter-server b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/start-sagemaker-ui-jupyter-server new file mode 100755 index 000000000..dfe780ef2 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/dirs/usr/local/bin/start-sagemaker-ui-jupyter-server @@ -0,0 +1,52 @@ +#!/bin/bash +set -e + +eval "$(micromamba shell hook --shell=bash)" + +# Activate conda environment depending on if we are in Recovery or Standard mode. +if [ -n "$SAGEMAKER_RECOVERY_MODE" ]; then + # Activate conda environment `sagemaker-recovery-mode` + micromamba activate sagemaker-recovery-mode +else + # Activate conda environment 'base' which is the default for Cosmos + micromamba activate base +fi + +sudo cp -r /etc/sagemaker-ui/kernels/. /opt/conda/share/jupyter/kernels/ +sudo cp /etc/sagemaker-ui/jupyter/server/jupyter_server_config.py /opt/conda/etc/jupyter/ + +mkdir -p /opt/conda/share/jupyter/lab/settings +cp -r /etc/sagemaker-ui/jupyter/lab/settings/. /opt/conda/share/jupyter/lab/settings + +if [[ $(jupyter kernelspec list | grep pysparkkernel) ]]; then + jupyter-kernelspec remove -f -y pysparkkernel +fi + +if [[ $(jupyter kernelspec list | grep sparkkernel) ]]; then + jupyter-kernelspec remove -f -y sparkkernel +fi + +if [[ $(jupyter kernelspec list | grep glue_spark) ]]; then + jupyter-kernelspec remove -f -y glue_spark +fi + +if [[ $(jupyter kernelspec list | grep glue_pyspark) ]]; then + jupyter-kernelspec remove -f -y glue_pyspark +fi + +if [ -n "$SAGEMAKER_RECOVERY_MODE" ]; then + # Disabling collaboration and identity_provider_class flags for recovery mode + jupyter lab --ip 0.0.0.0 --port 8888 \ + --ServerApp.base_url="/$SAGEMAKER_APP_TYPE_LOWERCASE/default" \ + --ServerApp.token='' \ + --ServerApp.allow_origin='*' \ + --SchedulerApp.db_url='sqlite:////tmp/.jupyter_scheduler_do_not_delete.sqlite' +else + jupyter lab --ip 0.0.0.0 --port 8888 \ + --ServerApp.base_url="/$SAGEMAKER_APP_TYPE_LOWERCASE/default" \ + --ServerApp.token='' \ + --ServerApp.allow_origin='*' \ + --SchedulerApp.db_url='sqlite:////tmp/.jupyter_scheduler_do_not_delete.sqlite' \ + --collaborative \ + --ServerApp.identity_provider_class='sagemaker_jupyter_server_extension.identity.SageMakerIdentityProvider' +fi \ No newline at end of file diff --git a/build_artifacts/v3/v3.3/v3.3.3/gpu.arg_based_env.in b/build_artifacts/v3/v3.3/v3.3.3/gpu.arg_based_env.in new file mode 100644 index 000000000..577d9abbe --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/gpu.arg_based_env.in @@ -0,0 +1,6 @@ +conda-forge::cuda-compiler=$CUDA_MAJOR_MINOR_VERSION +conda-forge::cuda-libraries=$CUDA_MAJOR_MINOR_VERSION +conda-forge::cuda-libraries-dev=$CUDA_MAJOR_MINOR_VERSION +conda-forge::cuda-nvml-dev=12.6.77.* +conda-forge::cuda-command-line-tools=$CUDA_MAJOR_MINOR_VERSION +conda-forge::gds-tools=1.11.1.6.* \ No newline at end of file diff --git a/build_artifacts/v3/v3.3/v3.3.3/gpu.env.in b/build_artifacts/v3/v3.3/v3.3.3/gpu.env.in new file mode 100644 index 000000000..22b210862 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/gpu.env.in @@ -0,0 +1,66 @@ +# This file is auto-generated. +conda-forge::s3fs[version='>=2024.12.0,<2024.13.0'] +conda-forge::seaborn[version='>=0.13.2,<0.14.0'] +conda-forge::jupyter-activity-monitor-extension[version='>=0.3.2,<0.4.0'] +conda-forge::mlflow[version='>=2.22.0,<2.23.0'] +conda-forge::sagemaker-mlflow[version='>=0.1.0,<0.2.0'] +conda-forge::langchain-aws[version='>=0.2.19,<0.3.0'] +conda-forge::jupyter-collaboration[version='>=3.1.0,<3.2.0'] +conda-forge::sagemaker-code-editor[version='>=1.6.2,<1.7.0'] +conda-forge::amazon-sagemaker-jupyter-ai-q-developer[version='>=1.2.7,<1.3.0'] +conda-forge::amazon-q-developer-jupyterlab-ext[version='>=3.4.8,<3.5.0'] +conda-forge::amazon_sagemaker_sql_editor[version='>=0.1.18,<0.2.0'] +conda-forge::amazon-sagemaker-sql-magic[version='>=0.1.4,<0.2.0'] +conda-forge::langchain[version='>=0.3.26,<0.4.0'] +conda-forge::fastapi[version='>=0.115.14,<0.116.0'] +conda-forge::uvicorn[version='>=0.35.0,<0.36.0'] +conda-forge::pytorch[version='>=2.6.0,<2.7.0'] +conda-forge::tensorflow[version='>=2.18.0,<2.19.0'] +conda-forge::python[version='>=3.12.9,<3.13.0'] +conda-forge::pip[version='>=25.1.1,<25.2.0'] +conda-forge::torchvision[version='>=0.21.0,<0.22.0'] +conda-forge::numpy[version='>=1.26.4,<1.27.0'] +conda-forge::pandas[version='>=2.2.3,<2.3.0'] +conda-forge::scikit-learn[version='>=1.6.1,<1.7.0'] +conda-forge::jinja2[version='>=3.1.6,<3.2.0'] +conda-forge::matplotlib-base[version='>=3.10.3,<3.11.0'] +conda-forge::sagemaker-headless-execution-driver[version='>=0.0.13,<0.1.0'] +conda-forge::ipython[version='>=8.37.0,<8.38.0'] +conda-forge::scipy[version='>=1.15.2,<1.16.0'] +conda-forge::keras[version='>=3.10.0,<3.11.0'] +conda-forge::py-xgboost-gpu[version='>=2.1.4,<2.2.0'] +conda-forge::jupyterlab[version='>=4.4.4,<4.5.0'] +conda-forge::ipywidgets[version='>=8.1.7,<8.2.0'] +conda-forge::conda[version='>=25.5.1,<25.6.0'] +conda-forge::boto3[version='>=1.37.1,<1.38.0'] +conda-forge::sagemaker-python-sdk[version='>=2.245.0,<2.246.0'] +conda-forge::supervisor[version='>=4.2.5,<4.3.0'] +conda-forge::autogluon[version='>=1.3.1,<1.4.0'] +conda-forge::aws-glue-sessions[version='>=1.0.9,<1.1.0'] +conda-forge::sagemaker-kernel-wrapper[version='>=0.0.5,<0.1.0'] +conda-forge::jupyter-ai[version='>=2.31.5,<2.32.0'] +conda-forge::jupyter-scheduler[version='>=2.11.0,<2.12.0'] +conda-forge::jupyter-lsp[version='>=2.2.5,<2.3.0'] +conda-forge::jupyterlab-lsp[version='>=5.0.3,<5.1.0'] +conda-forge::jupyterlab-git[version='>=0.51.2,<0.52.0'] +conda-forge::python-lsp-server[version='>=1.12.2,<1.13.0'] +conda-forge::notebook[version='>=7.4.4,<7.5.0'] +conda-forge::altair[version='>=5.5.0,<5.6.0'] +conda-forge::sagemaker-studio-analytics-extension[version='>=0.2.0,<0.3.0'] +conda-forge::jupyter-dash[version='>=0.4.2,<0.5.0'] +conda-forge::sagemaker-jupyterlab-extension[version='>=0.5.0,<0.6.0'] +conda-forge::sagemaker-jupyterlab-emr-extension[version='>=0.4.0,<0.5.0'] +conda-forge::amazon-sagemaker-jupyter-scheduler[version='>=3.1.15,<3.2.0'] +conda-forge::jupyter-server-proxy[version='>=4.4.0,<4.5.0'] +conda-forge::pyhive[version='>=0.7.0,<0.8.0'] +conda-forge::python-gssapi[version='>=1.9.0,<1.10.0'] +conda-forge::tf-keras[version='>=2.18.0,<2.19.0'] +conda-forge::git-remote-codecommit[version='>=1.16,<1.17.0'] +conda-forge::docker-cli[version='>=27.5.1,<27.6.0'] +conda-forge::aioboto3[version='>=14.1.0,<14.2.0'] +conda-forge::sagemaker-studio-cli[version='>=1.0.6,<1.1.0'] +conda-forge::sagemaker-studio[version='>=1.0.16,<1.1.0'] +conda-forge::sagemaker-studio-dataengineering-sessions[version='>=1.1.2,<1.2.0'] +conda-forge::sagemaker-studio-dataengineering-extensions[version='>=1.1.2,<1.2.0'] +conda-forge::amzn-sagemaker-aiops-jupyterlab-extension[version='>=1.0.4,<1.1.0'] +conda-forge::aws-s3-access-grants-boto3-plugin[version='>=1.2.0,<1.3.0'] diff --git a/build_artifacts/v3/v3.3/v3.3.3/gpu.pinned_env.in b/build_artifacts/v3/v3.3/v3.3.3/gpu.pinned_env.in new file mode 100644 index 000000000..f066ccf6a --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/gpu.pinned_env.in @@ -0,0 +1,6 @@ +conda-forge::dash[version='<=2.18.1'] +conda-forge::evaluate[version='<0.4.2'] +conda-forge::libsqlite[version='<3.49.0'] +conda-forge::urllib3[version='<2'] +conda-forge::papermill[version='>=2.6.0'] +conda-forge::plotly[version='<6.1.0'] diff --git a/build_artifacts/v3/v3.3/v3.3.3/patch_glue_pyspark.json b/build_artifacts/v3/v3.3/v3.3.3/patch_glue_pyspark.json new file mode 100644 index 000000000..f92eee896 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/patch_glue_pyspark.json @@ -0,0 +1,15 @@ +{ + "argv": [ + "/opt/conda/bin/python", + "-m", + "sagemaker_kernel_wrapper.sm_gis_wrapper", + "-m", + "aws_glue_interactive_sessions_kernel.glue_pyspark.GlueKernel", + "-f", + "{connection_file}" + ], + "display_name": "Glue PySpark", + "env": {"request_origin": "SageMakerStudioPySparkNotebook", "glue_version": "3.0"}, + "language": "python" +} + diff --git a/build_artifacts/v3/v3.3/v3.3.3/patch_glue_spark.json b/build_artifacts/v3/v3.3/v3.3.3/patch_glue_spark.json new file mode 100644 index 000000000..1bd168e75 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/patch_glue_spark.json @@ -0,0 +1,15 @@ +{ + "argv": [ + "/opt/conda/bin/python", + "-m", + "sagemaker_kernel_wrapper.sm_gis_wrapper", + "-m", + "aws_glue_interactive_sessions_kernel.glue_spark.GlueKernel", + "-f", + "{connection_file}" + ], + "display_name": "Glue Spark", + "env": {"request_origin": "SageMakerStudioSparkNotebook", "glue_version": "3.0"}, + "language": "python" +} + diff --git a/build_artifacts/v3/v3.3/v3.3.3/source-version.txt b/build_artifacts/v3/v3.3/v3.3.3/source-version.txt new file mode 100644 index 000000000..5436ea06e --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/source-version.txt @@ -0,0 +1 @@ +3.3.2 \ No newline at end of file From f9ba8d69afdcd5a93dadc6ae7c3968aa063363cc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 29 Aug 2025 00:05:07 +0000 Subject: [PATCH 2/2] chore: Generate build artifacts for 3.3.3 release --- .../v3/v3.3/v3.3.3/aws-cli-public-key.asc | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 build_artifacts/v3/v3.3/v3.3.3/aws-cli-public-key.asc diff --git a/build_artifacts/v3/v3.3/v3.3.3/aws-cli-public-key.asc b/build_artifacts/v3/v3.3/v3.3.3/aws-cli-public-key.asc new file mode 100644 index 000000000..b415d17d9 --- /dev/null +++ b/build_artifacts/v3/v3.3/v3.3.3/aws-cli-public-key.asc @@ -0,0 +1,29 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBF2Cr7UBEADJZHcgusOJl7ENSyumXh85z0TRV0xJorM2B/JL0kHOyigQluUG +ZMLhENaG0bYatdrKP+3H91lvK050pXwnO/R7fB/FSTouki4ciIx5OuLlnJZIxSzx +PqGl0mkxImLNbGWoi6Lto0LYxqHN2iQtzlwTVmq9733zd3XfcXrZ3+LblHAgEt5G +TfNxEKJ8soPLyWmwDH6HWCnjZ/aIQRBTIQ05uVeEoYxSh6wOai7ss/KveoSNBbYz +gbdzoqI2Y8cgH2nbfgp3DSasaLZEdCSsIsK1u05CinE7k2qZ7KgKAUIcT/cR/grk +C6VwsnDU0OUCideXcQ8WeHutqvgZH1JgKDbznoIzeQHJD238GEu+eKhRHcz8/jeG +94zkcgJOz3KbZGYMiTh277Fvj9zzvZsbMBCedV1BTg3TqgvdX4bdkhf5cH+7NtWO +lrFj6UwAsGukBTAOxC0l/dnSmZhJ7Z1KmEWilro/gOrjtOxqRQutlIqG22TaqoPG +fYVN+en3Zwbt97kcgZDwqbuykNt64oZWc4XKCa3mprEGC3IbJTBFqglXmZ7l9ywG +EEUJYOlb2XrSuPWml39beWdKM8kzr1OjnlOm6+lpTRCBfo0wa9F8YZRhHPAkwKkX +XDeOGpWRj4ohOx0d2GWkyV5xyN14p2tQOCdOODmz80yUTgRpPVQUtOEhXQARAQAB +tCFBV1MgQ0xJIFRlYW0gPGF3cy1jbGlAYW1hem9uLmNvbT6JAlQEEwEIAD4CGwMF +CwkIBwIGFQoJCAsCBBYCAwECHgECF4AWIQT7Xbd/1cEYuAURraimMQrMRnJHXAUC +ZqFYbwUJCv/cOgAKCRCmMQrMRnJHXKYuEAC+wtZ611qQtOl0t5spM9SWZuszbcyA +0xBAJq2pncnp6wdCOkuAPu4/R3UCIoD2C49MkLj9Y0Yvue8CCF6OIJ8L+fKBv2DI +yWZGmHL0p9wa/X8NCKQrKxK1gq5PuCzi3f3SqwfbZuZGeK/ubnmtttWXpUtuU/Iz +VR0u/0sAy3j4uTGKh2cX7XnZbSqgJhUk9H324mIJiSwzvw1Ker6xtH/LwdBeJCck +bVBdh3LZis4zuD4IZeBO1vRvjot3Oq4xadUv5RSPATg7T1kivrtLCnwvqc6L4LnF +0OkNysk94L3LQSHyQW2kQS1cVwr+yGUSiSp+VvMbAobAapmMJWP6e/dKyAUGIX6+ +2waLdbBs2U7MXznx/2ayCLPH7qCY9cenbdj5JhG9ibVvFWqqhSo22B/URQE/CMrG ++3xXwtHEBoMyWEATr1tWwn2yyQGbkUGANneSDFiTFeoQvKNyyCFTFO1F2XKCcuDs +19nj34PE2TJilTG2QRlMr4D0NgwLLAMg2Los1CK6nXWnImYHKuaKS9LVaCoC8vu7 +IRBik1NX6SjrQnftk0M9dY+s0ZbAN1gbdjZ8H3qlbl/4TxMdr87m8LP4FZIIo261 +Eycv34pVkCePZiP+dgamEiQJ7IL4ZArio9mv6HbDGV6mLY45+l6/0EzCwkI5IyIf +BfWC9s/USgxchg== +=ptgS +-----END PGP PUBLIC KEY BLOCK----- \ No newline at end of file