Skip to content

Commit a587a64

Browse files
committed
Bug 1928001 [wpt PR 48877] - webnn: Deprecate MLOperand members in favor of readonly attributes, a=testonly
Automatic update from web-platform-tests webnn: Deprecate MLOperand members in favor of readonly attributes As proposed in webmachinelearning/webnn#666 Bug: 365813262 Cq-Include-Trybots: luci.chromium.try​:mac14-blink-rel,win11-blink-rel Change-Id: I1fb29ee349ee527a574dc7e135200f8e774d709b Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5975719 Auto-Submit: Austin Sullivan <asullychromium.org> Reviewed-by: ningxin hu <ningxin.huintel.com> Commit-Queue: ningxin hu <ningxin.huintel.com> Cr-Commit-Position: refs/heads/main{#1375719} -- wpt-commits: 88b1811adb9a1983fce2908aba6f44261903eea2 wpt-pr: 48877 UltraBlame original commit: 3a506099528bb52152dddf0ee14408935452eef5
1 parent 96203e6 commit a587a64

Some content is hidden

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

45 files changed

+116
-116
lines changed

testing/web-platform/tests/webnn/resources/utils.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const getSoftmaxPrecisionTolerance =
2626
if (inputs[inputIndex]) {
2727
inputShape = inputs[inputIndex].descriptor.shape;
2828
} else {
29-
inputShape = intermediateOperands[inputIndex].shape();
29+
inputShape = intermediateOperands[inputIndex].shape;
3030
}
3131
const axis = args.length === 2 ? args[1][Object.keys(args[1])[0]] : 1;
3232
const tolerance = inputShape[axis] * 3 + 3;
@@ -132,10 +132,10 @@ const assertDescriptorsEquals = (outputOperand, expected) => {
132132
const dataType =
133133
expected.castedType ? expected.castedType : expected.dataType;
134134
assert_true(
135-
outputOperand.dataType() === dataType,
135+
outputOperand.dataType === dataType,
136136
'actual output dataType should be equal to expected output dataType');
137137
assert_array_equals(
138-
outputOperand.shape(), expected.shape,
138+
outputOperand.shape, expected.shape,
139139
'actual output shape should be equal to expected output shape');
140140
};
141141

@@ -634,7 +634,7 @@ const getGemmPrecisionTolerance =
634634
if (inputs[indexA]) {
635635
ShapeA = inputs[indexA].descriptor.shape;
636636
} else {
637-
ShapeA = intermediateOperands[indexA].shape();
637+
ShapeA = intermediateOperands[indexA].shape;
638638
}
639639
const options =
640640
args.length === 3 ? {...args[2][Object.keys(args[2])[0]]} : {};
@@ -671,13 +671,13 @@ const getConv2dPrecisionTolerance =
671671
if (inputs[inputIndex]) {
672672
inputShape = inputs[inputIndex].descriptor.shape;
673673
} else {
674-
inputShape = intermediateOperands[inputIndex].shape();
674+
inputShape = intermediateOperands[inputIndex].shape;
675675
}
676676
let filterShape;
677677
if (inputs[filterIndex]) {
678678
filterShape = inputs[filterIndex].descriptor.shape;
679679
} else {
680-
filterShape = intermediateOperands[filterIndex].shape();
680+
filterShape = intermediateOperands[filterIndex].shape;
681681
}
682682
const options =
683683
args.length === 3 ? {...args[2][Object.keys(args[2])[0]]} : {};

testing/web-platform/tests/webnn/resources/utils_validation.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -438,8 +438,8 @@ function validateUnaryOperation(operationName, supportedDataTypes, label) {
438438
const input = builder.input(`input`, {dataType, shape});
439439
assert_equals(typeof builder[operationName], 'function');
440440
const output = builder[operationName](input);
441-
assert_equals(output.dataType(), dataType);
442-
assert_array_equals(output.shape(), shape);
441+
assert_equals(output.dataType, dataType);
442+
assert_array_equals(output.shape, shape);
443443
}
444444
}
445445
}, `[${operationName}] Test building an unary operator with supported type.`);
@@ -484,8 +484,8 @@ function validateSingleInputOperation(operationName, label) {
484484
for (let shape of allWebNNShapesArray) {
485485
const input = builder.input(`input`, {dataType, shape});
486486
const output = builder[operationName](input);
487-
assert_equals(output.dataType(), dataType);
488-
assert_array_equals(output.shape(), shape);
487+
assert_equals(output.dataType, dataType);
488+
assert_array_equals(output.shape, shape);
489489
}
490490
}
491491
}, `[${operationName}] Test building the operator with supported data type.`);

