Commit b56ed5c9 authored by Xianzhu Wang's avatar Xianzhu Wang Committed by Commit Bot

Remove ScrollingCoordinator UMA and UKM from the code, and mark as obsolete

The step in LocalFrameView has been merged into CompositingCommit
(PaintArtifactCompositor::Update) in http://crrev.com/815947.

Bug: 1132717
Change-Id: I69417ad86ae3b7507641ad693255aca9e58958ec
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2462068Reviewed-by: default avatarStephen Chenney <schenney@chromium.org>
Reviewed-by: default avatarIlya Sherman <isherman@chromium.org>
Reviewed-by: default avatarRobert Kaplow <rkaplow@chromium.org>
Commit-Queue: Xianzhu Wang <wangxianzhu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#816648}
parent 6b58f383
...@@ -24,7 +24,6 @@ struct CC_EXPORT BeginMainFrameMetrics { ...@@ -24,7 +24,6 @@ struct CC_EXPORT BeginMainFrameMetrics {
base::TimeDelta compositing_assignments; base::TimeDelta compositing_assignments;
base::TimeDelta compositing_inputs; base::TimeDelta compositing_inputs;
base::TimeDelta paint; base::TimeDelta paint;
base::TimeDelta scrolling_coordinator;
base::TimeDelta composite_commit; base::TimeDelta composite_commit;
base::TimeDelta update_layers; base::TimeDelta update_layers;
// True if we should measure smoothness in TotalFrameCounter and // True if we should measure smoothness in TotalFrameCounter and
......
...@@ -162,9 +162,6 @@ constexpr const char* GetStageName(int stage_type_index, ...@@ -162,9 +162,6 @@ constexpr const char* GetStageName(int stage_type_index,
return "SendBeginMainFrameToCommit.CompositingAssignments"; return "SendBeginMainFrameToCommit.CompositingAssignments";
case static_cast<int>(BlinkBreakdown::kPaint) + kBlinkBreakdownInitialIndex: case static_cast<int>(BlinkBreakdown::kPaint) + kBlinkBreakdownInitialIndex:
return "SendBeginMainFrameToCommit.Paint"; return "SendBeginMainFrameToCommit.Paint";
case static_cast<int>(BlinkBreakdown::kScrollingCoordinator) +
kBlinkBreakdownInitialIndex:
return "SendBeginMainFrameToCommit.ScrollingCoordinator";
case static_cast<int>(BlinkBreakdown::kCompositeCommit) + case static_cast<int>(BlinkBreakdown::kCompositeCommit) +
kBlinkBreakdownInitialIndex: kBlinkBreakdownInitialIndex:
return "SendBeginMainFrameToCommit.CompositeCommit"; return "SendBeginMainFrameToCommit.CompositeCommit";
...@@ -269,9 +266,9 @@ void ReportOffsetBetweenDeadlineAndPresentationTime( ...@@ -269,9 +266,9 @@ void ReportOffsetBetweenDeadlineAndPresentationTime(
static_cast<size_t>(VizBreakdown::kSwapStartToBufferAvailable); \ static_cast<size_t>(VizBreakdown::kSwapStartToBufferAvailable); \
bool has_ready_timings = !!viz_breakdown_list_[start_to_buffer_available]; \ bool has_ready_timings = !!viz_breakdown_list_[start_to_buffer_available]; \
for (size_t i = 0; i < start_to_buffer_available; i++) { \ for (size_t i = 0; i < start_to_buffer_available; i++) { \
if (!viz_breakdown_list_[i]) \ if (!viz_breakdown_list_[i]) { \
break; \ break; \
\ } \
if (i == static_cast<size_t>(VizBreakdown::kSwapStartToSwapEnd) && \ if (i == static_cast<size_t>(VizBreakdown::kSwapStartToSwapEnd) && \
has_ready_timings) { \ has_ready_timings) { \
size_t latch_to_swap_end = \ size_t latch_to_swap_end = \
...@@ -999,9 +996,6 @@ void CompositorFrameReporter::PopulateBlinkBreakdownList() { ...@@ -999,9 +996,6 @@ void CompositorFrameReporter::PopulateBlinkBreakdownList() {
blink_breakdown_.compositing_assignments; blink_breakdown_.compositing_assignments;
blink_breakdown_list_[static_cast<int>(BlinkBreakdown::kPaint)] = blink_breakdown_list_[static_cast<int>(BlinkBreakdown::kPaint)] =
blink_breakdown_.paint; blink_breakdown_.paint;
blink_breakdown_list_[static_cast<int>(
BlinkBreakdown::kScrollingCoordinator)] =
blink_breakdown_.scrolling_coordinator;
blink_breakdown_list_[static_cast<int>(BlinkBreakdown::kCompositeCommit)] = blink_breakdown_list_[static_cast<int>(BlinkBreakdown::kCompositeCommit)] =
blink_breakdown_.composite_commit; blink_breakdown_.composite_commit;
blink_breakdown_list_[static_cast<int>(BlinkBreakdown::kUpdateLayers)] = blink_breakdown_list_[static_cast<int>(BlinkBreakdown::kUpdateLayers)] =
......
...@@ -115,10 +115,9 @@ class CC_EXPORT CompositorFrameReporter { ...@@ -115,10 +115,9 @@ class CC_EXPORT CompositorFrameReporter {
kCompositingInputs = 5, kCompositingInputs = 5,
kCompositingAssignments = 6, kCompositingAssignments = 6,
kPaint = 7, kPaint = 7,
kScrollingCoordinator = 8, kCompositeCommit = 8,
kCompositeCommit = 9, kUpdateLayers = 9,
kUpdateLayers = 10, kBeginMainSentToStarted = 10,
kBeginMainSentToStarted = 11,
kBreakdownCount kBreakdownCount
}; };
......
...@@ -49,20 +49,19 @@ class CompositorFrameReporterTest : public testing::Test { ...@@ -49,20 +49,19 @@ class CompositorFrameReporterTest : public testing::Test {
std::unique_ptr<BeginMainFrameMetrics> BuildBlinkBreakdown() { std::unique_ptr<BeginMainFrameMetrics> BuildBlinkBreakdown() {
auto breakdown = std::make_unique<BeginMainFrameMetrics>(); auto breakdown = std::make_unique<BeginMainFrameMetrics>();
breakdown->handle_input_events = base::TimeDelta::FromMicroseconds(11); breakdown->handle_input_events = base::TimeDelta::FromMicroseconds(10);
breakdown->animate = base::TimeDelta::FromMicroseconds(10); breakdown->animate = base::TimeDelta::FromMicroseconds(9);
breakdown->style_update = base::TimeDelta::FromMicroseconds(9); breakdown->style_update = base::TimeDelta::FromMicroseconds(8);
breakdown->layout_update = base::TimeDelta::FromMicroseconds(8); breakdown->layout_update = base::TimeDelta::FromMicroseconds(7);
breakdown->compositing_inputs = base::TimeDelta::FromMicroseconds(7); breakdown->compositing_inputs = base::TimeDelta::FromMicroseconds(6);
breakdown->prepaint = base::TimeDelta::FromMicroseconds(6); breakdown->prepaint = base::TimeDelta::FromMicroseconds(5);
breakdown->compositing_assignments = base::TimeDelta::FromMicroseconds(5); breakdown->compositing_assignments = base::TimeDelta::FromMicroseconds(4);
breakdown->paint = base::TimeDelta::FromMicroseconds(4); breakdown->paint = base::TimeDelta::FromMicroseconds(3);
breakdown->scrolling_coordinator = base::TimeDelta::FromMicroseconds(3);
breakdown->composite_commit = base::TimeDelta::FromMicroseconds(2); breakdown->composite_commit = base::TimeDelta::FromMicroseconds(2);
breakdown->update_layers = base::TimeDelta::FromMicroseconds(1); breakdown->update_layers = base::TimeDelta::FromMicroseconds(1);
// Advance now by the sum of the breakdowns. // Advance now by the sum of the breakdowns.
AdvanceNowByMs(11 + 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1); AdvanceNowByMs(10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1);
return breakdown; return breakdown;
} }
...@@ -376,9 +375,6 @@ TEST_F(CompositorFrameReporterTest, ...@@ -376,9 +375,6 @@ TEST_F(CompositorFrameReporterTest,
blink_breakdown_copy.compositing_assignments}, blink_breakdown_copy.compositing_assignments},
{"EventLatency.TouchPressed.SendBeginMainFrameToCommit.Paint", {"EventLatency.TouchPressed.SendBeginMainFrameToCommit.Paint",
blink_breakdown_copy.paint}, blink_breakdown_copy.paint},
{"EventLatency.TouchPressed.SendBeginMainFrameToCommit."
"ScrollingCoordinator",
blink_breakdown_copy.scrolling_coordinator},
{"EventLatency.TouchPressed.SendBeginMainFrameToCommit.CompositeCommit", {"EventLatency.TouchPressed.SendBeginMainFrameToCommit.CompositeCommit",
blink_breakdown_copy.composite_commit}, blink_breakdown_copy.composite_commit},
{"EventLatency.TouchPressed.SendBeginMainFrameToCommit.UpdateLayers", {"EventLatency.TouchPressed.SendBeginMainFrameToCommit.UpdateLayers",
......
...@@ -144,20 +144,19 @@ class CompositorFrameReportingControllerTest : public testing::Test { ...@@ -144,20 +144,19 @@ class CompositorFrameReportingControllerTest : public testing::Test {
std::unique_ptr<BeginMainFrameMetrics> BuildBlinkBreakdown() { std::unique_ptr<BeginMainFrameMetrics> BuildBlinkBreakdown() {
auto breakdown = std::make_unique<BeginMainFrameMetrics>(); auto breakdown = std::make_unique<BeginMainFrameMetrics>();
breakdown->handle_input_events = base::TimeDelta::FromMicroseconds(11); breakdown->handle_input_events = base::TimeDelta::FromMicroseconds(10);
breakdown->animate = base::TimeDelta::FromMicroseconds(10); breakdown->animate = base::TimeDelta::FromMicroseconds(9);
breakdown->style_update = base::TimeDelta::FromMicroseconds(9); breakdown->style_update = base::TimeDelta::FromMicroseconds(8);
breakdown->layout_update = base::TimeDelta::FromMicroseconds(8); breakdown->layout_update = base::TimeDelta::FromMicroseconds(7);
breakdown->compositing_inputs = base::TimeDelta::FromMicroseconds(7); breakdown->compositing_inputs = base::TimeDelta::FromMicroseconds(6);
breakdown->prepaint = base::TimeDelta::FromMicroseconds(6); breakdown->prepaint = base::TimeDelta::FromMicroseconds(5);
breakdown->compositing_assignments = base::TimeDelta::FromMicroseconds(5); breakdown->compositing_assignments = base::TimeDelta::FromMicroseconds(4);
breakdown->paint = base::TimeDelta::FromMicroseconds(4); breakdown->paint = base::TimeDelta::FromMicroseconds(3);
breakdown->scrolling_coordinator = base::TimeDelta::FromMicroseconds(3);
breakdown->composite_commit = base::TimeDelta::FromMicroseconds(2); breakdown->composite_commit = base::TimeDelta::FromMicroseconds(2);
breakdown->update_layers = base::TimeDelta::FromMicroseconds(1); breakdown->update_layers = base::TimeDelta::FromMicroseconds(1);
// Advance now by the sum of the breakdowns. // Advance now by the sum of the breakdowns.
AdvanceNowByMs(11 + 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1); AdvanceNowByMs(10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1);
return breakdown; return breakdown;
} }
...@@ -921,18 +920,15 @@ TEST_F(CompositorFrameReportingControllerTest, BlinkBreakdown) { ...@@ -921,18 +920,15 @@ TEST_F(CompositorFrameReportingControllerTest, BlinkBreakdown) {
base::TimeDelta::FromMicroseconds(7).InMilliseconds(), 1); base::TimeDelta::FromMicroseconds(7).InMilliseconds(), 1);
histogram_tester.ExpectUniqueSample( histogram_tester.ExpectUniqueSample(
"CompositorLatency.SendBeginMainFrameToCommit.CompositingInputs", "CompositorLatency.SendBeginMainFrameToCommit.CompositingInputs",
base::TimeDelta::FromMicroseconds(5).InMilliseconds(), 1);
histogram_tester.ExpectUniqueSample(
"CompositorLatency.SendBeginMainFrameToCommit.Prepaint",
base::TimeDelta::FromMicroseconds(6).InMilliseconds(), 1); base::TimeDelta::FromMicroseconds(6).InMilliseconds(), 1);
histogram_tester.ExpectUniqueSample( histogram_tester.ExpectUniqueSample(
"CompositorLatency.SendBeginMainFrameToCommit.CompositingAssignments", "CompositorLatency.SendBeginMainFrameToCommit.Prepaint",
base::TimeDelta::FromMicroseconds(5).InMilliseconds(), 1); base::TimeDelta::FromMicroseconds(5).InMilliseconds(), 1);
histogram_tester.ExpectUniqueSample( histogram_tester.ExpectUniqueSample(
"CompositorLatency.SendBeginMainFrameToCommit.Paint", "CompositorLatency.SendBeginMainFrameToCommit.CompositingAssignments",
base::TimeDelta::FromMicroseconds(4).InMilliseconds(), 1); base::TimeDelta::FromMicroseconds(4).InMilliseconds(), 1);
histogram_tester.ExpectUniqueSample( histogram_tester.ExpectUniqueSample(
"CompositorLatency.SendBeginMainFrameToCommit.ScrollingCoordinator", "CompositorLatency.SendBeginMainFrameToCommit.Paint",
base::TimeDelta::FromMicroseconds(3).InMilliseconds(), 1); base::TimeDelta::FromMicroseconds(3).InMilliseconds(), 1);
histogram_tester.ExpectUniqueSample( histogram_tester.ExpectUniqueSample(
"CompositorLatency.SendBeginMainFrameToCommit.CompositeCommit", "CompositorLatency.SendBeginMainFrameToCommit.CompositeCommit",
...@@ -1153,9 +1149,6 @@ TEST_F(CompositorFrameReportingControllerTest, ...@@ -1153,9 +1149,6 @@ TEST_F(CompositorFrameReportingControllerTest,
blink_breakdown_copy.compositing_assignments}, blink_breakdown_copy.compositing_assignments},
{"EventLatency.TouchPressed.SendBeginMainFrameToCommit.Paint", {"EventLatency.TouchPressed.SendBeginMainFrameToCommit.Paint",
blink_breakdown_copy.paint}, blink_breakdown_copy.paint},
{"EventLatency.TouchPressed.SendBeginMainFrameToCommit."
"ScrollingCoordinator",
blink_breakdown_copy.scrolling_coordinator},
{"EventLatency.TouchPressed.SendBeginMainFrameToCommit.CompositeCommit", {"EventLatency.TouchPressed.SendBeginMainFrameToCommit.CompositeCommit",
blink_breakdown_copy.composite_commit}, blink_breakdown_copy.composite_commit},
{"EventLatency.TouchPressed.SendBeginMainFrameToCommit.UpdateLayers", {"EventLatency.TouchPressed.SendBeginMainFrameToCommit.UpdateLayers",
......
...@@ -195,10 +195,6 @@ LocalFrameUkmAggregator::GetBeginMainFrameMetrics() { ...@@ -195,10 +195,6 @@ LocalFrameUkmAggregator::GetBeginMainFrameMetrics() {
metrics_data->paint = metrics_data->paint =
main_frame_percentage_records_[static_cast<unsigned>(MetricId::kPaint)] main_frame_percentage_records_[static_cast<unsigned>(MetricId::kPaint)]
.interval_duration; .interval_duration;
metrics_data->scrolling_coordinator =
main_frame_percentage_records_[static_cast<unsigned>(
MetricId::kScrollingCoordinator)]
.interval_duration;
metrics_data->composite_commit = metrics_data->composite_commit =
main_frame_percentage_records_[static_cast<unsigned>( main_frame_percentage_records_[static_cast<unsigned>(
MetricId::kCompositingCommit)] MetricId::kCompositingCommit)]
...@@ -431,7 +427,6 @@ void LocalFrameUkmAggregator::ReportPreFCPEvent() { ...@@ -431,7 +427,6 @@ void LocalFrameUkmAggregator::ReportPreFCPEvent() {
CASE_FOR_ID(Layout); CASE_FOR_ID(Layout);
CASE_FOR_ID(ForcedStyleAndLayout); CASE_FOR_ID(ForcedStyleAndLayout);
CASE_FOR_ID(HitTestDocumentUpdate); CASE_FOR_ID(HitTestDocumentUpdate);
CASE_FOR_ID(ScrollingCoordinator);
CASE_FOR_ID(HandleInputEvents); CASE_FOR_ID(HandleInputEvents);
CASE_FOR_ID(Animate); CASE_FOR_ID(Animate);
CASE_FOR_ID(UpdateLayers); CASE_FOR_ID(UpdateLayers);
...@@ -477,7 +472,6 @@ void LocalFrameUkmAggregator::ReportUpdateTimeEvent() { ...@@ -477,7 +472,6 @@ void LocalFrameUkmAggregator::ReportUpdateTimeEvent() {
CASE_FOR_ID(Layout, i); CASE_FOR_ID(Layout, i);
CASE_FOR_ID(ForcedStyleAndLayout, i); CASE_FOR_ID(ForcedStyleAndLayout, i);
CASE_FOR_ID(HitTestDocumentUpdate, i); CASE_FOR_ID(HitTestDocumentUpdate, i);
CASE_FOR_ID(ScrollingCoordinator, i);
CASE_FOR_ID(HandleInputEvents, i); CASE_FOR_ID(HandleInputEvents, i);
CASE_FOR_ID(Animate, i); CASE_FOR_ID(Animate, i);
CASE_FOR_ID(UpdateLayers, i); CASE_FOR_ID(UpdateLayers, i);
......
...@@ -125,8 +125,8 @@ class CORE_EXPORT LocalFrameUkmAggregator ...@@ -125,8 +125,8 @@ class CORE_EXPORT LocalFrameUkmAggregator
: public RefCounted<LocalFrameUkmAggregator> { : public RefCounted<LocalFrameUkmAggregator> {
public: public:
// Changing these values requires changing the names of metrics specified // Changing these values requires changing the names of metrics specified
// below. For every metric name added here, add an entry in the // below. For every metric name added here, add an entry in the array in
// metric_strings_ array below. // metrics_data() below.
enum MetricId { enum MetricId {
kCompositingAssignments, kCompositingAssignments,
kCompositingCommit, kCompositingCommit,
...@@ -139,7 +139,6 @@ class CORE_EXPORT LocalFrameUkmAggregator ...@@ -139,7 +139,6 @@ class CORE_EXPORT LocalFrameUkmAggregator
kLayout, kLayout,
kForcedStyleAndLayout, kForcedStyleAndLayout,
kHitTestDocumentUpdate, kHitTestDocumentUpdate,
kScrollingCoordinator,
kHandleInputEvents, kHandleInputEvents,
kAnimate, kAnimate,
kUpdateLayers, kUpdateLayers,
...@@ -173,7 +172,6 @@ class CORE_EXPORT LocalFrameUkmAggregator ...@@ -173,7 +172,6 @@ class CORE_EXPORT LocalFrameUkmAggregator
{"Layout", true}, {"Layout", true},
{"ForcedStyleAndLayout", true}, {"ForcedStyleAndLayout", true},
{"HitTestDocumentUpdate", true}, {"HitTestDocumentUpdate", true},
{"ScrollingCoordinator", true},
{"HandleInputEvents", true}, {"HandleInputEvents", true},
{"Animate", true}, {"Animate", true},
{"UpdateLayers", false}, {"UpdateLayers", false},
......
...@@ -308,8 +308,6 @@ TEST_F(LocalFrameUkmAggregatorTest, LatencyDataIsPopulated) { ...@@ -308,8 +308,6 @@ TEST_F(LocalFrameUkmAggregatorTest, LatencyDataIsPopulated) {
EXPECT_EQ(metrics_data->compositing_assignments.InMillisecondsF(), EXPECT_EQ(metrics_data->compositing_assignments.InMillisecondsF(),
millisecond_for_step); millisecond_for_step);
EXPECT_EQ(metrics_data->paint.InMillisecondsF(), millisecond_for_step); EXPECT_EQ(metrics_data->paint.InMillisecondsF(), millisecond_for_step);
EXPECT_EQ(metrics_data->scrolling_coordinator.InMillisecondsF(),
millisecond_for_step);
EXPECT_EQ(metrics_data->composite_commit.InMillisecondsF(), EXPECT_EQ(metrics_data->composite_commit.InMillisecondsF(),
millisecond_for_step); millisecond_for_step);
// Do not check the value in metrics_data.update_layers because it // Do not check the value in metrics_data.update_layers because it
......
...@@ -1316,7 +1316,11 @@ reviews. Googlers can read more about this at go/gwsq-gerrit. ...@@ -1316,7 +1316,11 @@ reviews. Googlers can read more about this at go/gwsq-gerrit.
</histogram> </histogram>
<histogram base="true" name="Blink.MainFrame.ScrollingCoordinatorRatio" <histogram base="true" name="Blink.MainFrame.ScrollingCoordinatorRatio"
units="%" expires_after="2020-11-08"> units="%" expires_after="M88">
<obsolete>
Merged into Blink.MainFrame.CompositingCommitRatio in
http://crrev.com/815947 in M88.
</obsolete>
<owner>schenney@chromium.org</owner> <owner>schenney@chromium.org</owner>
<owner>paint-dev@chromium.org</owner> <owner>paint-dev@chromium.org</owner>
<!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" --> <!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
...@@ -1638,7 +1642,11 @@ reviews. Googlers can read more about this at go/gwsq-gerrit. ...@@ -1638,7 +1642,11 @@ reviews. Googlers can read more about this at go/gwsq-gerrit.
</histogram> </histogram>
<histogram name="Blink.ScrollingCoordinator.UpdateTime" units="microseconds" <histogram name="Blink.ScrollingCoordinator.UpdateTime" units="microseconds"
expires_after="2021-03-21"> expires_after="M88">
<obsolete>
Merged into Blink.CompositingCommit.UpdateTime in http://crrev.com/815947 in
M88.
</obsolete>
<!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" --> <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" -->
<!-- Name completed by histogram_suffixes name="BlinkUpdateTimePostFCPSuffixes" --> <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePostFCPSuffixes" -->
......
...@@ -2027,6 +2027,9 @@ be describing additional metrics about the same event. ...@@ -2027,6 +2027,9 @@ be describing additional metrics about the same event.
</summary> </summary>
</metric> </metric>
<metric name="ScrollingCoordinator"> <metric name="ScrollingCoordinator">
<obsolete>
Merged into CompositingCommit in http://crrev.com/815947 in M88.
</obsolete>
<summary> <summary>
The time spent in ScrollingCoordinator, between navigation and First The time spent in ScrollingCoordinator, between navigation and First
Contentful Paint, in microseconds. Contentful Paint, in microseconds.
...@@ -2819,6 +2822,9 @@ be describing additional metrics about the same event. ...@@ -2819,6 +2822,9 @@ be describing additional metrics about the same event.
</summary> </summary>
</metric> </metric>
<metric name="ScrollingCoordinator"> <metric name="ScrollingCoordinator">
<obsolete>
Merged into CompositingCommit in http://crrev.com/815947 in M88.
</obsolete>
<summary> <summary>
The time taken for scrolling coordinator for the main frame in The time taken for scrolling coordinator for the main frame in
microseconds during the sampled frame. microseconds during the sampled frame.
...@@ -2879,6 +2885,9 @@ be describing additional metrics about the same event. ...@@ -2879,6 +2885,9 @@ be describing additional metrics about the same event.
</summary> </summary>
</metric> </metric>
<metric name="ScrollingCoordinatorPercentage"> <metric name="ScrollingCoordinatorPercentage">
<obsolete>
Merged into CompositingCommitPercentage in http://crrev.com/815947 in M88.
</obsolete>
<summary> <summary>
The percentage of the main frame time used in scrolling coordinator. An The percentage of the main frame time used in scrolling coordinator. An
int in the range [0,100]. int in the range [0,100].
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment