Skip to content

Commit 47b7f2f

Browse files
committed
Merge branch 'master' into feature/push-recurring-3
2 parents 9ad0958 + 3aa536b commit 47b7f2f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+877
-57
lines changed

CHANGELOG.md

+45
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,48 @@
1+
## Version 23.06
2+
3+
New Features:
4+
- [app_versions] display time series data
5+
- [dashboards] new time series type for Technology section
6+
- [dashboards] SDK statistics widgets
7+
- [events] added event comparison by average duration
8+
- [events] added search in available segments
9+
- [events] show omitted segments
10+
- [populator] create funnels
11+
- [push] new push notification structure and types
12+
- [sdk] SDK remote configuration
13+
- [sdk] SDK statistics
14+
- [user-management] clear failed logins for user
15+
- [user-management] search for feature permissions
16+
17+
Enterprise new features:
18+
- [ab-testing] allow customer period running tests including indefinitely
19+
- [ab-testing] allow reseting experiments
20+
- [ab-testing] new APIs for fetching all varians and testing varians (enrolling/leaving variants)
21+
- [data-manager] division of data manager permissions
22+
- [drill] enhanced state url for drill
23+
- [drill] new drill meta structure
24+
- [events] add drill option to Events
25+
- [surveys] different logo types
26+
- [surveys] show always option
27+
- [users] download user debug information
28+
- [users] enable incoming data log for single user
29+
30+
Fixes:
31+
- [crashes] clean big crash group documents
32+
- [db] reduce timeouts to display errors
33+
- [ratings] allow images with dot in the name
34+
35+
Enterprise fixes:
36+
- [ab-testing] fix json-editor in ab-testing
37+
- [attribution] fix safari redirect issues for custom scheme
38+
- [cohorts] dealing with widgets for the cohort after cohort deletion
39+
- [crash_symbolication] add logs for symbolication server connection test
40+
- [drill] break down by date should break by dates and not seconds
41+
- [drill] heatmap chart shouldn't limit series to 10
42+
- [drill] hide no data text
43+
- [drill] standartizing ls/lac behavior
44+
- [performance-monitoring] splitting documents to be able to store more data
45+
146
## Version 23.03.9
247
Fixes:
348
- [core] Fixes to periodObject function to deal with invalid date arrays.

Dockerfile

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
FROM phusion/baseimage:0.11
22

3-
ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,logger,systemlogs,populator,reports,crashes,push,star-rating,slipping-away-users,compare,server-stats,dbviewer,times-of-day,compliance-hub,alerts,onboarding,consolidate,remote-config,hooks,dashboards
3+
ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,logger,systemlogs,populator,reports,crashes,push,star-rating,slipping-away-users,compare,server-stats,dbviewer,times-of-day,compliance-hub,alerts,onboarding,consolidate,remote-config,hooks,dashboards,sdk,data-manager
44
# Enterprise Edition:
5-
#ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,license,drill,funnels,retention_segments,flows,cohorts,surveys,remote-config,ab-testing,formulas,activity-map,concurrent_users,revenue,logger,systemlogs,populator,reports,crashes,push,geo,block,users,star-rating,slipping-away-users,compare,server-stats,dbviewer,crash_symbolication,crashes-jira,groups,white-labeling,alerts,times-of-day,compliance-hub,onboarding,active_users,performance-monitoring,config-transfer,consolidate,data-manager,hooks,dashboards,heatmaps
5+
#ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,license,drill,funnels,retention_segments,flows,cohorts,surveys,remote-config,ab-testing,formulas,activity-map,concurrent_users,revenue,logger,systemlogs,populator,reports,crashes,push,geo,block,users,star-rating,slipping-away-users,compare,server-stats,dbviewer,crash_symbolication,crashes-jira,groups,white-labeling,alerts,times-of-day,compliance-hub,onboarding,active_users,performance-monitoring,config-transfer,consolidate,data-manager,hooks,dashboards,heatmaps,sdk
66

77
ARG COUNTLY_CONFIG_API_MONGODB_HOST=localhost
88
ARG COUNTLY_CONFIG_FRONTEND_MONGODB_HOST=localhost

Dockerfile-api

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
FROM node:fermium-bullseye-slim
22

