aboutsummaryrefslogtreecommitdiffstats
path: root/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2018-01-12 12:51:53 +0100
committerLiang Qi <liang.qi@qt.io>2018-01-12 21:13:56 +0100
commitc2d188f225a96ccf409f4dbebd19f6e59caf7da6 (patch)
tree35d0320171ad60a4e25c41f0718d02016dfd4242 /coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64
parentab25cb7af6602a558c84e3d30e8ce1c6e7ca6e73 (diff)
parent19872ea84352182ee974ff84d2e3872a21427117 (diff)
Merge remote-tracking branch 'origin/5.10' into dev
Conflicts: coin/platform_configs/default.txt coin/platform_configs/qt5.txt Task-number: QTBUG-65688 Change-Id: I17a303731dab4b967c9ef8a852ee0c1097b88f10
Diffstat (limited to 'coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64')
-rwxr-xr-xcoin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/01-systemsetup.sh (renamed from coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/001-systemsetup.sh)25
-rwxr-xr-xcoin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/02-apt.sh (renamed from coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/002-apt.sh)110
-rwxr-xr-xcoin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/03-qemu.sh (renamed from coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/003-qemu.sh)0
-rwxr-xr-xcoin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/030-fbx.sh4
-rwxr-xr-xcoin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/04-libclang.sh (renamed from coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/004-libclang.sh)2
-rwxr-xr-xcoin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/04-yocto.sh (renamed from coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/004-yocto.sh)6
-rwxr-xr-xcoin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/10-openssl_for_android_linux.sh38
-rwxr-xr-x[-rw-r--r--]coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/22-mqtt_broker.sh (renamed from coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/mqtt_broker.sh)4
-rwxr-xr-xcoin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/30-fbx.sh6
-rwxr-xr-xcoin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/40-android_linux.sh38
-rwxr-xr-xcoin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/40-cmake.sh5
-rwxr-xr-x[-rw-r--r--]coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/42-freeopcua.sh (renamed from coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/freeopcua.sh)3
-rwxr-xr-xcoin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/70-qnx700.sh2
13 files changed, 204 insertions, 39 deletions
diff --git a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/001-systemsetup.sh b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/01-systemsetup.sh
index 2498e441..60e637b7 100755
--- a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/001-systemsetup.sh
+++ b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/01-systemsetup.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#############################################################################
##
@@ -35,8 +35,12 @@
# This script modifies system settings for automated use
-# shellcheck source=../common/try_catch.sh
-source "${BASH_SOURCE%/*}/../common/try_catch.sh"
+set -ex
+
+source "${BASH_SOURCE%/*}/../common/unix/try_catch.sh"
+source "${BASH_SOURCE%/*}/../common/unix/check_and_set_proxy.sh"
+# shellcheck source=../common/unix/try_catch.sh
+source "${BASH_SOURCE%/*}/../common/unix/try_catch.sh"
NTS_IP=10.212.2.216
@@ -44,9 +48,12 @@ ExceptionGsettings1=100
ExceptionGsettings2=101
ExceptionGsettings3=102
ExceptionNTS=103
+ExceptionProxy=104
try
(
+ echo "Set timezone to UTC" || throw $ExceptionTimezone
+ sudo timedatectl set-timezone Etc/UTC
echo "Timeout for blanking the screen (0 = never)"
gsettings set org.gnome.desktop.session idle-delay 0 || throw $ExceptionGsettings1
echo "Prevents screen lock when screesaver goes active."
@@ -56,9 +63,17 @@ try
echo "Set Network Test Server address to $NTS_IP in /etc/hosts"
echo "$NTS_IP qt-test-server qt-test-server.qt-test-net" | sudo tee -a /etc/hosts || throw $ExceptionNTS
+
+ if [ "$proxy" != "" ]; then
+ echo "Acquire::http::Proxy \"$proxy\";" | sudo tee -a /etc/apt/apt.conf || throw $ExceptionProxy
+ fi
)
catch || {
case $ex_code in
+ $ExceptionTimezone)
+ echo "Failed to set timezone to UTC"
+ exit 1;
+ ;;
$ExceptionGsettings1)
echo "Failed to disable black screen."
exit 1;
@@ -75,6 +90,10 @@ catch || {
echo "Failed to set network teset server address into /etc/hosts."
exit 1;
;;
+ $ExceptionProxy)
+ echo "Failed to set proxy /etc/apt/apt.conf."
+ exit 1;
+ ;;
esac
}
diff --git a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/002-apt.sh b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/02-apt.sh
index 9b71f935..ef2b14d0 100755
--- a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/002-apt.sh
+++ b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/02-apt.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#############################################################################
##
@@ -35,7 +35,9 @@
# Install required packages with APT
-source "${BASH_SOURCE%/*}/../common/try_catch.sh"
+set -ex
+
+source "${BASH_SOURCE%/*}/../common/unix/try_catch.sh"
ExceptionAPTUpdate=100
ExceptionAPT=101
@@ -45,47 +47,107 @@ try
(
echo "Disabling auto update"
sudo sed -i 's/APT::Periodic::Update-Package-Lists "1";/APT::Periodic::Update-Package-Lists "0";/' /etc/apt/apt.conf.d/10periodic || throw $ExceptionSED
- echo "Running update for apt"
- sudo apt-get update
- echo "Installing packages"
+ for service in apt-daily.timer apt-daily-upgrade.timer apt-daily.service apt-daily-upgrade.service; do
+ sudo systemctl stop $service
+ sudo systemctl disable $service
+ done
# Git is not needed by builds themselves, but is nice to have
# immediately as one starts debugging
- yes | sudo aptdcon --hide-terminal --install git || throw $ExceptionAPT
+ installPackages+=(git)
# 7zip is a needed decompressing tool
- yes | sudo aptdcon --hide-terminal --install p7zip || throw $ExceptionAPT
+ installPackages+=(p7zip)
# libssl-dev provides headers for OpenSSL
- yes | sudo aptdcon --hide-terminal --install libssl-dev || throw $ExceptionAPT
+ installPackages+=(libssl-dev)
# Needed libraries for X11 support accordingly to https://wiki.qt.io/Building_Qt_5_from_Git
- yes | sudo aptdcon --hide-terminal --install "^libxcb.*" libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev || throw $ExceptionAPT
+ installPackages+=("^libxcb.*")
+ installPackages+=(libxkbcommon-dev)
+ installPackages+=(libxkbcommon-x11-dev)
+ installPackages+=(libx11-xcb-dev)
+ installPackages+=(libglu1-mesa-dev)
+ installPackages+=(libxrender-dev)
+ installPackages+=(libxi-dev)
# Enable linking to system dbus
- yes | sudo aptdcon --hide-terminal --install libdbus-1-dev || throw $ExceptionAPT
+ installPackages+=(libdbus-1-dev)
# Needed libraries for WebEngine
- yes | sudo aptdcon --hide-terminal --install libudev-dev libegl1-mesa-dev libfontconfig1-dev libxss-dev || throw $ExceptionAPT
+ installPackages+=(libudev-dev)
+ installPackages+=(libegl1-mesa-dev)
+ installPackages+=(libfontconfig1-dev)
+ installPackages+=(libxss-dev)
# Common event loop handling
- yes | sudo aptdcon --hide-terminal --install libglib2.0-dev || throw $ExceptionAPT
+ installPackages+=(libglib2.0-dev)
# MySQL support
- yes | sudo aptdcon --hide-terminal --install libmysqlclient-dev || throw $ExceptionAPT
+ installPackages+=(libmysqlclient-dev)
# PostgreSQL support
- yes | sudo aptdcon --hide-terminal --install libpq-dev || throw $ExceptionAPT
+ installPackages+=(libpq-dev)
# SQLite support
- yes | sudo aptdcon --hide-terminal --install libsqlite3-dev || throw $ExceptionAPT
+ installPackages+=(libsqlite3-dev)
# ODBC support
- yes | sudo aptdcon --hide-terminal --install unixodbc-dev || throw $ExceptionAPT
+ installPackages+=(unixodbc-dev)
# Support for FreeType font engine
- yes | sudo aptdcon --hide-terminal --install libfreetype6-dev || throw $ExceptionAPT
+ installPackages+=(libfreetype6-dev)
# Enable the usage of system jpeg libraries
- yes | sudo aptdcon --hide-terminal --install libjpeg-dev || throw $ExceptionAPT
+ installPackages+=(libjpeg-dev)
# Enable support for printer driver
- yes | sudo aptdcon --hide-terminal --install libcups2-dev || throw $ExceptionAPT
+ installPackages+=(libcups2-dev)
# Install libraries needed for QtMultimedia to be able to support all plugins
- yes | sudo aptdcon --hide-terminal --install libasound2-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev || throw $ExceptionAPT
- yes | sudo aptdcon --hide-terminal --install libgstreamer-plugins-good1.0-dev libgstreamer-plugins-bad1.0-dev || throw $ExceptionAPT
+ installPackages+=(libasound2-dev)
+ installPackages+=(libgstreamer1.0-dev)
+ installPackages+=(libgstreamer-plugins-base1.0-dev)
+ installPackages+=(libgstreamer-plugins-good1.0-dev)
+ installPackages+=(libgstreamer-plugins-bad1.0-dev)
# Support for cross-building to x86 (needed by WebEngine boot2qt builds)
- yes | sudo aptdcon --hide-terminal --install g++-multilib || throw $ExceptionAPT
+ installPackages+=(g++-multilib)
# python3 development package
- yes | sudo aptdcon --hide-terminal --install python3-dev python3-pip python3-virtualenv || throw $ExceptionAPT
+ installPackages+=(python3-dev)
+ installPackages+=(python3-pip)
+ installPackages+=(python3-virtualenv)
# Automates interactive applications (Needed by RTA to automate configure testing)
- yes | sudo aptdcon --hide-terminal --install expect || throw $ExceptionAPT
+ installPackages+=(expect)
+ installPackages+=(mesa-common-dev)
+ installPackages+=(libgl1-mesa-glx)
+ installPackages+=(libgl1-mesa-dev)
+ installPackages+=(libegl1-mesa-dev)
+ installPackages+=(curl)
+ installPackages+=(libicu-dev)
+ installPackages+=(zlib1g-dev)
+ installPackages+=(zlib1g)
+ installPackages+=(openjdk-8-jdk)
+ installPackages+=(libgtk-3-dev)
+ installPackages+=(ninja-build)
+ installPackages+=(libssl-dev)
+ installPackages+=(libxcursor-dev)
+ installPackages+=(libxcomposite-dev)
+ installPackages+=(libxdamage-dev)
+ installPackages+=(libxrandr-dev)
+ installPackages+=(libfontconfig1-dev)
+ installPackages+=(libxss-dev)
+ installPackages+=(libsrtp0-dev)
+ installPackages+=(libwebp-dev)
+ installPackages+=(libjsoncpp-dev)
+ installPackages+=(libopus-dev)
+ installPackages+=(libminizip-dev)
+ installPackages+=(libavutil-dev)
+ installPackages+=(libavformat-dev)
+ installPackages+=(libavcodec-dev)
+ installPackages+=(libevent-dev)
+ installPackages+=(bison)
+ installPackages+=(flex)
+ installPackages+=(gperf)
+ installPackages+=(libasound2-dev)
+ installPackages+=(libpulse-dev)
+ installPackages+=(libxtst-dev)
+ installPackages+=(libnspr4-dev)
+ installPackages+=(libnss3-dev)
+ installPackages+=(libopenal-dev)
+ installPackages+=(libbluetooth-dev)
+ #VirtualBox for RTA
+ installPackages+=(virtualbox)
+ installPackages+=(dkms)
+
+ echo "Running update for apt"
+ sudo apt-get update
+ echo "Installing packages"
+ sudo DEBIAN_FRONTEND=noninteractive apt-get -q -y install "${installPackages[@]}" || throw $ExceptionAPT
)
catch || {
case $ex_code in
diff --git a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/003-qemu.sh b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/03-qemu.sh
index 74ef2b4e..74ef2b4e 100755
--- a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/003-qemu.sh
+++ b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/03-qemu.sh
diff --git a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/030-fbx.sh b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/030-fbx.sh
deleted file mode 100755
index 7c5fadcb..00000000
--- a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/030-fbx.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-
-BASEDIR=$(dirname "$0")
-$BASEDIR/../common/fbx_linux.sh
diff --git a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/004-libclang.sh b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/04-libclang.sh
index abbda212..3d294fef 100755
--- a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/004-libclang.sh
+++ b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/04-libclang.sh
@@ -6,4 +6,4 @@ VERSION=$libclang_version
URL="https://download.qt.io/development_releases/prebuilt/libclang/libclang-release_${VERSION//\./}-linux-Rhel7.2-gcc5.3-x86_64.7z"
SHA1="bbdbbc0296f42310077539b7247d285386119ef4"
-$BASEDIR/../common/libclang.sh "$URL" "$SHA1" "$VERSION"
+$BASEDIR/../common/unix/libclang.sh "$URL" "$SHA1" "$VERSION"
diff --git a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/004-yocto.sh b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/04-yocto.sh
index ad4e25a9..fbd75f22 100755
--- a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/004-yocto.sh
+++ b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/04-yocto.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#############################################################################
##
@@ -35,9 +35,9 @@
# This script installs the Yocto toolchain
-set -e
+set -ex
-source "${BASH_SOURCE%/*}/../common/DownloadURL.sh"
+source "${BASH_SOURCE%/*}/../common/unix/DownloadURL.sh"
echo "Installing Yocto toolchain for 32-bit b2qt..."
diff --git a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/10-openssl_for_android_linux.sh b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/10-openssl_for_android_linux.sh
new file mode 100755
index 00000000..0f89e72c
--- /dev/null
+++ b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/10-openssl_for_android_linux.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the provisioning scripts of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:LGPL21$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see http://www.qt.io/terms-conditions. For further
+## information use the contact form at http://www.qt.io/contact-us.
+##
+## GNU Lesser General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU Lesser
+## General Public License version 2.1 or version 3 as published by the Free
+## Software Foundation and appearing in the file LICENSE.LGPLv21 and
+## LICENSE.LGPLv3 included in the packaging of this file. Please review the
+## following information to ensure the GNU Lesser General Public License
+## requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+## http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+##
+## As a special exception, The Qt Company gives you certain additional
+## rights. These rights are described in The Qt Company LGPL Exception
+## version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+set -ex
+
+source "${BASH_SOURCE%/*}/../common/linux/openssl_for_android_linux.sh"
diff --git a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/mqtt_broker.sh b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/22-mqtt_broker.sh
index e367c20b..04c09770 100644..100755
--- a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/mqtt_broker.sh
+++ b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/22-mqtt_broker.sh
@@ -1,4 +1,4 @@
-#!/bin/env bash
+#!/usr/bin/env bash
#############################################################################
##
@@ -33,4 +33,4 @@
##
#############################################################################
-source "${BASH_SOURCE%/*}/../common/mqtt_broker.sh"
+source "${BASH_SOURCE%/*}/../common/unix/mqtt_broker.sh"
diff --git a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/30-fbx.sh b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/30-fbx.sh
new file mode 100755
index 00000000..ca24a70e
--- /dev/null
+++ b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/30-fbx.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+set -ex
+
+BASEDIR=$(dirname "$0")
+$BASEDIR/../common/linux/fbx_linux.sh
diff --git a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/40-android_linux.sh b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/40-android_linux.sh
new file mode 100755
index 00000000..6784335a
--- /dev/null
+++ b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/40-android_linux.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the provisioning scripts of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:LGPL21$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see http://www.qt.io/terms-conditions. For further
+## information use the contact form at http://www.qt.io/contact-us.
+##
+## GNU Lesser General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU Lesser
+## General Public License version 2.1 or version 3 as published by the Free
+## Software Foundation and appearing in the file LICENSE.LGPLv21 and
+## LICENSE.LGPLv3 included in the packaging of this file. Please review the
+## following information to ensure the GNU Lesser General Public License
+## requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+## http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+##
+## As a special exception, The Qt Company gives you certain additional
+## rights. These rights are described in The Qt Company LGPL Exception
+## version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+set -ex
+
+source "${BASH_SOURCE%/*}/../common/linux/android_linux.sh"
diff --git a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/40-cmake.sh b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/40-cmake.sh
new file mode 100755
index 00000000..8f81a7dd
--- /dev/null
+++ b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/40-cmake.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+BASEDIR=$(dirname "$0")
+$BASEDIR/../common/linux/cmake_linux.sh
+
diff --git a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/freeopcua.sh b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/42-freeopcua.sh
index a757767f..6570e107 100644..100755
--- a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/freeopcua.sh
+++ b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/42-freeopcua.sh
@@ -1,4 +1,4 @@
-#!/bin/env bash
+#!/usr/bin/env bash
#############################################################################
##
@@ -44,6 +44,7 @@ cd freeopcua
git checkout 955cc5b924cf310fc15b376a11f4b7b9db28980b
mkdir build
cd build
+source ~/.profile
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr/local ..
make
sudo make install
diff --git a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/70-qnx700.sh b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/70-qnx700.sh
index 6f0f3797..7f24d224 100755
--- a/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/70-qnx700.sh
+++ b/coin/provisioning/qtci-linux-Ubuntu-16.04-x86_64/70-qnx700.sh
@@ -35,4 +35,4 @@
set -ex
-source "${BASH_SOURCE%/*}/../common/qnx_700.sh"
+source "${BASH_SOURCE%/*}/../common/linux/qnx_700.sh"