Skip to content

Add profile_trace testing #3608

Add profile_trace testing

Add profile_trace testing #3608

Workflow file for this run

# Copyright 2010 New Relic, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: Tests
on:
push:
branches:
- main
tags-ignore:
- "**"
pull_request:
schedule:
- cron: "0 15 * * *"
concurrency:
group: ${{ github.ref || github.run_id }}-${{ github.workflow }}
cancel-in-progress: true
jobs:
# Aggregate job that provides a single check for all tests passing
tests:
runs-on: ubuntu-20.04
needs:
- python
- elasticsearchserver07
- elasticsearchserver08
- gearman
- grpc
#- kafka
- memcached
- mongodb
- mssql
- mysql
- postgres
- rabbitmq
- redis
- solr
steps:
- name: Success
run: echo "Success!"
# Combine and upload coverage data
coverage:
if: success() || failure() # Does not run on cancelled workflows
runs-on: ubuntu-20.04
needs:
- tests
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: "3.10"
architecture: x64
- name: Download Coverage Artifacts
uses: actions/download-artifact@v3
with:
path: ./
- name: Combine Coverage
run: |
pip install coverage
find . -name ".coverage.*" -exec mv {} ./ \;
coverage combine
coverage xml
- name: Upload Coverage to Codecov
uses: codecov/codecov-action@v3
with:
files: coverage.xml
fail_ci_if_error: true
# Tests
python:
env:
TOTAL_GROUPS: 20
strategy:
fail-fast: false
matrix:
group-number:
[
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
]
runs-on: ubuntu-20.04
container:
image: ghcr.io/newrelic/newrelic-python-agent-ci:sha-b0ffe8bdbb28ba0579377076ad680054da8fbc28
options: >-
--add-host=host.docker.internal:host-gateway
timeout-minutes: 30
steps:
- uses: actions/checkout@v3
- name: Fetch git tags
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
git fetch --tags origin
- name: Get Environments
id: get-envs
run: |
echo "envs=$(tox -l | grep '^${{ github.job }}\-' | ./.github/workflows/get-envs.py)" >> $GITHUB_OUTPUT
env:
GROUP_NUMBER: ${{ matrix.group-number }}
- name: Test
run: |
tox -vv -e ${{ steps.get-envs.outputs.envs }} -p auto
env:
TOX_PARALLEL_NO_SPINNER: 1
PY_COLORS: 0
- name: Upload Coverage Artifacts
uses: actions/upload-artifact@v3
with:
name: coverage-${{ github.job }}-${{ strategy.job-index }}
path: ./**/.coverage.*
retention-days: 1
grpc:
env:
TOTAL_GROUPS: 1
strategy:
fail-fast: false
matrix:
group-number: [1]
runs-on: ubuntu-20.04
container:
image: ghcr.io/newrelic/newrelic-python-agent-ci:sha-b0ffe8bdbb28ba0579377076ad680054da8fbc28
options: >-
--add-host=host.docker.internal:host-gateway
timeout-minutes: 30
steps:
- uses: actions/checkout@v3
- name: Fetch git tags
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
git fetch --tags origin
- name: Get Environments
id: get-envs
run: |
echo "envs=$(tox -l | grep '^${{ github.job }}\-' | ./.github/workflows/get-envs.py)" >> $GITHUB_OUTPUT
env:
GROUP_NUMBER: ${{ matrix.group-number }}
- name: Test
run: |
tox -vv -e ${{ steps.get-envs.outputs.envs }}
env:
TOX_PARALLEL_NO_SPINNER: 1
PY_COLORS: 0
- name: Upload Coverage Artifacts
uses: actions/upload-artifact@v3
with:
name: coverage-${{ github.job }}-${{ strategy.job-index }}
path: ./**/.coverage.*
retention-days: 1
postgres:
env:
TOTAL_GROUPS: 2
strategy:
fail-fast: false
matrix:
group-number: [1, 2]
runs-on: ubuntu-20.04
container:
image: ghcr.io/newrelic/newrelic-python-agent-ci:sha-b0ffe8bdbb28ba0579377076ad680054da8fbc28
options: >-
--add-host=host.docker.internal:host-gateway
timeout-minutes: 30
services:
postgres:
image: postgres:9
env:
POSTGRES_PASSWORD: postgres
ports:
- 8080:5432
- 8081:5432
# Set health checks to wait until postgres has started
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v3
- name: Fetch git tags
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
git fetch --tags origin
- name: Get Environments
id: get-envs
run: |
echo "envs=$(tox -l | grep '^${{ github.job }}\-' | ./.github/workflows/get-envs.py)" >> $GITHUB_OUTPUT
env:
GROUP_NUMBER: ${{ matrix.group-number }}
- name: Test
run: |
tox -vv -e ${{ steps.get-envs.outputs.envs }} -p auto
env:
TOX_PARALLEL_NO_SPINNER: 1
PY_COLORS: 0
- name: Upload Coverage Artifacts
uses: actions/upload-artifact@v3
with:
name: coverage-${{ github.job }}-${{ strategy.job-index }}
path: ./**/.coverage.*
retention-days: 1
mssql:
env:
TOTAL_GROUPS: 1
strategy:
fail-fast: false
matrix:
group-number: [1]
runs-on: ubuntu-20.04
container:
image: ghcr.io/newrelic/newrelic-python-agent-ci:sha-b0ffe8bdbb28ba0579377076ad680054da8fbc28
options: >-
--add-host=host.docker.internal:host-gateway
timeout-minutes: 30
services:
mssql:
image: mcr.microsoft.com/azure-sql-edge:latest
env:
MSSQL_USER: python_agent
MSSQL_PASSWORD: python_agent
MSSQL_SA_PASSWORD: "python_agent#1234"
ACCEPT_EULA: "Y"
ports:
- 8080:1433
- 8081:1433
# Set health checks to wait until mysql has started
options: >-
--health-cmd "/opt/mssql-tools/bin/sqlcmd -U SA -P $MSSQL_SA_PASSWORD -Q 'SELECT 1'"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v3
- name: Fetch git tags
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
git fetch --tags origin
- name: Get Environments
id: get-envs
run: |
echo "envs=$(tox -l | grep '^${{ github.job }}\-' | ./.github/workflows/get-envs.py)" >> $GITHUB_OUTPUT
env:
GROUP_NUMBER: ${{ matrix.group-number }}
- name: Test
run: |
tox -vv -e ${{ steps.get-envs.outputs.envs }} -p auto
env:
TOX_PARALLEL_NO_SPINNER: 1
PY_COLORS: 0
- name: Upload Coverage Artifacts
uses: actions/upload-artifact@v3
with:
name: coverage-${{ github.job }}-${{ strategy.job-index }}
path: ./**/.coverage.*
retention-days: 1
mysql:
env:
TOTAL_GROUPS: 2
strategy:
fail-fast: false
matrix:
group-number: [1, 2]
runs-on: ubuntu-20.04
container:
image: ghcr.io/newrelic/newrelic-python-agent-ci:sha-b0ffe8bdbb28ba0579377076ad680054da8fbc28
options: >-
--add-host=host.docker.internal:host-gateway
timeout-minutes: 30
services:
mysql:
image: mysql:5.6
env:
MYSQL_RANDOM_ROOT_PASSWORD: "true"
MYSQL_DATABASE: python_agent
MYSQL_USER: python_agent
MYSQL_PASSWORD: python_agent
ports:
- 8080:3306
- 8081:3306
# Set health checks to wait until mysql has started
options: >-
--health-cmd "mysqladmin ping -h localhost"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v3
- name: Fetch git tags
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
git fetch --tags origin
- name: Get Environments
id: get-envs
run: |
echo "envs=$(tox -l | grep '^${{ github.job }}\-' | ./.github/workflows/get-envs.py)" >> $GITHUB_OUTPUT
env:
GROUP_NUMBER: ${{ matrix.group-number }}
- name: Test
run: |
tox -vv -e ${{ steps.get-envs.outputs.envs }} -p auto
env:
TOX_PARALLEL_NO_SPINNER: 1
PY_COLORS: 0
- name: Upload Coverage Artifacts
uses: actions/upload-artifact@v3
with:
name: coverage-${{ github.job }}-${{ strategy.job-index }}
path: ./**/.coverage.*
retention-days: 1
redis:
env:
TOTAL_GROUPS: 2
strategy:
fail-fast: false
matrix:
group-number: [1, 2]
runs-on: ubuntu-20.04
container:
image: ghcr.io/newrelic/newrelic-python-agent-ci:sha-b0ffe8bdbb28ba0579377076ad680054da8fbc28
options: >-
--add-host=host.docker.internal:host-gateway
timeout-minutes: 30
services:
redis:
image: redis
ports:
- 8080:6379
- 8081:6379
# Set health checks to wait until redis has started
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v3
- name: Fetch git tags
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
git fetch --tags origin
- name: Get Environments
id: get-envs
run: |
echo "envs=$(tox -l | grep '^${{ github.job }}\-' | ./.github/workflows/get-envs.py)" >> $GITHUB_OUTPUT
env:
GROUP_NUMBER: ${{ matrix.group-number }}
- name: Test
run: |
tox -vv -e ${{ steps.get-envs.outputs.envs }} -p auto
env:
TOX_PARALLEL_NO_SPINNER: 1
PY_COLORS: 0
- name: Upload Coverage Artifacts
uses: actions/upload-artifact@v3
with:
name: coverage-${{ github.job }}-${{ strategy.job-index }}
path: ./**/.coverage.*
retention-days: 1
solr:
env:
TOTAL_GROUPS: 1
strategy:
fail-fast: false
matrix:
group-number: [1]
runs-on: ubuntu-20.04
container:
image: ghcr.io/newrelic/newrelic-python-agent-ci:sha-b0ffe8bdbb28ba0579377076ad680054da8fbc28
options: >-
--add-host=host.docker.internal:host-gateway
timeout-minutes: 30
services:
solr:
image: bitnami/solr:8.8.2
env:
SOLR_CORE: collection
ports:
- 8080:8983
- 8081:8983
# Set health checks to wait until solr has started
options: >-
--health-cmd "curl localhost:8983/solr/collection/admin/ping | grep OK"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v3
- name: Fetch git tags
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
git fetch --tags origin
- name: Get Environments
id: get-envs
run: |
echo "envs=$(tox -l | grep '^${{ github.job }}\-' | ./.github/workflows/get-envs.py)" >> $GITHUB_OUTPUT
env:
GROUP_NUMBER: ${{ matrix.group-number }}
- name: Test
run: |
tox -vv -e ${{ steps.get-envs.outputs.envs }} -p auto
env:
TOX_PARALLEL_NO_SPINNER: 1
PY_COLORS: 0
- name: Upload Coverage Artifacts
uses: actions/upload-artifact@v3
with:
name: coverage-${{ github.job }}-${{ strategy.job-index }}
path: ./**/.coverage.*
retention-days: 1
memcached:
env:
TOTAL_GROUPS: 2
strategy:
fail-fast: false
matrix:
group-number: [1, 2]
runs-on: ubuntu-20.04
container:
image: ghcr.io/newrelic/newrelic-python-agent-ci:sha-b0ffe8bdbb28ba0579377076ad680054da8fbc28
options: >-
--add-host=host.docker.internal:host-gateway
timeout-minutes: 30
services:
memcached:
image: memcached
ports:
- 8080:11211
- 8081:11211
# Set health checks to wait until memcached has started
options: >-
--health-cmd "timeout 5 bash -c 'cat < /dev/null > /dev/udp/127.0.0.1/11211'"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v3
- name: Fetch git tags
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
git fetch --tags origin
- name: Get Environments
id: get-envs
run: |
echo "envs=$(tox -l | grep '^${{ github.job }}\-' | ./.github/workflows/get-envs.py)" >> $GITHUB_OUTPUT
env:
GROUP_NUMBER: ${{ matrix.group-number }}
- name: Test
run: |
tox -vv -e ${{ steps.get-envs.outputs.envs }} -p auto
env:
TOX_PARALLEL_NO_SPINNER: 1
PY_COLORS: 0
- name: Upload Coverage Artifacts
uses: actions/upload-artifact@v3
with:
name: coverage-${{ github.job }}-${{ strategy.job-index }}
path: ./**/.coverage.*
retention-days: 1
rabbitmq:
env:
TOTAL_GROUPS: 1
strategy:
fail-fast: false
matrix:
group-number: [1]
runs-on: ubuntu-20.04
container:
image: ghcr.io/newrelic/newrelic-python-agent-ci:sha-b0ffe8bdbb28ba0579377076ad680054da8fbc28
options: >-
--add-host=host.docker.internal:host-gateway
timeout-minutes: 30
services:
rabbitmq:
image: rabbitmq
env:
RABBITMQ_PASSWORD: rabbitmq
ports:
- 5672:5672
# Set health checks to wait until rabbitmq has started
options: >-
--health-cmd "rabbitmq-diagnostics status"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v3
- name: Fetch git tags
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
git fetch --tags origin
- name: Get Environments
id: get-envs
run: |
echo "envs=$(tox -l | grep '^${{ github.job }}\-' | ./.github/workflows/get-envs.py)" >> $GITHUB_OUTPUT
env:
GROUP_NUMBER: ${{ matrix.group-number }}
- name: Test
run: |
tox -vv -e ${{ steps.get-envs.outputs.envs }} -p auto
env:
TOX_PARALLEL_NO_SPINNER: 1
PY_COLORS: 0
- name: Upload Coverage Artifacts
uses: actions/upload-artifact@v3
with:
name: coverage-${{ github.job }}-${{ strategy.job-index }}
path: ./**/.coverage.*
retention-days: 1
# kafka:
# env:
# TOTAL_GROUPS: 4
# strategy:
# fail-fast: false
# matrix:
# group-number: [1, 2, 3, 4]
# runs-on: ubuntu-20.04
# container:
# image: ghcr.io/newrelic/newrelic-python-agent-ci:sha-b0ffe8bdbb28ba0579377076ad680054da8fbc28
# options: >-
# --add-host=host.docker.internal:host-gateway
# timeout-minutes: 30
# services:
# zookeeper:
# image: bitnami/zookeeper:3.7
# env:
# ALLOW_ANONYMOUS_LOGIN: yes
# ports:
# - 2181:2181
# kafka:
# image: bitnami/kafka:3.2
# ports:
# - 8080:8080
# - 8081:8081
# env:
# ALLOW_PLAINTEXT_LISTENER: yes
# KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
# KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE: true
# KAFKA_CFG_LISTENERS: L1://:8080,L2://:8081
# KAFKA_CFG_ADVERTISED_LISTENERS: L1://127.0.0.1:8080,L2://kafka:8081,
# KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: L1:PLAINTEXT,L2:PLAINTEXT
# KAFKA_CFG_INTER_BROKER_LISTENER_NAME: L2
# steps:
# - uses: actions/checkout@v3
# - name: Fetch git tags
# run: |
# git config --global --add safe.directory "$GITHUB_WORKSPACE"
# git fetch --tags origin
# # Special case packages
# - name: Install librdkafka-dev
# run: |
# # Use lsb-release to find the codename of Ubuntu to use to install the correct library name
# sudo apt-get update
# sudo ln -fs /usr/share/zoneinfo/America/Los_Angeles /etc/localtime
# sudo apt-get install -y wget gnupg2 software-properties-common
# sudo wget -qO - https://packages.confluent.io/deb/7.2/archive.key | sudo apt-key add -
# sudo add-apt-repository "deb https://packages.confluent.io/clients/deb $(lsb_release -cs) main"
# sudo apt-get update
# sudo apt-get install -y librdkafka-dev/$(lsb_release -c | cut -f 2)
# - name: Get Environments
# id: get-envs
# run: |
# echo "envs=$(tox -l | grep '^${{ github.job }}\-' | ./.github/workflows/get-envs.py)" >> $GITHUB_OUTPUT
# env:
# GROUP_NUMBER: ${{ matrix.group-number }}
# - name: Test
# run: |
# tox -vv -e ${{ steps.get-envs.outputs.envs }}
# env:
# TOX_PARALLEL_NO_SPINNER: 1
# PY_COLORS: 0
# - name: Upload Coverage Artifacts
# uses: actions/upload-artifact@v3
# with:
# name: coverage-${{ github.job }}-${{ strategy.job-index }}
# path: ./**/.coverage.*
# retention-days: 1
mongodb:
env:
TOTAL_GROUPS: 1
strategy:
fail-fast: false
matrix:
group-number: [1]
runs-on: ubuntu-20.04
container:
image: ghcr.io/newrelic/newrelic-python-agent-ci:sha-b0ffe8bdbb28ba0579377076ad680054da8fbc28
options: >-
--add-host=host.docker.internal:host-gateway
timeout-minutes: 30
services:
mongodb:
image: mongo:3.6.4
ports:
- 8080:27017
- 8081:27017
# Set health checks to wait until mongodb has started
options: >-
--health-cmd "echo 'db.runCommand(\"ping\").ok' | mongo localhost:27017/test --quiet || exit 1"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v3
- name: Fetch git tags
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
git fetch --tags origin
- name: Get Environments
id: get-envs
run: |
echo "envs=$(tox -l | grep '^${{ github.job }}\-' | ./.github/workflows/get-envs.py)" >> $GITHUB_OUTPUT
env:
GROUP_NUMBER: ${{ matrix.group-number }}
- name: Test
run: |
tox -vv -e ${{ steps.get-envs.outputs.envs }} -p auto
env:
TOX_PARALLEL_NO_SPINNER: 1
PY_COLORS: 0
- name: Upload Coverage Artifacts
uses: actions/upload-artifact@v3
with:
name: coverage-${{ github.job }}-${{ strategy.job-index }}
path: ./**/.coverage.*
retention-days: 1
elasticsearchserver07:
env:
TOTAL_GROUPS: 1
strategy:
fail-fast: false
matrix:
group-number: [1]
runs-on: ubuntu-20.04
container:
image: ghcr.io/newrelic/newrelic-python-agent-ci:sha-b0ffe8bdbb28ba0579377076ad680054da8fbc28
options: >-
--add-host=host.docker.internal:host-gateway
timeout-minutes: 30
services:
elasticsearch:
image: elasticsearch:7.17.8
env:
"discovery.type": "single-node"
ports:
- 8080:9200
- 8081:9200
# Set health checks to wait until elasticsearch has started
options: >-
--health-cmd "curl --silent --fail localhost:9200/_cluster/health || exit 1"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v3
- name: Fetch git tags
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
git fetch --tags origin
- name: Get Environments
id: get-envs
run: |
echo "envs=$(tox -l | grep '^${{ github.job }}\-' | ./.github/workflows/get-envs.py)" >> $GITHUB_OUTPUT
env:
GROUP_NUMBER: ${{ matrix.group-number }}
- name: Test
run: |
tox -vv -e ${{ steps.get-envs.outputs.envs }} -p auto
env:
TOX_PARALLEL_NO_SPINNER: 1
PY_COLORS: 0
- name: Upload Coverage Artifacts
uses: actions/upload-artifact@v3
with:
name: coverage-${{ github.job }}-${{ strategy.job-index }}
path: ./**/.coverage.*
retention-days: 1
elasticsearchserver08:
env:
TOTAL_GROUPS: 1
strategy:
fail-fast: false
matrix:
group-number: [1]
runs-on: ubuntu-20.04
container:
image: ghcr.io/newrelic/newrelic-python-agent-ci:sha-b0ffe8bdbb28ba0579377076ad680054da8fbc28
options: >-
--add-host=host.docker.internal:host-gateway
timeout-minutes: 30
services:
elasticsearch:
image: elasticsearch:8.6.0
env:
"xpack.security.enabled": "false"
"discovery.type": "single-node"
ports:
- 8080:9200
- 8081:9200
# Set health checks to wait until elasticsearch has started
options: >-
--health-cmd "curl --silent --fail localhost:9200/_cluster/health || exit 1"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v3
- name: Fetch git tags
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
git fetch --tags origin
- name: Get Environments
id: get-envs
run: |
echo "envs=$(tox -l | grep '^${{ github.job }}\-' | ./.github/workflows/get-envs.py)" >> $GITHUB_OUTPUT
env:
GROUP_NUMBER: ${{ matrix.group-number }}
- name: Test
run: |
tox -vv -e ${{ steps.get-envs.outputs.envs }} -p auto
env:
TOX_PARALLEL_NO_SPINNER: 1
PY_COLORS: 0
- name: Upload Coverage Artifacts
uses: actions/upload-artifact@v3
with:
name: coverage-${{ github.job }}-${{ strategy.job-index }}
path: ./**/.coverage.*
retention-days: 1
gearman:
env:
TOTAL_GROUPS: 1
strategy:
fail-fast: false
matrix:
group-number: [1]
runs-on: ubuntu-20.04
container:
image: ghcr.io/newrelic/newrelic-python-agent-ci:sha-b0ffe8bdbb28ba0579377076ad680054da8fbc28
options: >-
--add-host=host.docker.internal:host-gateway
timeout-minutes: 30
services:
gearman:
image: artefactual/gearmand
ports:
- 8080:4730
# Set health checks to wait until gearman has started
options: >-
--health-cmd "(echo status ; sleep 0.1) | nc 127.0.0.1 4730 -w 1"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v3
- name: Fetch git tags
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
git fetch --tags origin
- name: Get Environments
id: get-envs
run: |
echo "envs=$(tox -l | grep '^${{ github.job }}\-' | ./.github/workflows/get-envs.py)" >> $GITHUB_OUTPUT
env:
GROUP_NUMBER: ${{ matrix.group-number }}
- name: Test
run: |
tox -vv -e ${{ steps.get-envs.outputs.envs }} -p auto
env:
TOX_PARALLEL_NO_SPINNER: 1
PY_COLORS: 0
- name: Upload Coverage Artifacts
uses: actions/upload-artifact@v3
with:
name: coverage-${{ github.job }}-${{ strategy.job-index }}
path: ./**/.coverage.*
retention-days: 1