3-
ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,logger,systemlogs,populator,reports,crashes,push,star-rating,slipping-away-users,compare,server-stats,dbviewer,times-of-day,compliance-hub,alerts,onboarding,consolidate,remote-config,hooks,dashboards
3+
ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,logger,systemlogs,populator,reports,crashes,push,star-rating,slipping-away-users,compare,server-stats,dbviewer,times-of-day,compliance-hub,alerts,onboarding,consolidate,remote-config,hooks,dashboards,sdk,data-manager
44
# Enterprise Edition:
5-
#ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,license,drill,funnels,retention_segments,flows,cohorts,surveys,remote-config,ab-testing,formulas,activity-map,concurrent_users,revenue,logger,systemlogs,populator,reports,crashes,push,geo,block,users,star-rating,slipping-away-users,compare,server-stats,dbviewer,crash_symbolication,crashes-jira,groups,white-labeling,alerts,times-of-day,compliance-hub,onboarding,active_users,performance-monitoring,config-transfer,consolidate,data-manager,hooks,dashboards,heatmaps
5+
#ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,license,drill,funnels,retention_segments,flows,cohorts,surveys,remote-config,ab-testing,formulas,activity-map,concurrent_users,revenue,logger,systemlogs,populator,reports,crashes,push,geo,block,users,star-rating,slipping-away-users,compare,server-stats,dbviewer,crash_symbolication,crashes-jira,groups,white-labeling,alerts,times-of-day,compliance-hub,onboarding,active_users,performance-monitoring,config-transfer,consolidate,data-manager,hooks,dashboards,heatmaps,sdk
66

77
ARG GEOIP=empty
88
EXPOSE 3001

Dockerfile-centos-api

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
FROM centos:8
22

3-
ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,logger,systemlogs,populator,reports,crashes,push,star-rating,slipping-away-users,compare,server-stats,dbviewer,times-of-day,compliance-hub,alerts,onboarding,consolidate,remote-config,hooks,dashboards
3+
ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,logger,systemlogs,populator,reports,crashes,push,star-rating,slipping-away-users,compare,server-stats,dbviewer,times-of-day,compliance-hub,alerts,onboarding,consolidate,remote-config,hooks,dashboards,sdk,data-manager
44
# Enterprise Edition:
5-
#ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,license,drill,funnels,retention_segments,flows,cohorts,surveys,remote-config,ab-testing,formulas,activity-map,concurrent_users,revenue,logger,systemlogs,populator,reports,crashes,push,geo,block,users,star-rating,slipping-away-users,compare,server-stats,dbviewer,crash_symbolication,crashes-jira,groups,white-labeling,alerts,times-of-day,compliance-hub,onboarding,active_users,performance-monitoring,config-transfer,consolidate,data-manager,hooks,dashboards,heatmaps
5+
#ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,license,drill,funnels,retention_segments,flows,cohorts,surveys,remote-config,ab-testing,formulas,activity-map,concurrent_users,revenue,logger,systemlogs,populator,reports,crashes,push,geo,block,users,star-rating,slipping-away-users,compare,server-stats,dbviewer,crash_symbolication,crashes-jira,groups,white-labeling,alerts,times-of-day,compliance-hub,onboarding,active_users,performance-monitoring,config-transfer,consolidate,data-manager,hooks,dashboards,heatmaps,sdk
66

77
ARG GEOIP=empty
88
EXPOSE 3001

Dockerfile-centos-frontend

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
FROM centos:8
22

3-
ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,logger,systemlogs,populator,reports,crashes,push,star-rating,slipping-away-users,compare,server-stats,dbviewer,times-of-day,compliance-hub,alerts,onboarding,consolidate,remote-config,hooks,dashboards
3+
ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,logger,systemlogs,populator,reports,crashes,push,star-rating,slipping-away-users,compare,server-stats,dbviewer,times-of-day,compliance-hub,alerts,onboarding,consolidate,remote-config,hooks,dashboards,sdk,data-manager
44
# Enterprise Edition:
5-
#ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,license,drill,funnels,retention_segments,flows,cohorts,surveys,remote-config,ab-testing,formulas,activity-map,concurrent_users,revenue,logger,systemlogs,populator,reports,crashes,push,geo,block,users,star-rating,slipping-away-users,compare,server-stats,dbviewer,crash_symbolication,crashes-jira,groups,white-labeling,alerts,times-of-day,compliance-hub,onboarding,active_users,performance-monitoring,config-transfer,consolidate,data-manager,hooks,dashboards,heatmaps
5+
#ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,license,drill,funnels,retention_segments,flows,cohorts,surveys,remote-config,ab-testing,formulas,activity-map,concurrent_users,revenue,logger,systemlogs,populator,reports,crashes,push,geo,block,users,star-rating,slipping-away-users,compare,server-stats,dbviewer,crash_symbolication,crashes-jira,groups,white-labeling,alerts,times-of-day,compliance-hub,onboarding,active_users,performance-monitoring,config-transfer,consolidate,data-manager,hooks,dashboards,heatmaps,sdk
66

