@zohodesk/testinglibrary 0.1.8-eslint-27 → 0.1.8-eslint-28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lint-ci/eslintLintStage.js +13 -27
- package/build/lint-ci/getModifieldLines.js +46 -0
- package/build/lint-ci/sonarReportSummary.js +1 -1
- package/build/lint-ci/startSever-sonarQube.js +2 -8
- package/npm-shrinkwrap.json +1 -99
- package/package.json +3 -2
- package/.vscode/settings.json +0 -1
- package/build/lint-ci/java-jar/IDEMessagePluginRecent.jar +0 -0
|
@@ -16,6 +16,7 @@ var _path = _interopRequireDefault(require("path"));
|
|
|
16
16
|
var _logger = require("../utils/logger");
|
|
17
17
|
var _cliArgsToObject = require("../utils/cliArgsToObject");
|
|
18
18
|
var _fileUtils = require("../utils/fileUtils");
|
|
19
|
+
var _getModifieldLines = require("./getModifieldLines");
|
|
19
20
|
// import { requestJAR } from './requestJarAPI';
|
|
20
21
|
async function runEslintForDiff(cliParams, options = {}) {
|
|
21
22
|
// $(git diff --name-only HEAD HEAD~1 | grep -E '\.(js|jsx)$' | xargs)
|
|
@@ -73,15 +74,15 @@ function filterReportBasedDiff(resultJson, diffJson) {
|
|
|
73
74
|
resultJson = resultJson.filter(result => {
|
|
74
75
|
var _impactLineMap$get;
|
|
75
76
|
const isImpactFile = result.filePath;
|
|
76
|
-
if (isImpactFile
|
|
77
|
+
if (!isImpactFile) {
|
|
77
78
|
return false;
|
|
78
79
|
}
|
|
79
|
-
if (
|
|
80
|
+
if (isImpactFile.includes('.feature')) {
|
|
80
81
|
return false;
|
|
81
82
|
}
|
|
82
83
|
if (((_impactLineMap$get = impactLineMap.get(isImpactFile)) === null || _impactLineMap$get === void 0 ? void 0 : _impactLineMap$get.length) !== 0) {
|
|
83
84
|
result.messages = result.messages.filter(errorMsg => {
|
|
84
|
-
if (impactLineMap.get(isImpactFile).includes(
|
|
85
|
+
if (impactLineMap.get(isImpactFile).includes(errorMsg.line)) {
|
|
85
86
|
return true;
|
|
86
87
|
}
|
|
87
88
|
return false;
|
|
@@ -96,18 +97,19 @@ function filterDiffJson(diffJson) {
|
|
|
96
97
|
var _diffJson$diffs;
|
|
97
98
|
const diffFilesMap = new Map();
|
|
98
99
|
diffJson === null || diffJson === void 0 || (_diffJson$diffs = diffJson.diffs) === null || _diffJson$diffs === void 0 || _diffJson$diffs.forEach(diff => {
|
|
99
|
-
const diffMatch = [];
|
|
100
|
-
const regex = /@@(.*?)@@/g;
|
|
101
|
-
let match;
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
100
|
+
// const diffMatch = [];
|
|
101
|
+
// const regex = /@@(.*?)@@/g;
|
|
102
|
+
// let match;
|
|
103
|
+
// console.log('=>', regex.exec(diff.diff));
|
|
104
|
+
// while ((match = regex.exec(diff.diff)) !== null) {
|
|
105
|
+
// diffMatch.push(...splitFilterNumber(match[1]));
|
|
106
|
+
// }
|
|
105
107
|
const diffPathKey = _path.default.resolve(getRootLintPath(), diff.new_path);
|
|
106
108
|
if (diffPathKey === undefined) {
|
|
107
109
|
return;
|
|
108
110
|
}
|
|
109
111
|
if (diffPathKey) {
|
|
110
|
-
diffFilesMap.set(diffPathKey,
|
|
112
|
+
diffFilesMap.set(diffPathKey, (0, _getModifieldLines.getModifiedLines)(diff.diff.toString()).modifiedLines);
|
|
111
113
|
}
|
|
112
114
|
});
|
|
113
115
|
return diffFilesMap;
|
|
@@ -115,14 +117,6 @@ function filterDiffJson(diffJson) {
|
|
|
115
117
|
function getRootDir() {
|
|
116
118
|
return process.cwd();
|
|
117
119
|
}
|
|
118
|
-
function getPathFromTestDir(diffPath) {
|
|
119
|
-
if (!diffPath.includes('uat')) {
|
|
120
|
-
return undefined;
|
|
121
|
-
}
|
|
122
|
-
const indexOfDiff = diffPath.split('/').indexOf('uat');
|
|
123
|
-
const diffActualPath = diffPath.split('/').slice(indexOfDiff).join('/');
|
|
124
|
-
return diffActualPath;
|
|
125
|
-
}
|
|
126
120
|
function splitFilterNumber(numberString) {
|
|
127
121
|
var resultedNum = [];
|
|
128
122
|
numberString.split(' ').join(',').split(',').filter(element => {
|
|
@@ -169,12 +163,4 @@ function getRootLintPath() {
|
|
|
169
163
|
shell: true
|
|
170
164
|
});
|
|
171
165
|
return childProcess.stdout.toString().split('\n').filter(Boolean).pop();
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
// function validateReport() {
|
|
175
|
-
// if (1) {
|
|
176
|
-
// } else {
|
|
177
|
-
// throw new Error('Report Failed');
|
|
178
|
-
// process.exit(1);
|
|
179
|
-
// }
|
|
180
|
-
// }
|
|
166
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getModifiedLines = getModifiedLines;
|
|
7
|
+
var _logger = require("../utils/logger");
|
|
8
|
+
function getModifiedLines(content) {
|
|
9
|
+
var modifiedLines = [];
|
|
10
|
+
var removedLines = [];
|
|
11
|
+
try {
|
|
12
|
+
const diffLineContentIter = content.split('\n');
|
|
13
|
+
let addLineFrom = -1;
|
|
14
|
+
let removeLineFrom = -1;
|
|
15
|
+
let affectedLineNum = 0;
|
|
16
|
+
for (const currentDiffLine of diffLineContentIter) {
|
|
17
|
+
if (currentDiffLine.startsWith('@')) {
|
|
18
|
+
const lineNos = currentDiffLine.split('@@')[1].trim().split(' ');
|
|
19
|
+
const removedLineDetail = lineNos[0].replace(/-/g, '').split(',');
|
|
20
|
+
const addedLineDetail = lineNos[1].replace(/\+/g, '').split(',');
|
|
21
|
+
addLineFrom = parseInt(addedLineDetail[0]);
|
|
22
|
+
removeLineFrom = parseInt(removedLineDetail[0]);
|
|
23
|
+
affectedLineNum = removeLineFrom;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (currentDiffLine.startsWith('+') || currentDiffLine.startsWith('-')) {
|
|
27
|
+
const isLineChanged = currentDiffLine.trim().length > 1;
|
|
28
|
+
if (isLineChanged) {
|
|
29
|
+
modifiedLines.push(affectedLineNum);
|
|
30
|
+
}
|
|
31
|
+
if (currentDiffLine.startsWith('-')) {
|
|
32
|
+
removedLines.push(affectedLineNum);
|
|
33
|
+
}
|
|
34
|
+
if (!currentDiffLine.startsWith('-')) {
|
|
35
|
+
affectedLineNum++;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
} catch (exp) {
|
|
40
|
+
_logger.Logger.log(_logger.Logger.FAILURE_TYPE, 'Exception Occurred');
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
modifiedLines,
|
|
44
|
+
removedLines
|
|
45
|
+
};
|
|
46
|
+
}
|
|
@@ -20,7 +20,7 @@ function getSummaryOfLint(cliParams) {
|
|
|
20
20
|
} = (0, _cliArgsToObject.cliArgsToObject)(cliParams);
|
|
21
21
|
var $projectName = `${repo}_${branch}_${username}`;
|
|
22
22
|
if (lintEnv === 'pre-commit') {
|
|
23
|
-
$projectName = (0, _startSeverSonarQube.getProjectNameFrmGit)()
|
|
23
|
+
$projectName = `${(0, _startSeverSonarQube.getProjectNameFrmGit)()}_pre-commit`;
|
|
24
24
|
}
|
|
25
25
|
return {
|
|
26
26
|
projectName: $projectName,
|
|
@@ -107,14 +107,8 @@ function getRepoName() {
|
|
|
107
107
|
return repoName.pop().split('/').pop().split('.')[0];
|
|
108
108
|
}
|
|
109
109
|
function getBranchName() {
|
|
110
|
-
var branchName = getSpawnOutput('git', [
|
|
111
|
-
|
|
112
|
-
if ($branch.startsWith('*') || $branch.includes('*')) {
|
|
113
|
-
return true;
|
|
114
|
-
}
|
|
115
|
-
return false;
|
|
116
|
-
}).shift();
|
|
117
|
-
return branchName.trim();
|
|
110
|
+
var branchName = getSpawnOutput('git', ["rev-parse", "--abbrev-ref", "HEAD"]); // to get current branch
|
|
111
|
+
return branchName.shift().trim();
|
|
118
112
|
}
|
|
119
113
|
function getSpawnOutput(command, params = []) {
|
|
120
114
|
const demon_process = (0, _child_process.spawnSync)(command, params, {
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zohodesk/testinglibrary",
|
|
3
|
-
"version": "0.1.8
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"lockfileVersion": 1,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"dependencies": {
|
|
@@ -2497,12 +2497,6 @@
|
|
|
2497
2497
|
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz",
|
|
2498
2498
|
"integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA=="
|
|
2499
2499
|
},
|
|
2500
|
-
"adm-zip": {
|
|
2501
|
-
"version": "0.5.12",
|
|
2502
|
-
"resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.12.tgz",
|
|
2503
|
-
"integrity": "sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==",
|
|
2504
|
-
"dev": true
|
|
2505
|
-
},
|
|
2506
2500
|
"agent-base": {
|
|
2507
2501
|
"version": "6.0.2",
|
|
2508
2502
|
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
|
|
@@ -2997,12 +2991,6 @@
|
|
|
2997
2991
|
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
|
2998
2992
|
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
|
|
2999
2993
|
},
|
|
3000
|
-
"color-support": {
|
|
3001
|
-
"version": "1.1.3",
|
|
3002
|
-
"resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
|
|
3003
|
-
"integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
|
|
3004
|
-
"dev": true
|
|
3005
|
-
},
|
|
3006
2994
|
"combined-stream": {
|
|
3007
2995
|
"version": "1.0.8",
|
|
3008
2996
|
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
|
|
@@ -3445,15 +3433,6 @@
|
|
|
3445
3433
|
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz",
|
|
3446
3434
|
"integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA=="
|
|
3447
3435
|
},
|
|
3448
|
-
"fancy-log": {
|
|
3449
|
-
"version": "2.0.0",
|
|
3450
|
-
"resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-2.0.0.tgz",
|
|
3451
|
-
"integrity": "sha512-9CzxZbACXMUXW13tS0tI8XsGGmxWzO2DmYrGuBJOJ8k8q2K7hwfJA5qHjuPPe8wtsco33YR9wc+Rlr5wYFvhSA==",
|
|
3452
|
-
"dev": true,
|
|
3453
|
-
"requires": {
|
|
3454
|
-
"color-support": "^1.1.3"
|
|
3455
|
-
}
|
|
3456
|
-
},
|
|
3457
3436
|
"fast-glob": {
|
|
3458
3437
|
"version": "3.3.1",
|
|
3459
3438
|
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
|
|
@@ -4746,15 +4725,6 @@
|
|
|
4746
4725
|
}
|
|
4747
4726
|
}
|
|
4748
4727
|
},
|
|
4749
|
-
"jest-sonar-reporter": {
|
|
4750
|
-
"version": "2.0.0",
|
|
4751
|
-
"resolved": "https://registry.npmjs.org/jest-sonar-reporter/-/jest-sonar-reporter-2.0.0.tgz",
|
|
4752
|
-
"integrity": "sha512-ZervDCgEX5gdUbdtWsjdipLN3bKJwpxbvhkYNXTAYvAckCihobSLr9OT/IuyNIRT1EZMDDwR6DroWtrq+IL64w==",
|
|
4753
|
-
"dev": true,
|
|
4754
|
-
"requires": {
|
|
4755
|
-
"xml": "^1.0.1"
|
|
4756
|
-
}
|
|
4757
|
-
},
|
|
4758
4728
|
"jest-util": {
|
|
4759
4729
|
"version": "29.7.0",
|
|
4760
4730
|
"resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
|
|
@@ -5149,12 +5119,6 @@
|
|
|
5149
5119
|
"tslib": "^2.0.3"
|
|
5150
5120
|
}
|
|
5151
5121
|
},
|
|
5152
|
-
"node-downloader-helper": {
|
|
5153
|
-
"version": "2.1.9",
|
|
5154
|
-
"resolved": "https://registry.npmjs.org/node-downloader-helper/-/node-downloader-helper-2.1.9.tgz",
|
|
5155
|
-
"integrity": "sha512-FSvAol2Z8UP191sZtsUZwHIN0eGoGue3uEXGdWIH5228e9KH1YHXT7fN8Oa33UGf+FbqGTQg3sJfrRGzmVCaJA==",
|
|
5156
|
-
"dev": true
|
|
5157
|
-
},
|
|
5158
5122
|
"node-environment-flags": {
|
|
5159
5123
|
"version": "1.0.6",
|
|
5160
5124
|
"resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
|
|
@@ -5833,12 +5797,6 @@
|
|
|
5833
5797
|
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
|
|
5834
5798
|
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
|
|
5835
5799
|
},
|
|
5836
|
-
"shell-quote": {
|
|
5837
|
-
"version": "1.8.1",
|
|
5838
|
-
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
|
|
5839
|
-
"integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
|
|
5840
|
-
"dev": true
|
|
5841
|
-
},
|
|
5842
5800
|
"side-channel": {
|
|
5843
5801
|
"version": "1.0.4",
|
|
5844
5802
|
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
|
|
@@ -5865,56 +5823,6 @@
|
|
|
5865
5823
|
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
|
|
5866
5824
|
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
|
|
5867
5825
|
},
|
|
5868
|
-
"slugify": {
|
|
5869
|
-
"version": "1.6.6",
|
|
5870
|
-
"resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz",
|
|
5871
|
-
"integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==",
|
|
5872
|
-
"dev": true
|
|
5873
|
-
},
|
|
5874
|
-
"sonarqube-scanner": {
|
|
5875
|
-
"version": "3.3.0",
|
|
5876
|
-
"resolved": "https://registry.npmjs.org/sonarqube-scanner/-/sonarqube-scanner-3.3.0.tgz",
|
|
5877
|
-
"integrity": "sha512-G1A6nXT3GwoK5eRwHfFrR/7ThiDfaRefWPIFQ+ifwFOQ/V9OwziLpZBdWZgmZp21kBRnzAMvjcTzgZMqGBXQKA==",
|
|
5878
|
-
"dev": true,
|
|
5879
|
-
"requires": {
|
|
5880
|
-
"adm-zip": "^0.5.10",
|
|
5881
|
-
"fancy-log": "^2.0.0",
|
|
5882
|
-
"https-proxy-agent": "^7.0.1",
|
|
5883
|
-
"jest-sonar-reporter": "^2.0.0",
|
|
5884
|
-
"mkdirp": "^3.0.1",
|
|
5885
|
-
"node-downloader-helper": "^2.1.9",
|
|
5886
|
-
"progress": "^2.0.3",
|
|
5887
|
-
"shell-quote": "^1.8.1",
|
|
5888
|
-
"slugify": "^1.6.6"
|
|
5889
|
-
},
|
|
5890
|
-
"dependencies": {
|
|
5891
|
-
"agent-base": {
|
|
5892
|
-
"version": "7.1.0",
|
|
5893
|
-
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
|
|
5894
|
-
"integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
|
|
5895
|
-
"dev": true,
|
|
5896
|
-
"requires": {
|
|
5897
|
-
"debug": "^4.3.4"
|
|
5898
|
-
}
|
|
5899
|
-
},
|
|
5900
|
-
"https-proxy-agent": {
|
|
5901
|
-
"version": "7.0.4",
|
|
5902
|
-
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz",
|
|
5903
|
-
"integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==",
|
|
5904
|
-
"dev": true,
|
|
5905
|
-
"requires": {
|
|
5906
|
-
"agent-base": "^7.0.2",
|
|
5907
|
-
"debug": "4"
|
|
5908
|
-
}
|
|
5909
|
-
},
|
|
5910
|
-
"mkdirp": {
|
|
5911
|
-
"version": "3.0.1",
|
|
5912
|
-
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
|
|
5913
|
-
"integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
|
|
5914
|
-
"dev": true
|
|
5915
|
-
}
|
|
5916
|
-
}
|
|
5917
|
-
},
|
|
5918
5826
|
"source-map": {
|
|
5919
5827
|
"version": "0.6.1",
|
|
5920
5828
|
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
|
@@ -6479,12 +6387,6 @@
|
|
|
6479
6387
|
"resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz",
|
|
6480
6388
|
"integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g=="
|
|
6481
6389
|
},
|
|
6482
|
-
"xml": {
|
|
6483
|
-
"version": "1.0.1",
|
|
6484
|
-
"resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
|
|
6485
|
-
"integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==",
|
|
6486
|
-
"dev": true
|
|
6487
|
-
},
|
|
6488
6390
|
"xml-name-validator": {
|
|
6489
6391
|
"version": "4.0.0",
|
|
6490
6392
|
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zohodesk/testinglibrary",
|
|
3
|
-
"version": "0.1.8-eslint-
|
|
3
|
+
"version": "0.1.8-eslint-28",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./build/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
"@babel/polyfill": "7.12.1",
|
|
51
51
|
"@babel/preset-env": "7.22.15",
|
|
52
52
|
"@babel/runtime": "7.22.15",
|
|
53
|
-
"commander": "^11.0.0"
|
|
53
|
+
"commander": "^11.0.0",
|
|
54
|
+
"sonarqube-scanner": "^3.3.0"
|
|
54
55
|
}
|
|
55
56
|
}
|
package/.vscode/settings.json
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{}
|
|
Binary file
|