Changed to look like the clearer old-school style as used in original WeKnowHowYouFeel
|
@ -39,6 +39,7 @@
|
|||
android:name=".MainActivity"
|
||||
android:configChanges="screenSize|keyboardHidden|orientation"
|
||||
android:label="@string/app_name"
|
||||
android:screenOrientation="landscape"
|
||||
android:theme="@style/MainActivityTheme">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
|
BIN
app/src/main/ic_launcher-web.png
Normal file
After Width: | Height: | Size: 50 KiB |
|
@ -108,7 +108,7 @@ public class MainActivity extends AppCompatActivity
|
|||
private RelativeLayout metricViewLayout;
|
||||
private LinearLayout leftMetricsLayout;
|
||||
private LinearLayout rightMetricsLayout;
|
||||
private MetricDisplay[] metricDisplays;
|
||||
private TextView[] metricDisplays;
|
||||
private TextView[] metricNames;
|
||||
private TextView fpsName;
|
||||
private TextView fpsPct;
|
||||
|
@ -129,6 +129,7 @@ public class MainActivity extends AppCompatActivity
|
|||
private boolean isFrontFacingCameraDetected = true;
|
||||
private boolean isBackFacingCameraDetected = true;
|
||||
private boolean multiFaceModeEnabled = false;
|
||||
private TextView showFaceText;
|
||||
|
||||
private MediaPlayer mp;
|
||||
|
||||
|
@ -356,8 +357,8 @@ public class MainActivity extends AppCompatActivity
|
|||
leftMetricsLayout = (LinearLayout) findViewById(R.id.left_metrics);
|
||||
rightMetricsLayout = (LinearLayout) findViewById(R.id.right_metrics);
|
||||
mainLayout = (RelativeLayout) findViewById(R.id.main_layout);
|
||||
fpsPct = (TextView) findViewById(R.id.fps_value);
|
||||
fpsName = (TextView) findViewById(R.id.fps_name);
|
||||
// fpsPct = (TextView) findViewById(R.id.fps_value);
|
||||
// fpsName = (TextView) findViewById(R.id.fps_name);
|
||||
cameraView = (SurfaceView) findViewById(R.id.camera_preview);
|
||||
drawingView = (DrawingView) findViewById(R.id.drawing_view);
|
||||
progressBar = (ProgressBar) findViewById(R.id.progress_bar);
|
||||
|
@ -373,25 +374,26 @@ public class MainActivity extends AppCompatActivity
|
|||
metricNames[4] = (TextView) findViewById(R.id.metric_name_4);
|
||||
metricNames[5] = (TextView) findViewById(R.id.metric_name_5);
|
||||
metricNames[6] = (TextView) findViewById(R.id.metric_name_6);
|
||||
metricDisplays = new MetricDisplay[NUM_METRICS_DISPLAYED];
|
||||
metricDisplays[0] = (MetricDisplay) findViewById(R.id.metric_pct_0);
|
||||
metricDisplays[1] = (MetricDisplay) findViewById(R.id.metric_pct_1);
|
||||
metricDisplays[2] = (MetricDisplay) findViewById(R.id.metric_pct_2);
|
||||
metricDisplays[3] = (MetricDisplay) findViewById(R.id.metric_pct_3);
|
||||
metricDisplays[4] = (MetricDisplay) findViewById(R.id.metric_pct_4);
|
||||
metricDisplays[5] = (MetricDisplay) findViewById(R.id.metric_pct_5);
|
||||
metricDisplays[6] = (MetricDisplay) findViewById(R.id.metric_pct_6);
|
||||
metricDisplays = new TextView[NUM_METRICS_DISPLAYED];
|
||||
metricDisplays[0] = (TextView) findViewById(R.id.metric_pct_0);
|
||||
metricDisplays[1] = (TextView) findViewById(R.id.metric_pct_1);
|
||||
metricDisplays[2] = (TextView) findViewById(R.id.metric_pct_2);
|
||||
metricDisplays[3] = (TextView) findViewById(R.id.metric_pct_3);
|
||||
metricDisplays[4] = (TextView) findViewById(R.id.metric_pct_4);
|
||||
metricDisplays[5] = (TextView) findViewById(R.id.metric_pct_5);
|
||||
metricDisplays[6] = (TextView) findViewById(R.id.metric_pct_6);
|
||||
showFaceText = (TextView) findViewById(R.id.no_face_found);
|
||||
|
||||
//Load Application Font and set UI Elements to use it
|
||||
Typeface face = Typeface.createFromAsset(getAssets(), "fonts/Square.ttf");
|
||||
for (TextView textView : metricNames) {
|
||||
textView.setTypeface(face);
|
||||
}
|
||||
for (MetricDisplay metricDisplay : metricDisplays) {
|
||||
metricDisplay.setTypeface(face);
|
||||
}
|
||||
fpsPct.setTypeface(face);
|
||||
fpsName.setTypeface(face);
|
||||
// for (TextView textView : metricNames) {
|
||||
// textView.setTypeface(face);
|
||||
// }
|
||||
// for (TextView metricDisplay : metricDisplays) {
|
||||
// metricDisplay.setTypeface(face);
|
||||
// }
|
||||
// fpsPct.setTypeface(face);
|
||||
// fpsName.setTypeface(face);
|
||||
drawingView.setTypeface(face);
|
||||
pleaseWaitTextView.setTypeface(face);
|
||||
|
||||
|
@ -515,18 +517,18 @@ public class MainActivity extends AppCompatActivity
|
|||
|
||||
detector.setDetectAllEmotions(true);
|
||||
int i=0;
|
||||
for(MetricsManager.Emotions emotion: MetricsManager.Emotions.values()) {
|
||||
if(emotion.equals(MetricsManager.Emotions.ENGAGEMENT) || emotion.equals(MetricsManager.Emotions.VALENCE)) {
|
||||
continue;
|
||||
}
|
||||
activateMetric(i, emotion);
|
||||
i++;
|
||||
}
|
||||
// for(MetricsManager.Emotions emotion: MetricsManager.Emotions.values()) {
|
||||
// if(emotion.equals(MetricsManager.Emotions.ENGAGEMENT) || emotion.equals(MetricsManager.Emotions.VALENCE)) {
|
||||
// continue;
|
||||
// }
|
||||
// activateMetric(i, emotion);
|
||||
// i++;
|
||||
// }
|
||||
|
||||
//if we are in multiface mode, we need to enable the detection of all emotions
|
||||
if (multiFaceModeEnabled) {
|
||||
detector.setDetectAllEmotions(true);
|
||||
}
|
||||
// if (multiFaceModeEnabled) {
|
||||
// detector.setDetectAllEmotions(true);
|
||||
// }
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -540,21 +542,21 @@ public class MainActivity extends AppCompatActivity
|
|||
Method getFaceScoreMethod = null; //The method that will be used to get a metric score
|
||||
|
||||
try {
|
||||
metricNames[index].setText(MetricsManager.getUpperCaseName(metric));
|
||||
// metricNames[index].setText(MetricsManager.getUpperCaseName(metric));
|
||||
getFaceScoreMethod = Face.Emotions.class.getMethod("get" + MetricsManager.getCamelCase(metric));
|
||||
|
||||
//The MetricDisplay for Valence is unique; it shades it color depending on the metric value
|
||||
if (metric == MetricsManager.Emotions.VALENCE) {
|
||||
metricDisplays[index].setIsShadedMetricView(true);
|
||||
} else {
|
||||
metricDisplays[index].setIsShadedMetricView(false);
|
||||
}
|
||||
// if (metric == MetricsManager.Emotions.VALENCE) {
|
||||
// metricDisplays[index].setIsShadedMetricView(true);
|
||||
// } else {
|
||||
// metricDisplays[index].setIsShadedMetricView(false);
|
||||
// }
|
||||
|
||||
} catch (NoSuchMethodException e) {
|
||||
Log.e(LOG_TAG, String.format("No such method while using reflection to generate methods for %s", metric.toString()), e);
|
||||
}
|
||||
|
||||
metricDisplays[index].setMetricToDisplay(metric, getFaceScoreMethod);
|
||||
// metricDisplays[index].setMetricToDisplay(metric, getFaceScoreMethod);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -617,7 +619,7 @@ public class MainActivity extends AppCompatActivity
|
|||
if (!isBackFacingCameraDetected && !isFrontFacingCameraDetected)
|
||||
return; //without any cameras detected, we cannot proceed
|
||||
|
||||
detector.setDetectValence(true); //this app will always detect valence
|
||||
detector.setDetectValence(false); //this app will always detect valence
|
||||
if (!detector.isRunning()) {
|
||||
try {
|
||||
detector.start();
|
||||
|
@ -632,6 +634,8 @@ public class MainActivity extends AppCompatActivity
|
|||
leftMetricsLayout.animate().alpha(1); //make left and right metrics appear
|
||||
rightMetricsLayout.animate().alpha(1);
|
||||
|
||||
showFaceText.setVisibility(View.GONE);
|
||||
|
||||
resetFPSCalculations(); //Since the FPS may be different whether a face is being tracked or not, reset variables.
|
||||
|
||||
if(mp != null && !mp.isPlaying()) {
|
||||
|
@ -641,6 +645,7 @@ public class MainActivity extends AppCompatActivity
|
|||
|
||||
@Override
|
||||
public void onFaceDetectionStopped() {
|
||||
showFaceText.setVisibility(View.VISIBLE);
|
||||
performFaceDetectionStoppedTasks();
|
||||
}
|
||||
|
||||
|
@ -670,10 +675,36 @@ public class MainActivity extends AppCompatActivity
|
|||
drawingView.invalidatePoints();
|
||||
} else if (faces.size() == 1) {
|
||||
metricViewLayout.setVisibility(View.VISIBLE);
|
||||
|
||||
//update metrics with latest face information. The metrics are displayed on a MetricView, a custom view with a .setScore() method.
|
||||
for (MetricDisplay metricDisplay : metricDisplays) {
|
||||
updateMetricScore(metricDisplay, faces.get(0));
|
||||
int i = 0;
|
||||
for (TextView metricDisplay : metricDisplays) {
|
||||
float score = 0;
|
||||
switch (i){
|
||||
case 4:
|
||||
score = faces.get(0).emotions.getAnger();
|
||||
break;
|
||||
case 5:
|
||||
score = faces.get(0).emotions.getContempt();
|
||||
break;
|
||||
case 6:
|
||||
score = faces.get(0).emotions.getDisgust();
|
||||
break;
|
||||
case 0:
|
||||
score = faces.get(0).emotions.getFear();
|
||||
break;
|
||||
case 1:
|
||||
score = faces.get(0).emotions.getJoy();
|
||||
break;
|
||||
case 2:
|
||||
score = faces.get(0).emotions.getSadness();
|
||||
break;
|
||||
case 3:
|
||||
score = faces.get(0).emotions.getSurprise();
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
metricDisplay.setText(String.format(Locale.US, "%.0f%%", score));
|
||||
// updateMetricScore(metricDisplay, faces.get(0));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -828,13 +859,14 @@ public class MainActivity extends AppCompatActivity
|
|||
* before numberOfFrames overflows.
|
||||
*/
|
||||
void performFPSCalculations() {
|
||||
numberOfFrames += 1;
|
||||
long currentTime = SystemClock.elapsedRealtime();
|
||||
if (currentTime > timeToUpdate) {
|
||||
float framesPerSecond = (numberOfFrames / (float) (currentTime - firstSystemTime)) * 1000f;
|
||||
fpsPct.setText(String.format(" %.1f", framesPerSecond));
|
||||
timeToUpdate = currentTime + 1000L;
|
||||
}
|
||||
return;
|
||||
// numberOfFrames += 1;
|
||||
// long currentTime = SystemClock.elapsedRealtime();
|
||||
// if (currentTime > timeToUpdate) {
|
||||
// float framesPerSecond = (numberOfFrames / (float) (currentTime - firstSystemTime)) * 1000f;
|
||||
// fpsPct.setText(String.format(" %.1f", framesPerSecond));
|
||||
// timeToUpdate = currentTime + 1000L;
|
||||
// }
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -915,14 +947,15 @@ public class MainActivity extends AppCompatActivity
|
|||
|
||||
|
||||
void setFPSVisible(boolean b) {
|
||||
isFPSVisible = b;
|
||||
if (b) {
|
||||
fpsName.setVisibility(View.VISIBLE);
|
||||
fpsPct.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
fpsName.setVisibility(View.INVISIBLE);
|
||||
fpsPct.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
return;
|
||||
// isFPSVisible = b;
|
||||
// if (b) {
|
||||
// fpsName.setVisibility(View.VISIBLE);
|
||||
// fpsPct.setVisibility(View.VISIBLE);
|
||||
// } else {
|
||||
// fpsName.setVisibility(View.INVISIBLE);
|
||||
// fpsPct.setVisibility(View.INVISIBLE);
|
||||
// }
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
<include
|
||||
android:id="@+id/metric_view_group"
|
||||
layout="@layout/metric_layout"
|
||||
android:layout_height="170dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_centerVertical="true" />
|
||||
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:orientation="horizontal"
|
||||
android:layout_height="170dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_centerHorizontal="true"
|
||||
|
@ -12,91 +13,141 @@
|
|||
android:layout_gravity="center_vertical">
|
||||
<!-- Logo-->
|
||||
<!-- Left MetricsManager-->
|
||||
<LinearLayout
|
||||
android:orientation="vertical"
|
||||
android:paddingLeft="@dimen/metric_panel_padding"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:id="@+id/left_metrics">
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_name_0"
|
||||
/>
|
||||
<com.affectiva.affdexme.MetricDisplay
|
||||
style="@style/metricPct"
|
||||
android:id="@+id/metric_pct_0" />
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_name_1" />
|
||||
<com.affectiva.affdexme.MetricDisplay
|
||||
style="@style/metricPct"
|
||||
android:id="@+id/metric_pct_1" />
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_name_2" />
|
||||
<com.affectiva.affdexme.MetricDisplay
|
||||
style="@style/metricPct"
|
||||
android:id="@+id/metric_pct_2" />
|
||||
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_name_3" />
|
||||
<com.affectiva.affdexme.MetricDisplay
|
||||
style="@style/metricPct"
|
||||
android:id="@+id/metric_pct_3" />
|
||||
</LinearLayout>
|
||||
<!-- FPS Counter-->
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:orientation="horizontal">
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="right|bottom"
|
||||
android:layout_weight="1"
|
||||
android:id="@+id/fps_name"
|
||||
android:text="@string/fps"
|
||||
/>
|
||||
<TextView
|
||||
style="@style/metricPct"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="left|bottom"
|
||||
android:id="@+id/fps_value"
|
||||
android:textSize="@dimen/pct_text_size"
|
||||
android:textColor="@color/letter_gray"
|
||||
android:layout_weight="1"
|
||||
/>
|
||||
</LinearLayout>
|
||||
<!-- Right MetricsManager-->
|
||||
<LinearLayout
|
||||
android:orientation="vertical"
|
||||
android:layout_width="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_alignParentRight="true"
|
||||
android:paddingRight="@dimen/metric_panel_padding"
|
||||
android:layout_height="130dp"
|
||||
android:paddingTop="15dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/right_metrics">
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_name_4" />
|
||||
<com.affectiva.affdexme.MetricDisplay
|
||||
style="@style/metricPct"
|
||||
android:id="@+id/metric_pct_4" />
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_name_5" />
|
||||
<com.affectiva.affdexme.MetricDisplay
|
||||
style="@style/metricPct"
|
||||
android:id="@+id/metric_pct_5" />
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_name_6" />
|
||||
<com.affectiva.affdexme.MetricDisplay
|
||||
style="@style/metricPct"
|
||||
android:id="@+id/metric_pct_6" />
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_name_4"
|
||||
android:text="anger"
|
||||
android:paddingTop="15dp"/>
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_pct_4"
|
||||
tools:text="10%" />
|
||||
</LinearLayout>
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_name_5"
|
||||
|
||||
android:text="contempt" />
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_pct_5"
|
||||
tools:text="10%" />
|
||||
</LinearLayout>
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_name_6"
|
||||
android:text="disgust"
|
||||
android:paddingTop="15dp" />
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_pct_6"
|
||||
tools:text="10%" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:orientation="horizontal"
|
||||
android:paddingLeft="@dimen/metric_panel_padding"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/left_metrics"
|
||||
android:paddingBottom="15dp"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentStart="true">
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_name_0"
|
||||
android:text="fear"/>
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_pct_0"
|
||||
tools:text="10%" />
|
||||
</LinearLayout>
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_name_1"
|
||||
android:text="joy"
|
||||
android:paddingTop="15dp"/>
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_pct_1"
|
||||
tools:text="10%" />
|
||||
</LinearLayout>
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_name_2"
|
||||
android:text="sadness"
|
||||
android:paddingTop="15dp" />
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_pct_2"
|
||||
tools:text="10%" />
|
||||
</LinearLayout>
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_name_3"
|
||||
android:text="surprise" />
|
||||
<TextView
|
||||
style="@style/metricName"
|
||||
android:id="@+id/metric_pct_3"
|
||||
tools:text="10%" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:text="Please, show your face"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/no_face_found"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="24sp"
|
||||
android:textAlignment="center"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_centerHorizontal="true" />
|
||||
</RelativeLayout>
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 4 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 9.6 KiB |
BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 14 KiB |
|
@ -12,7 +12,7 @@
|
|||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:gravity">center</item>
|
||||
<item name="android:textStyle">bold</item>
|
||||
<item name="android:textColor">@color/affectiva_orange</item>
|
||||
<item name="android:textColor">@color/white</item>
|
||||
<item name="android:shadowColor">#000000</item>
|
||||
<item name="android:shadowDy">2</item>
|
||||
<item name="android:shadowRadius">1</item>
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
<item name="android:layout_width">fill_parent</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_gravity">center</item>
|
||||
<item name="textColor">@color/letter_gray</item>
|
||||
<item name="textColor">@color/white</item>
|
||||
<item name="textSize">@dimen/pct_text_size</item>
|
||||
<item name="metricBarLength">@dimen/metric_view_bar_length</item>
|
||||
</style>
|
||||
|
|