77
EXPOSE 6001
88
HEALTHCHECK --start-period=400s CMD curl --fail http://localhost:6001/ping || exit 1

Dockerfile-core

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
FROM phusion/baseimage:focal-1.2.0
22

3-
ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,logger,systemlogs,populator,reports,crashes,push,star-rating,slipping-away-users,compare,server-stats,dbviewer,times-of-day,compliance-hub,alerts,onboarding,consolidate,remote-config,hooks,dashboards
3+
ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,logger,systemlogs,populator,reports,crashes,push,star-rating,slipping-away-users,compare,server-stats,dbviewer,times-of-day,compliance-hub,alerts,onboarding,consolidate,remote-config,hooks,dashboards,sdk,data-manager
44
# Enterprise Edition:
5-
#ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,license,drill,funnels,retention_segments,flows,cohorts,surveys,remote-config,ab-testing,formulas,activity-map,concurrent_users,revenue,logger,systemlogs,populator,reports,crashes,push,geo,block,users,star-rating,slipping-away-users,compare,server-stats,dbviewer,crash_symbolication,crashes-jira,groups,white-labeling,alerts,times-of-day,compliance-hub,onboarding,active_users,performance-monitoring,config-transfer,consolidate,data-manager,hooks,dashboards,heatmaps
5+
#ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,license,drill,funnels,retention_segments,flows,cohorts,surveys,remote-config,ab-testing,formulas,activity-map,concurrent_users,revenue,logger,systemlogs,populator,reports,crashes,push,geo,block,users,star-rating,slipping-away-users,compare,server-stats,dbviewer,crash_symbolication,crashes-jira,groups,white-labeling,alerts,times-of-day,compliance-hub,onboarding,active_users,performance-monitoring,config-transfer,consolidate,data-manager,hooks,dashboards,heatmaps,sdk
66

77
ARG COUNTLY_CONFIG_API_MONGODB_HOST=localhost
88
ARG COUNTLY_CONFIG_FRONTEND_MONGODB_HOST=localhost

Dockerfile-frontend

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
FROM node:fermium-bullseye-slim
22

3-
ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,logger,systemlogs,populator,reports,crashes,push,star-rating,slipping-away-users,compare,server-stats,dbviewer,times-of-day,compliance-hub,alerts,onboarding,consolidate,remote-config,hooks,dashboards
3+
ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,logger,systemlogs,populator,reports,crashes,push,star-rating,slipping-away-users,compare,server-stats,dbviewer,times-of-day,compliance-hub,alerts,onboarding,consolidate,remote-config,hooks,dashboards,sdk,data-manager
44
# Enterprise Edition:
5-
#ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,license,drill,funnels,retention_segments,flows,cohorts,surveys,remote-config,ab-testing,formulas,activity-map,concurrent_users,revenue,logger,systemlogs,populator,reports,crashes,push,geo,block,users,star-rating,slipping-away-users,compare,server-stats,dbviewer,crash_symbolication,crashes-jira,groups,white-labeling,alerts,times-of-day,compliance-hub,onboarding,active_users,performance-monitoring,config-transfer,consolidate,data-manager,hooks,dashboards,heatmaps
5+
#ARG COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,license,drill,funnels,retention_segments,flows,cohorts,surveys,remote-config,ab-testing,formulas,activity-map,concurrent_users,revenue,logger,systemlogs,populator,reports,crashes,push,geo,block,users,star-rating,slipping-away-users,compare,server-stats,dbviewer,crash_symbolication,crashes-jira,groups,white-labeling,alerts,times-of-day,compliance-hub,onboarding,active_users,performance-monitoring,config-transfer,consolidate,data-manager,hooks,dashboards,heatmaps,sdk
66

