Add some statistics stuff
This commit is contained in:
1 parent
4e1a80ac67
commit
82229dace9
9 files changed
+780
-3
No files matched your search
@@ -5,6 +5,7 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "node --test",
|
"test": "node --test",
|
||||||
"update:products": "node scripts/update-products-from-issues.mjs",
|
"update:products": "node scripts/update-products-from-issues.mjs",
|
||||||
|
"update:statistics": "node scripts/generate-release-statistics.mjs",
|
||||||
"update:fixtures": "node scripts/generate-rendered-fixtures.mjs",
|
"update:fixtures": "node scripts/generate-rendered-fixtures.mjs",
|
||||||
"update:generated": "node scripts/refresh-generated-data.mjs",
|
"update:generated": "node scripts/refresh-generated-data.mjs",
|
||||||
"vendor:marked": "mkdir -p web/vendor && cp node_modules/marked/lib/marked.esm.js web/vendor/marked.esm.js"
|
"vendor:marked": "mkdir -p web/vendor && cp node_modules/marked/lib/marked.esm.js web/vendor/marked.esm.js"
|
||||||
|
|||||||
@@ -0,0 +1,174 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
import { mkdir, writeFile } from 'node:fs/promises';
|
||||||
|
import { dirname, join, resolve } from 'node:path';
|
||||||
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
||||||
|
import { collectIssueFiles } from './update-products-from-issues.mjs';
|
||||||
|
|
||||||
|
const REPO_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
||||||
|
const VERSION_RE = /^(?<major>\d+)(?:\.(?<minor>\d+))?(?:\.(?<patch>\d+))?(?<rest>.*)$/;
|
||||||
|
const HOTFIX_RE = /-h\d+(?:\D|$)/i;
|
||||||
|
|
||||||
|
function compareNumbers(left, right) {
|
||||||
|
return Number(left) - Number(right);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function buildReleaseStatistics(records) {
|
||||||
|
const products = new Map();
|
||||||
|
|
||||||
|
for (const { product, version } of records) {
|
||||||
|
const match = VERSION_RE.exec(version);
|
||||||
|
if (!match?.groups.minor) continue;
|
||||||
|
|
||||||
|
const productVersions = products.get(product) ?? new Set();
|
||||||
|
productVersions.add(version);
|
||||||
|
products.set(product, productVersions);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Array.from(products, ([product, versions]) => {
|
||||||
|
const majors = new Map();
|
||||||
|
|
||||||
|
for (const version of versions) {
|
||||||
|
const { major, minor, patch } = VERSION_RE.exec(version).groups;
|
||||||
|
const majorNode = majors.get(major) ?? { version: major, releases: 0, minors: new Map() };
|
||||||
|
const minorVersion = `${major}.${minor}`;
|
||||||
|
const minorNode = majorNode.minors.get(minor) ?? {
|
||||||
|
version: minorVersion,
|
||||||
|
releases: 0,
|
||||||
|
patches: new Map()
|
||||||
|
};
|
||||||
|
|
||||||
|
majorNode.releases += 1;
|
||||||
|
minorNode.releases += 1;
|
||||||
|
|
||||||
|
if (patch !== undefined) {
|
||||||
|
const patchVersion = `${minorVersion}.${patch}`;
|
||||||
|
const patchNode = minorNode.patches.get(patch) ?? {
|
||||||
|
version: patchVersion,
|
||||||
|
hotfixes: 0
|
||||||
|
};
|
||||||
|
if (HOTFIX_RE.test(version)) patchNode.hotfixes += 1;
|
||||||
|
minorNode.patches.set(patch, patchNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
majorNode.minors.set(minor, minorNode);
|
||||||
|
majors.set(major, majorNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
product,
|
||||||
|
releases: versions.size,
|
||||||
|
majors: Array.from(majors.values())
|
||||||
|
.sort((a, b) => compareNumbers(b.version, a.version))
|
||||||
|
.map(major => ({
|
||||||
|
...major,
|
||||||
|
minors: Array.from(major.minors.values())
|
||||||
|
.sort((a, b) => compareNumbers(b.version.split('.')[1], a.version.split('.')[1]))
|
||||||
|
.map(minor => ({
|
||||||
|
...minor,
|
||||||
|
patches: Array.from(minor.patches.values())
|
||||||
|
.sort((a, b) => compareNumbers(
|
||||||
|
b.version.split('.')[2],
|
||||||
|
a.version.split('.')[2]
|
||||||
|
))
|
||||||
|
}))
|
||||||
|
}))
|
||||||
|
};
|
||||||
|
}).sort((a, b) => a.product.localeCompare(b.product));
|
||||||
|
}
|
||||||
|
|
||||||
|
function escapeHtml(value) {
|
||||||
|
return String(value)
|
||||||
|
.replaceAll('&', '&')
|
||||||
|
.replaceAll('<', '<')
|
||||||
|
.replaceAll('>', '>')
|
||||||
|
.replaceAll('"', '"')
|
||||||
|
.replaceAll("'", ''');
|
||||||
|
}
|
||||||
|
|
||||||
|
function plural(count, singular, pluralForm = `${singular}s`) {
|
||||||
|
return `${count.toLocaleString('en-US')} ${count === 1 ? singular : pluralForm}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderProduct({ product, releases, majors }, productIndex) {
|
||||||
|
const rows = majors.flatMap((major, majorIndex) => {
|
||||||
|
const majorId = `p${productIndex}-major-${majorIndex}`;
|
||||||
|
return [
|
||||||
|
`<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="${majorId}"><span class="version-label">${major.version}</span></button></th><td>${plural(major.releases, 'release')}</td></tr>`,
|
||||||
|
...major.minors.flatMap((minor, minorIndex) => {
|
||||||
|
const minorId = `${majorId}-minor-${minorIndex}`;
|
||||||
|
return [
|
||||||
|
`<tr class="stats-minor" id="${majorId}-${minorIndex}" data-stats-parent="${majorId}" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="${minorId}"><span class="version-label">${minor.version}</span></button></th><td>${plural(minor.releases, 'release')}</td></tr>`,
|
||||||
|
...minor.patches.map(patch =>
|
||||||
|
`<tr class="stats-patch" data-stats-parent="${minorId}" hidden><th scope="row"><span class="version-label">${patch.version}</span></th><td>${plural(patch.hotfixes, 'hotfix', 'hotfixes')}</td></tr>`
|
||||||
|
)
|
||||||
|
];
|
||||||
|
})
|
||||||
|
];
|
||||||
|
}).join('\n');
|
||||||
|
|
||||||
|
return ` <section class="stats-product">
|
||||||
|
<h2>${escapeHtml(product)} <span class="stats-product-total">${plural(releases, 'release')}</span></h2>
|
||||||
|
<div class="stats-table-wrap">
|
||||||
|
<table class="stats-table">
|
||||||
|
<thead><tr><th scope="col">Version</th><th scope="col">Count</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
${rows}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</section>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function renderStatisticsPage(statistics) {
|
||||||
|
return `<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Release statistics - Firewall issues tool</title>
|
||||||
|
<link rel="icon" href="favicon.ico" sizes="any">
|
||||||
|
<link rel="icon" type="image/svg+xml" href="icons/favicon.svg">
|
||||||
|
<link rel="apple-touch-icon" href="apple-touch-icon.png">
|
||||||
|
<link rel="apple-touch-icon-precomposed" href="apple-touch-icon-precomposed.png">
|
||||||
|
<link rel="stylesheet" href="styles.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>Release statistics</h1>
|
||||||
|
<nav class="top-links" aria-label="Primary">
|
||||||
|
<a href="index.html">Issues</a>
|
||||||
|
<a href="statistics.html" aria-current="page">Statistics</a>
|
||||||
|
<a href="process.html">Add data</a>
|
||||||
|
<a href="https://github.com/aaronaxvig/firewallissues" target="_blank" rel="noopener noreferrer">Source code</a>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<main class="statistics-container">
|
||||||
|
<p class="statistics-intro">Unique releases represented in the issue data. Major and minor rows include all releases beneath them; patch rows count hotfix releases.</p>
|
||||||
|
${statistics.map(renderProduct).join('\n')}
|
||||||
|
</main>
|
||||||
|
<script type="module" src="js/statistics.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function generateReleaseStatistics({ issuesDir, outputPath }) {
|
||||||
|
const records = await collectIssueFiles(issuesDir);
|
||||||
|
const statistics = buildReleaseStatistics(records);
|
||||||
|
await mkdir(dirname(outputPath), { recursive: true });
|
||||||
|
await writeFile(outputPath, renderStatisticsPage(statistics), 'utf8');
|
||||||
|
return { products: statistics.length, releases: statistics.reduce((sum, item) => sum + item.releases, 0) };
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function runGenerateStatisticsCli() {
|
||||||
|
const result = await generateReleaseStatistics({
|
||||||
|
issuesDir: join(REPO_ROOT, 'web/data/issues'),
|
||||||
|
outputPath: join(REPO_ROOT, 'web/statistics.html')
|
||||||
|
});
|
||||||
|
console.log(`Generated release statistics for ${result.products} product(s) and ${result.releases} release(s).`);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.argv[1] && import.meta.url === pathToFileURL(resolve(process.argv[1])).href) {
|
||||||
|
await runGenerateStatisticsCli();
|
||||||
|
}
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
import { runUpdateProductsCli } from './update-products-from-issues.mjs';
|
import { runUpdateProductsCli } from './update-products-from-issues.mjs';
|
||||||
import { generateRenderedFixtures } from './generate-rendered-fixtures.mjs';
|
import { generateRenderedFixtures } from './generate-rendered-fixtures.mjs';
|
||||||
|
import { runGenerateStatisticsCli } from './generate-release-statistics.mjs';
|
||||||
|
|
||||||
await runUpdateProductsCli();
|
await runUpdateProductsCli();
|
||||||
|
await runGenerateStatisticsCli();
|
||||||
const fixtureResult = generateRenderedFixtures();
|
const fixtureResult = generateRenderedFixtures();
|
||||||
console.log(`Regenerated ${fixtureResult.fixtures} rendered fixture set(s).`);
|
console.log(`Regenerated ${fixtureResult.fixtures} rendered fixture set(s).`);
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import test from 'node:test';
|
||||||
|
import { buildReleaseStatistics, renderStatisticsPage } from '../scripts/generate-release-statistics.mjs';
|
||||||
|
|
||||||
|
test('counts unique releases at major and minor levels and hotfixes at patch level', () => {
|
||||||
|
const records = [
|
||||||
|
{ product: 'PAN-OS', issueType: 'known', version: '10.1.2' },
|
||||||
|
{ product: 'PAN-OS', issueType: 'addressed', version: '10.1.2' },
|
||||||
|
{ product: 'PAN-OS', issueType: 'addressed', version: '10.1.2-h1' },
|
||||||
|
{ product: 'PAN-OS', issueType: 'addressed', version: '10.1.2-h3' },
|
||||||
|
{ product: 'PAN-OS', issueType: 'addressed', version: '10.1.3' },
|
||||||
|
{ product: 'PAN-OS', issueType: 'known', version: '10.2.1' }
|
||||||
|
];
|
||||||
|
|
||||||
|
const [product] = buildReleaseStatistics(records);
|
||||||
|
assert.equal(product.releases, 5);
|
||||||
|
assert.equal(product.majors[0].releases, 5);
|
||||||
|
assert.equal(product.majors[0].minors[0].version, '10.2');
|
||||||
|
assert.equal(product.majors[0].minors[1].releases, 4);
|
||||||
|
assert.deepEqual(
|
||||||
|
product.majors[0].minors[1].patches.map(({ version, hotfixes }) => ({ version, hotfixes })),
|
||||||
|
[
|
||||||
|
{ version: '10.1.3', hotfixes: 0 },
|
||||||
|
{ version: '10.1.2', hotfixes: 2 }
|
||||||
|
]
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('renders the nested levels into a static HTML page', () => {
|
||||||
|
const html = renderStatisticsPage(buildReleaseStatistics([
|
||||||
|
{ product: 'PAN-OS', issueType: 'addressed', version: '10.1.2-h1' }
|
||||||
|
]));
|
||||||
|
|
||||||
|
assert.match(html, /class="stats-major"/);
|
||||||
|
assert.match(html, /class="stats-minor"[^>]+hidden/);
|
||||||
|
assert.match(html, /class="stats-patch"[^>]+hidden/);
|
||||||
|
assert.match(html, /class="stats-toggle"[^>]+aria-expanded="false"/);
|
||||||
|
assert.match(html, /src="js\/statistics\.js"/);
|
||||||
|
assert.match(html, />1 hotfix</);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pluralizes hotfix counts correctly', () => {
|
||||||
|
const html = renderStatisticsPage(buildReleaseStatistics([
|
||||||
|
{ product: 'PAN-OS', issueType: 'addressed', version: '10.1.2-h1' },
|
||||||
|
{ product: 'PAN-OS', issueType: 'addressed', version: '10.1.2-h2' }
|
||||||
|
]));
|
||||||
|
|
||||||
|
assert.match(html, />2 hotfixes</);
|
||||||
|
assert.doesNotMatch(html, /hotfixs/);
|
||||||
|
});
|
||||||
+3
-1
@@ -15,7 +15,9 @@
|
|||||||
<header>
|
<header>
|
||||||
<h1>Firewall issues tool</h1>
|
<h1>Firewall issues tool</h1>
|
||||||
<nav class="top-links" aria-label="Primary">
|
<nav class="top-links" aria-label="Primary">
|
||||||
<a href="process.html">Add more data</a>
|
<a href="index.html" aria-current="page">Issues</a>
|
||||||
|
<a href="statistics.html">Statistics</a>
|
||||||
|
<a href="process.html">Add data</a>
|
||||||
<a href="https://github.com/aaronaxvig/firewallissues" target="_blank" rel="noopener noreferrer">Source code</a>
|
<a href="https://github.com/aaronaxvig/firewallissues" target="_blank" rel="noopener noreferrer">Source code</a>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
function collapseDescendants(row) {
|
||||||
|
const toggle = row.querySelector('.stats-toggle');
|
||||||
|
if (!toggle) return;
|
||||||
|
|
||||||
|
toggle.setAttribute('aria-expanded', 'false');
|
||||||
|
const group = toggle.getAttribute('aria-controls');
|
||||||
|
document.querySelectorAll(`[data-stats-parent="${group}"]`).forEach(child => {
|
||||||
|
child.hidden = true;
|
||||||
|
collapseDescendants(child);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener('click', event => {
|
||||||
|
const toggle = event.target.closest('.stats-toggle');
|
||||||
|
if (!toggle) return;
|
||||||
|
|
||||||
|
const expanded = toggle.getAttribute('aria-expanded') === 'true';
|
||||||
|
toggle.setAttribute('aria-expanded', String(!expanded));
|
||||||
|
const group = toggle.getAttribute('aria-controls');
|
||||||
|
|
||||||
|
document.querySelectorAll(`[data-stats-parent="${group}"]`).forEach(row => {
|
||||||
|
row.hidden = expanded;
|
||||||
|
if (expanded) collapseDescendants(row);
|
||||||
|
});
|
||||||
|
});
|
||||||
+4
-2
@@ -109,8 +109,10 @@
|
|||||||
<header>
|
<header>
|
||||||
<h1>Process Issues</h1>
|
<h1>Process Issues</h1>
|
||||||
<nav class="top-links" aria-label="Primary">
|
<nav class="top-links" aria-label="Primary">
|
||||||
<a href="index.html">Back to main page</a>
|
<a href="index.html">Issues</a>
|
||||||
<a href="https://github.com/aaronaxvig/firewallissues" target="_blank">Source Code</a>
|
<a href="statistics.html">Statistics</a>
|
||||||
|
<a href="process.html" aria-current="page">Add data</a>
|
||||||
|
<a href="https://github.com/aaronaxvig/firewallissues" target="_blank" rel="noopener noreferrer">Source code</a>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
<main>
|
<main>
|
||||||
|
|||||||
@@ -0,0 +1,353 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Release statistics - Firewall issues tool</title>
|
||||||
|
<link rel="icon" href="favicon.ico" sizes="any">
|
||||||
|
<link rel="icon" type="image/svg+xml" href="icons/favicon.svg">
|
||||||
|
<link rel="apple-touch-icon" href="apple-touch-icon.png">
|
||||||
|
<link rel="apple-touch-icon-precomposed" href="apple-touch-icon-precomposed.png">
|
||||||
|
<link rel="stylesheet" href="styles.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>Release statistics</h1>
|
||||||
|
<nav class="top-links" aria-label="Primary">
|
||||||
|
<a href="index.html">Issues</a>
|
||||||
|
<a href="statistics.html" aria-current="page">Statistics</a>
|
||||||
|
<a href="process.html">Add data</a>
|
||||||
|
<a href="https://github.com/aaronaxvig/firewallissues" target="_blank" rel="noopener noreferrer">Source code</a>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<main class="statistics-container">
|
||||||
|
<p class="statistics-intro">Unique releases represented in the issue data. Major and minor rows include all releases beneath them; patch rows count hotfix releases.</p>
|
||||||
|
<section class="stats-product">
|
||||||
|
<h2>GlobalProtect <span class="stats-product-total">50 releases</span></h2>
|
||||||
|
<div class="stats-table-wrap">
|
||||||
|
<table class="stats-table">
|
||||||
|
<thead><tr><th scope="col">Version</th><th scope="col">Count</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p0-major-0"><span class="version-label">6</span></button></th><td>50 releases</td></tr>
|
||||||
|
<tr class="stats-minor" id="p0-major-0-0" data-stats-parent="p0-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p0-major-0-minor-0"><span class="version-label">6.3</span></button></th><td>13 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.3.3</span></th><td>10 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.3.2</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.3.1</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-minor" id="p0-major-0-1" data-stats-parent="p0-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p0-major-0-minor-1"><span class="version-label">6.2</span></button></th><td>19 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.8</span></th><td>9 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.7</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.6</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.5</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.4</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.3</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.2</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.1</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-minor" id="p0-major-0-2" data-stats-parent="p0-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p0-major-0-minor-2"><span class="version-label">6.1</span></button></th><td>6 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-2" hidden><th scope="row"><span class="version-label">6.1.5</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-2" hidden><th scope="row"><span class="version-label">6.1.4</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-2" hidden><th scope="row"><span class="version-label">6.1.3</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-2" hidden><th scope="row"><span class="version-label">6.1.2</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-2" hidden><th scope="row"><span class="version-label">6.1.1</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-minor" id="p0-major-0-3" data-stats-parent="p0-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p0-major-0-minor-3"><span class="version-label">6.0</span></button></th><td>12 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.11</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.10</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.8</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.7</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.5</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.4</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.3</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.1</span></th><td>0 hotfixes</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="stats-product">
|
||||||
|
<h2>GlobalProtect-Android <span class="stats-product-total">16 releases</span></h2>
|
||||||
|
<div class="stats-table-wrap">
|
||||||
|
<table class="stats-table">
|
||||||
|
<thead><tr><th scope="col">Version</th><th scope="col">Count</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p1-major-0"><span class="version-label">6</span></button></th><td>16 releases</td></tr>
|
||||||
|
<tr class="stats-minor" id="p1-major-0-0" data-stats-parent="p1-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p1-major-0-minor-0"><span class="version-label">6.1</span></button></th><td>10 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.12</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.11</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.10</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.9</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.7</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.6</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.5</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.4</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.0</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-minor" id="p1-major-0-1" data-stats-parent="p1-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p1-major-0-minor-1"><span class="version-label">6.0</span></button></th><td>6 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.12</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.5</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.4</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.3</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.2</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.1</span></th><td>0 hotfixes</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="stats-product">
|
||||||
|
<h2>GlobalProtect-iOS <span class="stats-product-total">14 releases</span></h2>
|
||||||
|
<div class="stats-table-wrap">
|
||||||
|
<table class="stats-table">
|
||||||
|
<thead><tr><th scope="col">Version</th><th scope="col">Count</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p2-major-0"><span class="version-label">6</span></button></th><td>14 releases</td></tr>
|
||||||
|
<tr class="stats-minor" id="p2-major-0-0" data-stats-parent="p2-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p2-major-0-minor-0"><span class="version-label">6.1</span></button></th><td>9 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.11</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.10</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.9</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.7</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.6</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.5</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.4</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.0</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-minor" id="p2-major-0-1" data-stats-parent="p2-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p2-major-0-minor-1"><span class="version-label">6.0</span></button></th><td>5 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.12</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.6</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.5</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.4</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.2</span></th><td>0 hotfixes</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="stats-product">
|
||||||
|
<h2>GlobalProtect-Linux <span class="stats-product-total">15 releases</span></h2>
|
||||||
|
<div class="stats-table-wrap">
|
||||||
|
<table class="stats-table">
|
||||||
|
<thead><tr><th scope="col">Version</th><th scope="col">Count</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p3-major-0"><span class="version-label">6</span></button></th><td>15 releases</td></tr>
|
||||||
|
<tr class="stats-minor" id="p3-major-0-0" data-stats-parent="p3-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p3-major-0-minor-0"><span class="version-label">6.3</span></button></th><td>2 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.3.3</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-minor" id="p3-major-0-1" data-stats-parent="p3-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p3-major-0-minor-1"><span class="version-label">6.2</span></button></th><td>6 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.9</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.8</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.7</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.6</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.1</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.0</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-minor" id="p3-major-0-2" data-stats-parent="p3-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p3-major-0-minor-2"><span class="version-label">6.1</span></button></th><td>5 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-2" hidden><th scope="row"><span class="version-label">6.1.5</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-2" hidden><th scope="row"><span class="version-label">6.1.4</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-2" hidden><th scope="row"><span class="version-label">6.1.3</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-2" hidden><th scope="row"><span class="version-label">6.1.1</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-minor" id="p3-major-0-3" data-stats-parent="p3-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p3-major-0-minor-3"><span class="version-label">6.0</span></button></th><td>2 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.5</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.3</span></th><td>0 hotfixes</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="stats-product">
|
||||||
|
<h2>PAN-OS <span class="stats-product-total">487 releases</span></h2>
|
||||||
|
<div class="stats-table-wrap">
|
||||||
|
<table class="stats-table">
|
||||||
|
<thead><tr><th scope="col">Version</th><th scope="col">Count</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-0"><span class="version-label">12</span></button></th><td>17 releases</td></tr>
|
||||||
|
<tr class="stats-minor" id="p4-major-0-0" data-stats-parent="p4-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-0-minor-0"><span class="version-label">12.1</span></button></th><td>17 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-0-minor-0" hidden><th scope="row"><span class="version-label">12.1.8</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-0-minor-0" hidden><th scope="row"><span class="version-label">12.1.7</span></th><td>2 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-0-minor-0" hidden><th scope="row"><span class="version-label">12.1.6</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-0-minor-0" hidden><th scope="row"><span class="version-label">12.1.5</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-0-minor-0" hidden><th scope="row"><span class="version-label">12.1.4</span></th><td>6 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-0-minor-0" hidden><th scope="row"><span class="version-label">12.1.3</span></th><td>2 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-0-minor-0" hidden><th scope="row"><span class="version-label">12.1.2</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-1"><span class="version-label">11</span></button></th><td>195 releases</td></tr>
|
||||||
|
<tr class="stats-minor" id="p4-major-1-0" data-stats-parent="p4-major-1" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-1-minor-0"><span class="version-label">11.2</span></button></th><td>60 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.13</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.12</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.11</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.10</span></th><td>10 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.9</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.8</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.7</span></th><td>14 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.6</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.5</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.4</span></th><td>15 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.3</span></th><td>2 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.2</span></th><td>2 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.1</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.0</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-minor" id="p4-major-1-1" data-stats-parent="p4-major-1" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-1-minor-1"><span class="version-label">11.1</span></button></th><td>102 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.16</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.15</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.14</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.13</span></th><td>8 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.12</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.11</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.10</span></th><td>13 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.9</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.8</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.7</span></th><td>6 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.6</span></th><td>20 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.5</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.4</span></th><td>15 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.3</span></th><td>7 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.2</span></th><td>9 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.1</span></th><td>2 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.0</span></th><td>4 hotfixes</td></tr>
|
||||||
|
<tr class="stats-minor" id="p4-major-1-2" data-stats-parent="p4-major-1" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-1-minor-2"><span class="version-label">11.0</span></button></th><td>33 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-2" hidden><th scope="row"><span class="version-label">11.0.6</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-2" hidden><th scope="row"><span class="version-label">11.0.5</span></th><td>2 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-2" hidden><th scope="row"><span class="version-label">11.0.4</span></th><td>4 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-2" hidden><th scope="row"><span class="version-label">11.0.3</span></th><td>6 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-2" hidden><th scope="row"><span class="version-label">11.0.2</span></th><td>5 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-2" hidden><th scope="row"><span class="version-label">11.0.1</span></th><td>4 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-2" hidden><th scope="row"><span class="version-label">11.0.0</span></th><td>4 hotfixes</td></tr>
|
||||||
|
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-2"><span class="version-label">10</span></button></th><td>154 releases</td></tr>
|
||||||
|
<tr class="stats-minor" id="p4-major-2-0" data-stats-parent="p4-major-2" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-2-minor-0"><span class="version-label">10.2</span></button></th><td>96 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.18</span></th><td>5 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.16</span></th><td>6 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.15</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.14</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.13</span></th><td>12 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.12</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.11</span></th><td>4 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.10</span></th><td>14 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.9</span></th><td>5 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.8</span></th><td>2 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.7</span></th><td>8 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.6</span></th><td>2 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.5</span></th><td>2 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.4</span></th><td>4 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.3</span></th><td>6 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.2</span></th><td>4 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.1</span></th><td>3 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.0</span></th><td>4 hotfixes</td></tr>
|
||||||
|
<tr class="stats-minor" id="p4-major-2-1" data-stats-parent="p4-major-2" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-2-minor-1"><span class="version-label">10.1</span></button></th><td>40 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.14</span></th><td>10 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.13</span></th><td>2 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.12</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.11</span></th><td>2 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.10</span></th><td>2 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.9</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.8</span></th><td>3 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.7</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.6</span></th><td>4 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.5</span></th><td>2 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.4</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.3</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.2</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.0</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-minor" id="p4-major-2-2" data-stats-parent="p4-major-2" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-2-minor-2"><span class="version-label">10.0</span></button></th><td>18 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.12</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.11</span></th><td>3 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.10</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.9</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.8</span></th><td>4 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.7</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.6</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.5</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.4</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.3</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.2</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.1</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-3"><span class="version-label">9</span></button></th><td>76 releases</td></tr>
|
||||||
|
<tr class="stats-minor" id="p4-major-3-0" data-stats-parent="p4-major-3" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-3-minor-0"><span class="version-label">9.1</span></button></th><td>43 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.19</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.18</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.17</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.16</span></th><td>3 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.15</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.14</span></th><td>4 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.13</span></th><td>4 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.12</span></th><td>4 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.11</span></th><td>4 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.10</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.9</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.8</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.7</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.6</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.5</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.4</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.3</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.2</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.1</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.0</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-minor" id="p4-major-3-1" data-stats-parent="p4-major-3" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-3-minor-1"><span class="version-label">9.0</span></button></th><td>33 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.17</span></th><td>3 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.16</span></th><td>5 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.15</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.14</span></th><td>2 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.13</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.12</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.11</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.10</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.9</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.8</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.7</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.6</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.5</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.4</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.3</span></th><td>2 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.2</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.1</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.0</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-4"><span class="version-label">8</span></button></th><td>45 releases</td></tr>
|
||||||
|
<tr class="stats-minor" id="p4-major-4-0" data-stats-parent="p4-major-4" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-4-minor-0"><span class="version-label">8.1</span></button></th><td>45 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.26</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.25</span></th><td>3 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.24</span></th><td>2 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.23</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.22</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.21</span></th><td>3 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.20</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.19</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.18</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.17</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.16</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.15</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.14</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.13</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.12</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.11</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.10</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.9</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.8</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.7</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.6</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.5</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.4</span></th><td>1 hotfix</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.3</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.2</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.1</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.0</span></th><td>0 hotfixes</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="stats-product">
|
||||||
|
<h2>Prisma Access Agent <span class="stats-product-total">15 releases</span></h2>
|
||||||
|
<div class="stats-table-wrap">
|
||||||
|
<table class="stats-table">
|
||||||
|
<thead><tr><th scope="col">Version</th><th scope="col">Count</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p5-major-0"><span class="version-label">26</span></button></th><td>3 releases</td></tr>
|
||||||
|
<tr class="stats-minor" id="p5-major-0-0" data-stats-parent="p5-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p5-major-0-minor-0"><span class="version-label">26.1</span></button></th><td>3 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p5-major-0-minor-0" hidden><th scope="row"><span class="version-label">26.1.2</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p5-major-0-minor-0" hidden><th scope="row"><span class="version-label">26.1.1</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p5-major-1"><span class="version-label">25</span></button></th><td>12 releases</td></tr>
|
||||||
|
<tr class="stats-minor" id="p5-major-1-0" data-stats-parent="p5-major-1" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p5-major-1-minor-0"><span class="version-label">25.7</span></button></th><td>3 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p5-major-1-minor-0" hidden><th scope="row"><span class="version-label">25.7.1</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-minor" id="p5-major-1-1" data-stats-parent="p5-major-1" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p5-major-1-minor-1"><span class="version-label">25.6</span></button></th><td>3 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p5-major-1-minor-1" hidden><th scope="row"><span class="version-label">25.6.2</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p5-major-1-minor-1" hidden><th scope="row"><span class="version-label">25.6.1</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-minor" id="p5-major-1-2" data-stats-parent="p5-major-1" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p5-major-1-minor-2"><span class="version-label">25.4</span></button></th><td>1 release</td></tr>
|
||||||
|
<tr class="stats-minor" id="p5-major-1-3" data-stats-parent="p5-major-1" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p5-major-1-minor-3"><span class="version-label">25.3</span></button></th><td>4 releases</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p5-major-1-minor-3" hidden><th scope="row"><span class="version-label">25.3.1</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-patch" data-stats-parent="p5-major-1-minor-3" hidden><th scope="row"><span class="version-label">25.3.0</span></th><td>0 hotfixes</td></tr>
|
||||||
|
<tr class="stats-minor" id="p5-major-1-4" data-stats-parent="p5-major-1" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p5-major-1-minor-4"><span class="version-label">25.1</span></button></th><td>1 release</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
<script type="module" src="js/statistics.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
+168
@@ -34,6 +34,13 @@ header {
|
|||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.top-links a[aria-current="page"] {
|
||||||
|
color: #ffffff;
|
||||||
|
font-weight: 700;
|
||||||
|
text-decoration: underline;
|
||||||
|
text-underline-offset: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
@@ -211,6 +218,167 @@ li:hover {
|
|||||||
background-color: #f0f0f0;
|
background-color: #f0f0f0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.statistics-container {
|
||||||
|
width: min(900px, calc(100% - 40px));
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 28px 0 48px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.statistics-intro {
|
||||||
|
margin: 0 0 28px;
|
||||||
|
color: #4e5d6c;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-product {
|
||||||
|
margin-top: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-product h2 {
|
||||||
|
display: flex;
|
||||||
|
align-items: baseline;
|
||||||
|
gap: 12px;
|
||||||
|
margin: 0 0 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-product-total {
|
||||||
|
color: #667788;
|
||||||
|
font-size: 0.65em;
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-table-wrap {
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-table {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
border: 1px solid #ccd4dc;
|
||||||
|
background: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-table th,
|
||||||
|
.stats-table td {
|
||||||
|
border-bottom: 1px solid #dce2e8;
|
||||||
|
padding: 9px 14px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-table thead th {
|
||||||
|
background: #2c3e50;
|
||||||
|
color: #ffffff;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
letter-spacing: 0.04em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-table td {
|
||||||
|
width: 180px;
|
||||||
|
color: #526272;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-table tbody th {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-table tr[hidden] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-toggle {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
width: 100%;
|
||||||
|
border: 0;
|
||||||
|
padding: 0;
|
||||||
|
background: transparent;
|
||||||
|
color: inherit;
|
||||||
|
cursor: pointer;
|
||||||
|
font: inherit;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-toggle::before {
|
||||||
|
width: 18px;
|
||||||
|
color: #617588;
|
||||||
|
content: "▶";
|
||||||
|
font-size: 0.65rem;
|
||||||
|
transform-origin: center;
|
||||||
|
transition: transform 120ms ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-toggle[aria-expanded="true"]::before {
|
||||||
|
transform: rotate(90deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-toggle:hover .version-label,
|
||||||
|
.stats-toggle:focus-visible .version-label {
|
||||||
|
text-decoration: underline;
|
||||||
|
text-underline-offset: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-toggle:focus-visible {
|
||||||
|
outline: 2px solid #2c7be5;
|
||||||
|
outline-offset: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-major th,
|
||||||
|
.stats-major td {
|
||||||
|
background: #e7edf2;
|
||||||
|
color: #22313f;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-minor th,
|
||||||
|
.stats-minor td {
|
||||||
|
background: #f5f7f9;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-minor .version-label {
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-patch th::before {
|
||||||
|
position: absolute;
|
||||||
|
color: #91a0ad;
|
||||||
|
content: "└";
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-patch .version-label {
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: 58px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-patch th::before {
|
||||||
|
left: 44px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 600px) {
|
||||||
|
.statistics-container {
|
||||||
|
width: min(100% - 24px, 900px);
|
||||||
|
padding-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-product h2 {
|
||||||
|
align-items: flex-start;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-table th,
|
||||||
|
.stats-table td {
|
||||||
|
padding: 8px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-table td {
|
||||||
|
width: 120px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@media (max-width: 900px) {
|
@media (max-width: 900px) {
|
||||||
.container {
|
.container {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|||||||
Reference in new issue
Block a user