testing/web-platform/tests/webnn/validation_tests/argMinMax.https.any.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ function runTests(operatorName, tests) {
7474
if (context.opSupportLimits()[operatorName].output.dataTypes.includes(
7575
test.options.outputDataType)) {
7676
const output = builder[operatorName](input, axis, test.options);
77-
assert_equals(output.dataType(), test.options.outputDataType);
78-
assert_array_equals(output.shape(), test.output.shape);
77+
assert_equals(output.dataType, test.options.outputDataType);
78+
assert_array_equals(output.shape, test.output.shape);
7979
} else {
8080
assert_throws_js(
8181
TypeError, () => builder[operatorName](input, axis, test.options));
@@ -84,8 +84,8 @@ function runTests(operatorName, tests) {
8484
}
8585
if (test.output) {
8686
const output = builder[operatorName](input, axis, test.options);
87-
assert_equals(output.dataType(), 'int32');
88-
assert_array_equals(output.shape(), test.output.shape);
87+
assert_equals(output.dataType, 'int32');
88+
assert_array_equals(output.shape, test.output.shape);
8989
} else {
9090
const regrexp = /\[arg_min_max_1_\!\]/;
9191
assert_throws_with_label(

testing/web-platform/tests/webnn/validation_tests/batchNormalization.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,8 @@ tests.forEach(
267267
if (test.output) {
268268
const output =
269269
builder.batchNormalization(input, mean, variance, test.options);
270-
assert_equals(output.dataType(), test.output.dataType);
271-
assert_array_equals(output.shape(), test.output.shape);
270+
assert_equals(output.dataType, test.output.dataType);
271+
assert_array_equals(output.shape, test.output.shape);
272272
} else {
273273
const regrexp = /\[batchNormalization_\?_123\]/;
274274
assert_throws_with_label(

testing/web-platform/tests/webnn/validation_tests/clamp.https.any.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ promise_test(async t => {
1818
const options = {minValue: 1.0, maxValue: 3.0};
1919
const input = builder.input('input', {dataType: 'float32', shape: [1, 2, 3]});
2020
const output = builder.clamp(input, options);
21-
assert_equals(output.dataType(), 'float32');
22-
assert_array_equals(output.shape(), [1, 2, 3]);
21+
assert_equals(output.dataType, 'float32');
22+
assert_array_equals(output.shape, [1, 2, 3]);
2323
}, '[clamp] Build with options');
2424

2525
promise_test(async t => {
@@ -28,8 +28,8 @@ promise_test(async t => {
2828
const input =
2929
builder.input('input', {dataType: 'float32', shape: [1, 2, 3, 4]});
3030
const output = builder.clamp(input, options);
31-
assert_equals(output.dataType(), 'float32');
32-
assert_array_equals(output.shape(), [1, 2, 3, 4]);
31+
assert_equals(output.dataType, 'float32');
32+
assert_array_equals(output.shape, [1, 2, 3, 4]);
3333
}, '[clamp] Build with options.minValue == options.maxValue');
3434

3535
promise_test(async t => {

testing/web-platform/tests/webnn/validation_tests/concat.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ tests.forEach(
9797
}
9898
if (test.output) {
9999
const output = builder.concat(inputs, test.axis);
100-
assert_equals(output.dataType(), test.output.dataType);
101-
assert_array_equals(output.shape(), test.output.shape);
100+
assert_equals(output.dataType, test.output.dataType);
101+
assert_array_equals(output.shape, test.output.shape);
102102
} else {
103103
const options = {label};
104104
const regrexp = new RegExp('\\[' + label + '\\]');

testing/web-platform/tests/webnn/validation_tests/constant.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,8 @@ tests.forEach(
129129
const bufferView = new test.bufferView.type(buffer);
130130
if (test.output) {
131131
const constantOperand = builder.constant(test.descriptor, bufferView);
132-
assert_equals(constantOperand.dataType(), test.output.dataType);
133-
assert_array_equals(constantOperand.shape(), test.output.shape);
132+
assert_equals(constantOperand.dataType, test.output.dataType);
133+
assert_array_equals(constantOperand.shape, test.output.shape);
134134
} else {
135135
assert_throws_js(
136136
TypeError, () => builder.constant(test.descriptor, bufferView));

testing/web-platform/tests/webnn/validation_tests/conv2d.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -550,8 +550,8 @@ tests.forEach(
550550
context.opSupportLimits().conv2d.input.dataTypes.includes(
551551
test.input.dataType)) {
552552
const output = builder.conv2d(input, filter, test.options);
553-
assert_equals(output.dataType(), test.output.dataType);
554-
assert_array_equals(output.shape(), test.output.shape);
553+
assert_equals(output.dataType, test.output.dataType);
554+
assert_array_equals(output.shape, test.output.shape);
555555
} else {
556556
const regrexp = /\[conv_2d_\*\]/;
557557
assert_throws_with_label(

testing/web-platform/tests/webnn/validation_tests/convTranspose2d.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -565,8 +565,8 @@ tests.forEach(
565565
context.opSupportLimits().convTranspose2d.input.dataTypes.includes(
566566
test.input.dataType)) {
567567
const output = builder.convTranspose2d(input, filter, test.options);
568-
assert_equals(output.dataType(), test.output.dataType);
569-
assert_array_equals(output.shape(), test.output.shape);
568+
assert_equals(output.dataType, test.output.dataType);
569+
assert_array_equals(output.shape, test.output.shape);
570570
} else {
571571
const regrexp = new RegExp('\\[' + label + '\\]');
572572
assert_throws_with_label(

testing/web-platform/tests/webnn/validation_tests/cumulativeSum.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ tests.forEach(
6262
}
6363
if (test.output) {
6464
const output = builder.cumulativeSum(input, test.axis, options);
65-
assert_equals(output.dataType(), test.output.dataType);
66-
assert_array_equals(output.shape(), test.output.shape);
65+
assert_equals(output.dataType, test.output.dataType);
66+
assert_array_equals(output.shape, test.output.shape);
6767
} else {
6868
const label = 'cumulative_sum';
6969
options.label = label;

testing/web-platform/tests/webnn/validation_tests/dequantizeLinear.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ tests.forEach(
8383
const zeroPoint = builder.input('zeroPoint', test.zeroPoint);
8484
if (test.output) {
8585
const output = builder.dequantizeLinear(input, scale, zeroPoint);
86-
assert_equals(output.dataType(), test.output.dataType);
87-
assert_array_equals(output.shape(), test.output.shape);
86+
assert_equals(output.dataType, test.output.dataType);
87+
assert_array_equals(output.shape, test.output.shape);
8888
} else {
8989
const label = 'dequantize_linear_123';
9090
const options = {label};

testing/web-platform/tests/webnn/validation_tests/elementwise-binary.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ function runElementWiseBinaryTests(operatorName, tests) {
7373

7474
if (test.output) {
7575
const output = builder[operatorName](a, b);
76-
assert_equals(output.dataType(), test.output.dataType);
77-
assert_array_equals(output.shape(), test.output.shape);
76+
assert_equals(output.dataType, test.output.dataType);
77+
assert_array_equals(output.shape, test.output.shape);
7878
} else {
7979
const options = {label};
8080
assert_throws_with_label(

testing/web-platform/tests/webnn/validation_tests/elu.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ promise_test(async t => {
1919
const options = {alpha: 1.0};
2020
const input = builder.input('input', {dataType: 'float32', shape: [1, 2, 3]});
2121
const output = builder.elu(input, options);
22-
assert_equals(output.dataType(), 'float32');
23-
assert_array_equals(output.shape(), [1, 2, 3]);
22+
assert_equals(output.dataType, 'float32');
23+
assert_array_equals(output.shape, [1, 2, 3]);
2424
}, '[elu] Build with options');
2525

2626
promise_test(async t => {

testing/web-platform/tests/webnn/validation_tests/expand.https.any.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ tests.forEach(
7171

7272
if (test.output) {
7373
const output = builder.expand(input, test.newShape);
74-
assert_equals(output.dataType(), test.output.dataType);
75-
assert_array_equals(output.shape(), test.output.shape);
74+
assert_equals(output.dataType, test.output.dataType);
75+
assert_array_equals(output.shape, test.output.shape);
7676
} else {
7777
const options = {...test.options};
7878
if (options.label) {
@@ -97,8 +97,8 @@ promise_test(async t => {
9797
const input = builder.input(`input`, {dataType, shape});
9898
if (context.opSupportLimits().expand.input.dataTypes.includes(dataType)) {
9999
const output = builder.expand(input, newShape);
100-
assert_equals(output.dataType(), dataType);
101-
assert_array_equals(output.shape(), newShape);
100+
assert_equals(output.dataType, dataType);
101+
assert_array_equals(output.shape, newShape);
102102
} else {
103103
assert_throws_js(TypeError, () => builder.expand(input, newShape));
104104
}

testing/web-platform/tests/webnn/validation_tests/gather.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ tests.forEach(
7474

7575
if (test.output) {
7676
const output = builder.gather(input, indices, options);
77-
assert_equals(output.dataType(), test.output.dataType);
78-
assert_array_equals(output.shape(), test.output.shape);
77+
assert_equals(output.dataType, test.output.dataType);
78+
assert_array_equals(output.shape, test.output.shape);
7979
} else {
8080
const label = 'gather_'
8181
options.label = label;

testing/web-platform/tests/webnn/validation_tests/gatherElements.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ tests.forEach(
6464

6565
if (test.output) {
6666
const output = builder.gatherElements(input, indices, options);
67-
assert_equals(output.dataType(), test.output.dataType);
68-
assert_array_equals(output.shape(), test.output.shape);
67+
assert_equals(output.dataType, test.output.dataType);
68+
assert_array_equals(output.shape, test.output.shape);
6969
} else {
7070
const label = 'gatherElements_'
7171
options.label = label;

testing/web-platform/tests/webnn/validation_tests/gatherND.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ tests.forEach(test => promise_test(async t => {
4646
context.opSupportLimits().gatherND.input.dataTypes.includes(
4747
test.input.dataType)) {
4848
const output = builder.gatherND(input, indices);
49-
assert_equals(output.dataType(), test.output.dataType);
50-
assert_array_equals(output.shape(), test.output.shape);
49+
assert_equals(output.dataType, test.output.dataType);
50+
assert_array_equals(output.shape, test.output.shape);
5151
} else {
5252
const label = 'gatherND_';
5353
const options = {label: label};

testing/web-platform/tests/webnn/validation_tests/gemm.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,8 @@ tests.forEach(
164164
}
165165
if (test.output) {
166166
const output = builder.gemm(a, b, test.options);
167-
assert_equals(output.dataType(), test.output.dataType);
168-
assert_array_equals(output.shape(), test.output.shape);
167+
assert_equals(output.dataType, test.output.dataType);
168+
assert_array_equals(output.shape, test.output.shape);
169169
} else {
170170
const regrexp = new RegExp('\\[' + label + '\\]');
171171
assert_throws_with_label(

testing/web-platform/tests/webnn/validation_tests/gru.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -300,8 +300,8 @@ tests.forEach(
300300
options);
301301
assert_equals(outputs.length, test.outputs.length);
302302
for (let i = 0; i < outputs.length; ++i) {
303-
assert_equals(outputs[i].dataType(), test.outputs[i].dataType);
304-
assert_array_equals(outputs[i].shape(), test.outputs[i].shape);
303+
assert_equals(outputs[i].dataType, test.outputs[i].dataType);
304+
assert_array_equals(outputs[i].shape, test.outputs[i].shape);
305305
}
306306
} else {
307307
const label = 'gru_xxx';

testing/web-platform/tests/webnn/validation_tests/gruCell.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,8 @@ tests.forEach(
298298
const output = builder.gruCell(
299299
input, weight, recurrentWeight, hiddenState, test.hiddenSize,
300300
options);
301-
assert_equals(output.dataType(), test.output.dataType);
302-
assert_array_equals(output.shape(), test.output.shape);
301+
assert_equals(output.dataType, test.output.dataType);
302+
assert_array_equals(output.shape, test.output.shape);
303303
} else {
304304
const label = 'gru_cell_xxx';
305305
options.label = label;

testing/web-platform/tests/webnn/validation_tests/hardSigmoid.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ promise_test(async t => {
1818
const options = {alpha: 0.5, beta: 1.0};
1919
const input = builder.input('input', {dataType: 'float16', shape: [1, 2, 3]});
2020
const output = builder.hardSigmoid(input, options);
21-
assert_equals(output.dataType(), 'float16');
22-
assert_array_equals(output.shape(), [1, 2, 3]);
21+
assert_equals(output.dataType, 'float16');
22+
assert_array_equals(output.shape, [1, 2, 3]);
2323
}, '[hardSigmoid] Test building with options');
2424

2525
promise_test(async t => {

testing/web-platform/tests/webnn/validation_tests/input.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ tests.forEach(
5858
const builder = new MLGraphBuilder(context);
5959
if (test.output) {
6060
const inputOperand = builder.input(test.name, test.descriptor);
61-
assert_equals(inputOperand.dataType(), test.output.dataType);
62-
assert_array_equals(inputOperand.shape(), test.output.shape);
61+
assert_equals(inputOperand.dataType, test.output.dataType);
62+
assert_array_equals(inputOperand.shape, test.output.shape);
6363
} else {
6464
assert_throws_js(
6565
TypeError, () => builder.input(test.name, test.descriptor));

testing/web-platform/tests/webnn/validation_tests/instanceNormalization.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,8 @@ tests.forEach(
193193
.instanceNormalization.input.dataTypes.includes(
194194
test.input.dataType)) {
195195
const output = builder.instanceNormalization(input, test.options);
196-
assert_equals(output.dataType(), test.output.dataType);
197-
assert_array_equals(output.shape(), test.output.shape);
196+
assert_equals(output.dataType, test.output.dataType);
197+
assert_array_equals(output.shape, test.output.shape);
198198
} else {
199199
const regrexp = new RegExp('\\[' + label + '\\]');
200200
assert_throws_with_label(

testing/web-platform/tests/webnn/validation_tests/layerNormalization.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,8 @@ tests.forEach(
210210
context.opSupportLimits().layerNormalization.input.dataTypes.includes(
211211
test.input.dataType)) {
212212
const output = builder.layerNormalization(input, test.options);
213-
assert_equals(output.dataType(), test.output.dataType);
214-
assert_array_equals(output.shape(), test.output.shape);
213+
assert_equals(output.dataType, test.output.dataType);
214+
assert_array_equals(output.shape, test.output.shape);
215215
} else {
216216
const regrexp = new RegExp('\\[' + label + '\\]');
217217
assert_throws_with_label(

testing/web-platform/tests/webnn/validation_tests/leakyRelu.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ promise_test(async t => {
1717
const options = {alpha: 0.02};
1818
const input = builder.input('input', {dataType: 'float32', shape: [1, 2, 3]});
1919
const output = builder.leakyRelu(input, options);
20-
assert_equals(output.dataType(), 'float32');
21-
assert_array_equals(output.shape(), [1, 2, 3]);
20+
assert_equals(output.dataType, 'float32');
21+
assert_array_equals(output.shape, [1, 2, 3]);
2222
}, '[leakyRelu] Build with options');
2323

2424
promise_test(async t => {

testing/web-platform/tests/webnn/validation_tests/linear.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ promise_test(async t => {
1717
const options = {alpha: 1.5, beta: 0.3};
1818
const input = builder.input('input', {dataType: 'float32', shape: [1, 2, 3]});
1919
const output = builder.linear(input, options);
20-
assert_equals(output.dataType(), 'float32');
21-
assert_array_equals(output.shape(), [1, 2, 3]);
20+
assert_equals(output.dataType, 'float32');
21+
assert_array_equals(output.shape, [1, 2, 3]);
2222
}, '[linear] Build with options');
2323

2424
promise_test(async t => {

testing/web-platform/tests/webnn/validation_tests/lstm.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -296,8 +296,8 @@ tests.forEach(
296296
options);
297297
assert_equals(outputs.length, test.outputs.length);
298298
for (let i = 0; i < outputs.length; ++i) {
299-
assert_equals(outputs[i].dataType(), test.outputs[i].dataType);
300-
assert_array_equals(outputs[i].shape(), test.outputs[i].shape);
299+
assert_equals(outputs[i].dataType, test.outputs[i].dataType);
300+
assert_array_equals(outputs[i].shape, test.outputs[i].shape);
301301
}
302302
} else {
303303
const label = 'lstm_xxx';

testing/web-platform/tests/webnn/validation_tests/lstmCell.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -523,8 +523,8 @@ tests.forEach(
523523
test.hiddenSize, options);
524524
assert_equals(outputs.length, test.outputs.length);
525525
for (let i = 0; i < outputs.length; ++i) {
526-
assert_equals(outputs[i].dataType(), test.outputs[i].dataType);
527-
assert_array_equals(outputs[i].shape(), test.outputs[i].shape);
526+
assert_equals(outputs[i].dataType, test.outputs[i].dataType);
527+
assert_array_equals(outputs[i].shape, test.outputs[i].shape);
528528
}
529529
} else {
530530
const label = 'lstm_cell_xxx';

testing/web-platform/tests/webnn/validation_tests/matmul.https.any.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ tests.forEach(test => promise_test(async t => {
109109
const inputB = builder.input('b', test.inputs.b);
110110
if (test.output) {
111111
const output = builder.matmul(inputA, inputB);
112-
assert_equals(output.dataType(), test.output.dataType);
113-
assert_array_equals(output.shape(), test.output.shape);
112+
assert_equals(output.dataType, test.output.dataType);
113+
assert_array_equals(output.shape, test.output.shape);
114114
} else {
115115
const label = 'matmul_123';
116116
const options = {label};

0 commit comments

Comments
 (0)