77
EXPOSE 6001
88
HEALTHCHECK --start-period=400s CMD curl --fail http://localhost:6001/ping || exit 1

api/lib/countly.model.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -596,8 +596,11 @@ countlyModel.create = function(fetchValue) {
596596
var chartData = [];
597597
var dataProps = [];
598598
for (let i = 0; i < data.length; i++) {
599-
chartData.push({ data: [], label: fetchValue ? fetchValue(data[i][segment]) : data[i][segment]});
600-
dataProps.push({ name: data[i][segment]});
599+
var segment_value = fetchValue ? fetchValue(data[i][segment]) : data[i][segment];
600+
if (segment_value) {
601+
chartData.push({ data: [], label: segment_value});
602+
dataProps.push({ name: data[i][segment]});
603+
}
601604
}
602605
var dd = countlyCommon.extractStackedBarData(this.getDb(), this.clearObject, chartData, dataProps, "", true);
603606
var series = dd.chartDP;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const pluginManager = require('../../../../plugins/pluginManager.js');
2+
const { cleanupCustomField, DEFAULT_MAX_CUSTOM_FIELD_KEYS } = require('../../../../plugins/crashes/api/parts/custom_field.js');
3+
4+
console.log('Cleaning up crashgroup custom fields');
5+
6+
pluginManager.dbConnection().then(async(countlyDb) => {
7+
const maxCustomFieldKeys = pluginManager.getConfig('crashes').max_custom_field_keys || DEFAULT_MAX_CUSTOM_FIELD_KEYS;
8+
await cleanupCustomField(countlyDb, maxCustomFieldKeys);
9+
10+
countlyDb.close();
11+
console.log('Crashgroup cleanup done');
12+
});

bin/upgrade/23.05/scripts/upgrade_user_permission_data-manager.js bin/upgrade/23.06/scripts/upgrade_user_permission_data-manager.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ pluginManager.dbConnection().then(async (countlyDb) => {
2727
}
2828
let apps = group.permission[type];
2929
Object.keys(apps).forEach(function (appId) {
30-
if (apps[appId].allowed.data_manager) {
30+
if (!apps[appId].allowed) {
31+
apps[appId].allowed = {};
32+
update[`permission.${type}.${appId}.allowed`] = {};
33+
}
34+
else if (apps[appId].allowed.data_manager) {
3135
update[`permission.${type}.${appId}.allowed.data_manager: Transformations`] = true;
3236
if (type !== 'r') {//since c,u,d means the same thing for data_manager: Redaction
3337
for (let CrudType of ['c','u','d']) {
File renamed without changes.

bin/upgrade/23.05/upgrade_db.sh bin/upgrade/23.06/upgrade_db.sh

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/bin/bash
22

3-
VER="23.05"
3+
VER="23.06"
44

55
CONTINUE="$(countly check before upgrade db "$VER")"
66

@@ -23,6 +23,7 @@ then
2323
if [ "$1" != "combined" ]; then
2424
#upgrade plugins
2525
countly plugin enable license;
26+
countly plugin enable sdk;
2627
nodejs "$DIR/scripts/install_plugins.js"
2728
fi
2829

@@ -34,6 +35,7 @@ then
3435
nodejs "$SCRIPTS/scripts/upgrade_user_permission_data-manager.js"
3536
nodejs "$SCRIPTS/scripts/rebuild_member_permission.js"
3637
nodejs "$SCRIPTS/scripts/merge_drill_meta.js"
38+
nodejs "$SCRIPTS/scripts/cleanup_crashgroup_custom_field.js"
3739

3840
if [ "$1" != "combined" ]; then
3941
countly upgrade;

bin/upgrade/23.05/upgrade_fs.sh bin/upgrade/23.06/upgrade_fs.sh

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
echo "Running filesystem modifications"
44

5-
VER="23.05"
5+
VER="23.06"
66

77
CONTINUE="$(countly check before upgrade fs "$VER")"
88

@@ -22,6 +22,8 @@ then
2222

2323
#enable command line
2424
bash "$DIR/scripts/detect.init.sh"
25+
26+
countly plugin enable sdk;
2527

2628
#upgrade plugins
2729
nodejs "$DIR/scripts/install_plugins.js"

docker-compose.yml

+4-4
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ services:
1818
image: 'countly/api:latest'
1919
# Enterprise Edition: image: 'gcr.io/countly-01/api:20.11.2'
2020
environment:
21-
- COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,enterpriseinfo,logger,systemlogs,populator,reports,crashes,push,star-rating,slipping-away-users,compare,server-stats,dbviewer,assistant,times-of-day,compliance-hub,video-intelligence-monetization,alerts,onboarding,consolidate
22-
# Enterprise Edition: - COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,drill,funnels,retention_segments,flows,cohorts,surveys,remote-config,ab-testing,formulas,activity-map,concurrent_users,revenue,logger,systemlogs,populator,reports,crashes,push,geo,block,restrict,users,star-rating,slipping-away-users,compare,server-stats,assistant,dbviewer,crash_symbolication,crashes-jira,groups,white-labeling,alerts,times-of-day,compliance-hub,onboarding,active_users,performance-monitoring,config-transfer,consolidate,data-manager,hooks,dashboards
21+
- COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,logger,systemlogs,populator,reports,crashes,push,star-rating,slipping-away-users,compare,server-stats,dbviewer,times-of-day,compliance-hub,alerts,onboarding,consolidate,remote-config,hooks,dashboards,sdk,data-manager
22+
# Enterprise Edition: - COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,drill,funnels,retention_segments,flows,cohorts,surveys,remote-config,ab-testing,formulas,activity-map,concurrent_users,revenue,logger,systemlogs,populator,reports,crashes,push,geo,block,restrict,users,star-rating,slipping-away-users,compare,server-stats,assistant,dbviewer,crash_symbolication,crashes-jira,groups,white-labeling,alerts,times-of-day,compliance-hub,onboarding,active_users,performance-monitoring,config-transfer,consolidate,data-manager,hooks,dashboards,sdk
2323
- COUNTLY_CONFIG__MONGODB_HOST=mongodb
2424
- NODE_OPTIONS="--max-old-space-size=2048"
2525
deploy:
@@ -37,8 +37,8 @@ services:
3737
image: 'countly/frontend:latest'
3838
# Enterprise Edition: image: 'gcr.io/countly-01/frontend:20.11.2'
3939
environment:
40-
- COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,enterpriseinfo,logger,systemlogs,populator,reports,crashes,push,star-rating,slipping-away-users,compare,server-stats,dbviewer,assistant,times-of-day,compliance-hub,video-intelligence-monetization,alerts,onboarding,consolidate
41-
# Enterprise Edition: - COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,drill,funnels,retention_segments,flows,cohorts,surveys,remote-config,ab-testing,formulas,activity-map,concurrent_users,revenue,logger,systemlogs,populator,reports,crashes,push,geo,block,restrict,users,star-rating,slipping-away-users,compare,server-stats,assistant,dbviewer,crash_symbolication,crashes-jira,groups,white-labeling,alerts,times-of-day,compliance-hub,onboarding,active_users,performance-monitoring,config-transfer,consolidate,data-manager,hooks,dashboards
40+
- COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,logger,systemlogs,populator,reports,crashes,push,star-rating,slipping-away-users,compare,server-stats,dbviewer,times-of-day,compliance-hub,alerts,onboarding,consolidate,remote-config,hooks,dashboards,sdk,data-manager
41+
# Enterprise Edition: - COUNTLY_PLUGINS=mobile,web,desktop,plugins,density,locale,browser,sources,views,drill,funnels,retention_segments,flows,cohorts,surveys,remote-config,ab-testing,formulas,activity-map,concurrent_users,revenue,logger,systemlogs,populator,reports,crashes,push,geo,block,restrict,users,star-rating,slipping-away-users,compare,server-stats,assistant,dbviewer,crash_symbolication,crashes-jira,groups,white-labeling,alerts,times-of-day,compliance-hub,onboarding,active_users,performance-monitoring,config-transfer,consolidate,data-manager,hooks,dashboards,sdk
4242
- COUNTLY_CONFIG__MONGODB_HOST=mongodb
4343
- NODE_OPTIONS="--max-old-space-size=2048"
4444
networks:

0 commit comments

Comments
 (0)